[llvm-commits] [llvm] r168931 - in /llvm/trunk: include/llvm/Target/TargetTransformImpl.h include/llvm/TargetTransformInfo.h lib/Target/X86/X86ISelLowering.cpp lib/Target/X86/X86ISelLowering.h lib/Target/X86/X86TargetMachine.h lib/Transforms/Scalar/LoopIdiomRecognize.cpp test/Transforms/LoopIdiom/popcnt.ll
Duncan Sands
baldrick at free.fr
Fri Dec 7 21:52:00 PST 2012
Hi Shuxin,
> Thank you for pointing out the problem. Yes, the "&&" should be replaced with
> "||".
> I will commit the fix after some tests. I don't feel like to include a testing
> case for
> such inadvertent bug.
this sounds backwards to me. Doesn't the fact your testing didn't catch this
prove the need for a test case? But maybe I misunderstood you, and you do plan
to add a test for this?
Ciao, Duncan.
>
> Following is the contrived *.ll to reproduce the problem.
>
>
> /the/path/to/opt -loop-idiom -mtriple=x86_64-apple-darwin -mcpu=corei7 a.ll
> -S -o -
>
> cat a.ll
>
> target triple = "x86_64-apple-macosx10.8.0"
>
> define i32 @PopCnt(i64 %a) nounwind uwtable readnone ssp {
> entry:
> %tobool3 = icmp eq i64 %a, 0
> br i1 %tobool3, label %while.end, label %while.body
>
> while.body: ; preds = %entry, %while.body
> %c.05 = phi i32 [ %inc, %while.body ], [ 0, %entry ]
> %a.addr.04 = phi i64 [ %and, %while.body ], [ %a, %entry ]
> %t = add i32 %c.05, %c.05
> %inc = add nsw i32 %t, 1
> %sub = add i64 %a.addr.04, -1
> %and = and i64 %sub, %a.addr.04
> %tobool = icmp eq i64 %and, 0
> br i1 %tobool, label %while.end, label %while.body
>
> while.end: ; preds = %while.body, %entry
> %c.0.lcssa = phi i32 [ 0, %entry ], [ %inc, %while.body ]
> ret i32 %c.0.lcssa
> }
>
>
>
>
>
>> This is incorrect, and will crash LLVM on certain inputs: if InitConst is null
>> here, we pass the test and pass it to CreateAdd below that eventually
>> segfaults. Please fix, and please add a test case for this case. I spotted it
>> by inspection (after some code in the wild crashed). I can try to help you
>> with a testcase if you need, but it should be quite straight forward to
>> synthesize one.
>> -------
>>
>> Here is the snippet regarding the other one I spotted by inspection:
>> ----
>>
>> + PHINode *Phi = dyn_cast<PHINode>(Inst->getOperand(0));
>> + if (!Phi && Phi->getParent() != LoopEntry)
>>
>>
>>
>
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
More information about the llvm-commits
mailing list