[LLVMdev] L->isLoopInvariant giving wrong results?

Sreeraj a writetosrj at gmail.com
Wed Nov 17 13:38:51 PST 2010


Thanks Chris,

I was able to weed out loop invariant arithmetic instructions using
isLoopInvariant function.
 when i try to do an instruction->moveBefore(bb->getTerminator()) i'm
getting a seg fault.
any obvious reasons that i'm missing out on?

Thanks in advance

On Wed, Nov 17, 2010 at 10:41 PM, Chris Lattner <clattner at apple.com> wrote:

>
> On Nov 17, 2010, at 2:20 AM, Sreeraj a wrote:
>
> > Hi,
> > I'm trying to write a simple pass to print out Loop invariant
> instructions, using the
> > Loop::isLoopInvariant(Instruction *I)
> > function. it is giving me false value on instructions which should be
> loop invariant.
> >
> > the code i am using is:
>
> The isLoopInvariant method just works for scalar operations like 'add' and
> 'multiply'.  It doesn't apply to memory operations, because hoisting them
> requires more analysis (e.g. mod-ref analysis for the rest of the loop).
>  Please see the LICM pass to see how to do this.
>
> -Chris
>
> >
> > bool MyLoopPass::runOnLoop(Loop * L, LPPassManager &lpm){
> >       BasicBlock* lat=L->getLoopLatch();
> >       for (BasicBlock::iterator i = lat->begin(), e = lat->end(); i != e;
> ++i){
> >         Instruction* hijk= i;
> >         if(L->isLoopInvariant(hijk))
> >           errs() << "hurray " << *hijk << " is loop invariant\n";
> >         else
> >           errs() << "bad luck\n";
> >        }
> >        return false;
> > }
> >
> > the loop latch prints as:
> > bb:                                               ; preds = %bb1
> >   store i32 21, i32* %ij, align 4
> >   store i32 10, i32* %j, align 4
> >   %0 = load i32* %i, align 4
> >   %1 = call i32 (i8*, ...)* @printf(i8* noalias getelementptr inbounds
> ([4 x i8]* @.str, i32 0, i32 0), i32 %0) nounwind
> >   %2 = load i32* %i, align 4
> >   %3 = sub nsw i32 %2, 1
> >   store i32 %3, i32* %i, align 4
> >   br label %bb1
> >
> > the first instruction "  store i32 21, i32* %ij, align 4"
> > is clearly loop invariant (corresponds to j=10; in c-code)
> > but all i am getting is "bad luck".
> >
> > am i doing something wrong here? or is the function incomplete/wrong?
> >
> > _______________________________________________
> > LLVM Developers mailing list
> > LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20101118/22da45a9/attachment.html>


More information about the llvm-dev mailing list