[LLVMbugs] [Bug 1244] NEW: Problem in instructioncombining
bugzilla-daemon at cs.uiuc.edu
bugzilla-daemon at cs.uiuc.edu
Thu Mar 8 19:05:58 PST 2007
http://llvm.org/bugs/show_bug.cgi?id=1244
Summary: Problem in instructioncombining
Product: new-bugs
Version: unspecified
Platform: PC
OS/Version: Linux
Status: NEW
Severity: critical
Priority: P2
Component: new bugs
AssignedTo: unassignedbugs at nondot.org
ReportedBy: wjiang at cs.ucla.edu
hi, I found a bug in TOT (instuction combiner). It tried to optimize (a<b)||
(a=b) to (a<=b), but the new predicate is wrong.
The original code:
%tmp266.i = icmp slt i32 %c.3.i, %d.292.2.i
%tmp276.i = icmp eq i32 %c.3.i, %d.292.2.i
%sel_tmp80 = or i1 %sel_tmp78, %sel_tmp79
New code:
%sel_tmp187.demorgan.i = icmp ule i32 %c.3.i, %d.292.2.i
--(should be sle)--
I looked the source codes, I guess the bug is in these lines:
struct FoldICmpLogical {
Instruction *apply(Instruction &Log) const {
Value *RV = getICmpValue(ICmpInst::isSignedPredicate(pred),
Code, LHS, RHS);
....
}
}
It only looks the second predicate: pred = eq for this example, so it return
non-signed, but actually it's signed because the other preciate is slt. I guess
both predicates should be looked at to get the correct results. I changed the
code locally, it works
Value *RV = getICmpValue(
ICmpInst::isSignedPredicate(ICI->getPredicate())
|| ICmpInst::isSignedPredicate(cast<ICmpInst>(Log.getOperand(1))-
>getPredicate()),
Code, LHS, RHS);
Thanks.
------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.
More information about the llvm-bugs
mailing list