2017-05-06 51 views
0

我正在调试一个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结果没有跳转到虚无,所以我想这一点,就其本身而言,是没有问题的:

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指定的继任者的机制应该变成真正的跳跃S' x86后端是否为此实现了一些特殊的功能,以实现后端我debuggig不工作?

我应该改变我的ISelLowering类降低Select8到的东西,有一个明确的跳结束,或者是不必要的(也许甚至可能有害的一些优化踢),并有一些其他的魔术,我需要做的,这样这些隐含的继承者是否正确降低?

回答

相关问题