2

すべての基本ブロックを最小数の命令 (通常は 3 ~ 5) で分割しています。

llvm::SplitBlock(BasicBlock, &*BasicBlockiter, Pass);

IRからオブジェクトファイルを取得しようとしています

llc -filetype=obj 2.ll

次のエラーが発生しました。

Instruction does not dominate all uses!
  %1 = alloca i32
  %mul = load i32* %1
Instruction does not dominate all uses!
  %1 = alloca i32
  %99 = load i32* %1

While deleting: i32 %
Use still stuck around after Def is destroyed:  %var = alloca i32
Assertion failed: use_empty() && "Uses remain when a value is destroyed!"

error: expected instruction opcode
invoke.cont2:                                     ; preds = %main_block, %invoke
.cont

IR:

  invoke.cont2:                                     ; preds = %main_block, %invoke.cont
  %call4 = invoke i32 @_ZStorSt13_Ios_OpenmodeS_(i32 8, i32 16)
          to label %invoke.cont3 unwind label %lpad1
  store i32 %call4, i32* %var4

分割後、命令は別の基本ブロックに配置されていると思います。ブロックを 10 ~ 15 の命令に分割すると、すべて問題ありません。このエラーを予測/確認して回避するにはどうすればよいですか?

4

1 に答える 1

1

最初のバージョンでは、ターミネータ命令の後に命令がありましたが、この命令は決して実行されないため、これは正しくありませんでした。

2番目のバージョン(ここでは言及されていません。プライベートメールの代わりにstackoverflowを使用してください...)は、定義する前に(ストアinstで)%callを使用しています(%call = ...)。使用...しかし、私が言ったように、呼び出しはターミネーターinstであるため、ストアは呼び出しの後にあるべきではありません。

解決策は、ストアを次の基本ブロックに配置することです (新しいブロックを作成できます)。

%invoke.cont
  %call = invoke i8* @_ZNKSs5c_strEv(%"class.std::basic_string"* @loadedFile)
          to label %invoke.cont2_before unwind label %lpad1

invoke.cont2_before:                                     ; preds = %invoke.cont
  store i8* %call, i8** %reduced_var
  br label %invoke.cont2

invoke.cont2:                                     ; preds = %main_block, %invoke.cont2_before
  %call4 = invoke i32 @_ZStorSt13_Ios_OpenmodeS_(i32 8, i32 16)
          to label %invoke.cont3_before unwind label %lpad1

等...

于 2013-11-15T09:43:46.243 に答える