[LLVMdev] LICM ilist question.

Gabor Greif
Tue, 12 Jan 2010 15:22:42 -0000

Hi Gang-Ryung!

Your reverse iteration of instructions in the BB

>    * for (BasicBlock::iterator II = BB->end(); II != BB->begin(); )
*{
>
>                Instruction &I = *--II;
>
>                if (isLoopInvariantInst(I) && canSinkOrHoistInst(I)
&&
>                     isSafeToExecuteUnconditionally(I))
>                    * hoist(I);*
>     }

looks perfectly valid.

If I remember correctly, the (operator--) on Instruction has a buggy
assert, but that should not trigger in your case. (Adding unit tests for
reverse iteration is on my TODO list.)

I suspect that your "hoist(I)" call removes the instruction
"I" from the
BB and puts it into the first position of another basic block. This could
mess up the "II != BB->begin()" test.

Hope this helps!

Cheers,

	Gabor