[LLVMdev] Assertion in PHIElimination.cpp

Philipp Brüschweiler blei42 at gmail.com
Wed Jul 4 05:35:21 PDT 2012


Hi everyone

I'm hitting an assertion in PHIElimination.cpp:375.

"Terminator instructions cannot use virtual registers unless"
"they are the first terminator in a block!"

I was looking at the code around that location a bit and have not found
a reason why this assertion has to hold, except for a comment:
      // In our final twist, we have to decide which instruction kills the
      // register.  In most cases this is the copy, however, the first
      // terminator instruction at the end of the block may also use the value.
      // In this case, we should mark *it* as being the killing block, not the
      // copy.

Again, no reason is given why only the first terminator is allowed to
use the register.

The offending code is:

(gdb) p opBlock.dump()
BB#8: derived from LLVM BB %for.cond
    Predecessors according to CFG: BB#7 BB#22 BB#19 BB#16 BB#11 BB#27 BB#26 BB#25 BB#24 BB#23
        %vreg18<def> = COPY %vreg80<kill>; GEXR16:%vreg18,%vreg80
        ADJCALLSTACKDOWN 0, %SP<imp-def>, %EX<imp-def>, %SP<imp-use>
        CALLi <ga:@clock_get_ticks>, <regmask>, %SP<imp-use>, %SP<imp-def>, %A<imp-def>, ...
        ADJCALLSTACKUP 0, 0, %SP<imp-def>, %EX<imp-def>, %SP<imp-use>
        %vreg57<def> = COPY %A<kill>; GR16:%vreg57
        %vreg58<def> = SUB16rr %vreg57, %vreg18<kill>, %EX<imp-def>; GR16:%vreg58,%vreg57 GEXR16:%vreg18
        %vreg59<def> = ADD16rm %vreg58<kill>, <fi#1>, 16, %EX<imp-def>; mem:LD1[%sunkaddr21](align=8)(tbaa=!"int") GR16:%vreg59,%vreg58
        MOV16mr <fi#1>, 16, %vreg59; mem:ST1[%sunkaddr21](align=8)(tbaa=!"int") GR16:%vreg59
        %vreg20<def> = COPY %vreg59; GEXR16:%vreg20 GR16:%vreg59
        %vreg21<def> = MOV16rm <fi#1>, 15; mem:LD1[%sunkaddr24](tbaa=!"int") GEXR16:%vreg21
        %vreg81<def> = COPY %vreg21; GEXR16:%vreg81,%vreg21
        BR_CCrr 2, %vreg59, %vreg21, <BB#10>; GR16:%vreg59 GEXR16:%vreg21
        BR_CCrr 7, %vreg59<kill>, %vreg21, <BB#10>; GR16:%vreg59 GEXR16:%vreg21
        JMP <BB#9>
    Successors according to CFG: BB#9 BB#10

Note the two BR_CCrr instructions in the end, those are the
terminators. %vreg21 is the register that is about to be killed.

In my opinion, the correct thing to do would be to mark the register in
the second BR_CCrr as killed. Am I missing something?

Cheers
Philipp



More information about the llvm-dev mailing list