MachineBasicBlocks是否应该隐含地落入他们的继任者?

时间:2017-05-06 04:24:12

标签: llvm codegen

我正在调试一个LLVM目标后端,我正在追逐一个问题,其中某个基本块最终跳转到"没有",即刚刚在函数结束之后,当编译时优化已开启。

我注意到的一件事是,在选择指令后,机器基本块有一个后继,但没有指令实际跳转到那里:

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结果,最终结果没有跳转到虚无,所以我认为这本身就不是问题:

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(?%)

所以我的问题是:这些CFG指定的后继者应该变成真正的跳转的机制是什么? x86后端是否实现了一些特殊的功能,后端I& #39; m debuggig不是吗?

我是否应该将ISelLowering类更改为将Select8更改为以明确跳转结束的内容,或者是否是不必要的(可能甚至可能对某些优化有害甚至是有害的)并且我需要做的其他一些魔法,以便正确降低这些隐含的后继者?

1 个答案:

答案 0 :(得分:0)

It is perfectly valid for a MachineBasicBlock to fall through to the next Block

  

这是有效的。想要重新排序基本块的通行证应该只做   因此,如果AnalyzeBranch和相关的目标挂钩(Insert / Remove)允许   它。