<div dir="ltr">Hi Hans,<div><br></div><div>This fixes a latent bug which will be present in 3.8, and potentially affects a case in Spec CPU 2006. It is low risk and an obvious bugfix.</div><div><br></div><div>Could I please nominate this for inclusion in 3.8?</div><div><br></div><div>James<br><br><div class="gmail_quote"><div dir="ltr">On Mon, 25 Jan 2016 at 14:53 James Molloy via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: jamesm<br>
Date: Mon Jan 25 08:49:36 2016<br>
New Revision: 258690<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=258690&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=258690&view=rev</a><br>
Log:<br>
[DemandedBits] Fix computation of demanded bits for ICmps<br>
<br>
The computation of ICmp demanded bits is independent of the individual operand being evaluated. We simply return a mask consisting of the minimum leading zeroes of both operands.<br>
<br>
We were incorrectly passing "I" to ComputeKnownBits - this should be "UserI->getOperand(0)". In cases where we were evaluating the 1th operand, we were taking the minimum leading zeroes of it and itself.<br>
<br>
This should fix PR26266.<br>
<br>
Modified:<br>
    llvm/trunk/lib/Analysis/DemandedBits.cpp<br>
    llvm/trunk/test/Analysis/DemandedBits/basic.ll<br>
<br>
Modified: llvm/trunk/lib/Analysis/DemandedBits.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/DemandedBits.cpp?rev=258690&r1=258689&r2=258690&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/DemandedBits.cpp?rev=258690&r1=258689&r2=258690&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Analysis/DemandedBits.cpp (original)<br>
+++ llvm/trunk/lib/Analysis/DemandedBits.cpp Mon Jan 25 08:49:36 2016<br>
@@ -244,7 +244,7 @@ void DemandedBits::determineLiveOperandB<br>
     break;<br>
   case Instruction::ICmp:<br>
     // Count the number of leading zeroes in each operand.<br>
-    ComputeKnownBits(BitWidth, I, UserI->getOperand(1));<br>
+    ComputeKnownBits(BitWidth, UserI->getOperand(0), UserI->getOperand(1));<br>
     auto NumLeadingZeroes = std::min(KnownZero.countLeadingOnes(),<br>
                                      KnownZero2.countLeadingOnes());<br>
     AB = ~APInt::getHighBitsSet(BitWidth, NumLeadingZeroes);<br>
<br>
Modified: llvm/trunk/test/Analysis/DemandedBits/basic.ll<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/DemandedBits/basic.ll?rev=258690&r1=258689&r2=258690&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/DemandedBits/basic.ll?rev=258690&r1=258689&r2=258690&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/test/Analysis/DemandedBits/basic.ll (original)<br>
+++ llvm/trunk/test/Analysis/DemandedBits/basic.ll Mon Jan 25 08:49:36 2016<br>
@@ -24,11 +24,20 @@ define i1 @test_icmp1(i32 %a, i32 %b) {<br>
<br>
 ; CHECK-LABEL: 'test_icmp2'<br>
 ; CHECK-DAG: DemandedBits: 0x1 for   %3 = icmp eq i32 %1, %2<br>
-; CHECK-DAG: DemandedBits: 0xFF for   %1 = and i32 %a, 255<br>
-; CHECK-DAG: DemandedBits: 0xF for   %2 = ashr i32 %1, 4<br>
+; CHECK-DAG: DemandedBits: 0xFFF for   %1 = and i32 %a, 255<br>
+; CHECK-DAG: DemandedBits: 0xFF for   %2 = ashr i32 %1, 4<br>
 define i1 @test_icmp2(i32 %a, i32 %b) {<br>
   %1 = and i32 %a, 255<br>
   %2 = ashr i32 %1, 4<br>
   %3 = icmp eq i32 %1, %2<br>
   ret i1 %3<br>
 }<br>
+<br>
+; CHECK-LABEL: 'test_icmp3'<br>
+; CHECK-DAG: DemandedBits: 0xFFFFFFFF for   %1 = and i32 %a, 255<br>
+; CHECK-DAG: DemandedBits: 0x1 for   %2 = icmp eq i32 -1, %1<br>
+define i1 @test_icmp3(i32 %a) {<br>
+  %1 = and i32 %a, 255<br>
+  %2 = icmp eq i32 -1, %1<br>
+  ret i1 %2<br>
+}<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div></div></div>