私はLLVMターゲットバックエンドをデバッグしていますが、特定の基本ブロックが「何も」にジャンプしない、つまり最適化をオンにしてコンパイルされたときに関数の終了直後にジャンプする問題を追いかけています。MachineBasicBlocksは暗黙のうちに後継者に落ちるはずですか?
私が気づいたことの一つは、命令選択後、マシンの基本的なブロックが後継者が、実際にそこにジャンプする無指示を持っていることである。
BB#1: derived from LLVM BB %switch.lookup
Predecessors according to CFG: BB#0
%vreg5<def> = SEXT %vreg2, %SREG<imp-def,dead>; DLDREGS:%vreg5 GPR8:%vreg2
%vreg6<def,tied1> = ANDIWRdK %vreg5<tied0>, -2, %SREG<imp-def,dead>; DLDREGS:%vreg6,%vreg5
%vreg7<def> = LDIWRdK 4; DLDREGS:%vreg7
%vreg8<def> = LDIRdK 0; LD8:%vreg8
%vreg9<def> = LDIRdK 1; LD8:%vreg9
CPWRdRr %vreg6<kill>, %vreg7<kill>, %SREG<imp-def>; DLDREGS:%vreg6,%vreg7
%vreg0<def> = Select8 %vreg9<kill>, %vreg8<kill>, 1, %SREG<imp-use>; GPR8:%vreg0 LD8:%vreg9,%vreg8
Successors according to CFG: BB#2(?%)
私は、x86 LLVMバックエンドと最終結果から同様のISELの結果を参照してくださいこれらのCFG-指定の後継がされる機構は何:
はBB#1: derived from LLVM BB %switch.lookup
Predecessors according to CFG: BB#0
%vreg7<def> = MOVSX32rr8 %vreg3; GR32:%vreg7 GR8:%vreg3
%vreg8<def,tied1> = AND32ri %vreg7<tied0>, 65534, %EFLAGS<imp-def,dead>; GR32:%vreg8,%vreg7
%vreg9<def,tied1> = SUB32ri8 %vreg8<tied0>, 4, %EFLAGS<imp-def>; GR32:%vreg9,%vreg8
%vreg0<def> = SETNEr %EFLAGS<imp-use>; GR8:%vreg0
Successors according to CFG: BB#2(?%)
だから私の質問は:ジャンプ・ツー・虚無を持っているので、私は自分自身で、これを想定していない、問題はありません本当のジャンプに変わったはずだ? x86バックエンドは、私がデバッグしているバックエンドが動作しないように特別な機能を実装していますか?
ISelLowering
クラスをSelect8
に変更して、明示的なジャンプで終わるものにするのか、それとも不要なものにするのか(いくつかの最適化に悪影響を与える可能性があります)、それに必要な他の魔法がありますこれらの暗黙的な後継者は正しく下がっていますか?