Compute demanded bits for icmp instructions
authorJames Molloy <james.molloy@arm.com>
Thu, 8 Oct 2015 12:40:06 +0000 (12:40 +0000)
committerJames Molloy <james.molloy@arm.com>
Thu, 8 Oct 2015 12:40:06 +0000 (12:40 +0000)
Instead of bailing out when we see an icmp, we can instead at least
say that if the upper bits of both operands are known zero, they are
not demanded. This doesn't help with signed comparisons, but it's at
least better than bailing out.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@249687 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/DemandedBits.cpp
test/Analysis/DemandedBits/basic.ll

index 6f92ba6289a4ac5a6676e936e65f095261b7e621..912c5ceb754dd0d78e9f8655e2b17d69e620aa07 100644 (file)
@@ -242,6 +242,13 @@ void DemandedBits::determineLiveOperandBits(
     if (OperandNo != 0)
       AB = AOut;
     break;
+  case Instruction::ICmp:
+    // Count the number of leading zeroes in each operand.
+    ComputeKnownBits(BitWidth, I, UserI->getOperand(1));
+    auto NumLeadingZeroes = std::min(KnownZero.countLeadingOnes(),
+                                     KnownZero2.countLeadingOnes());
+    AB = ~APInt::getHighBitsSet(BitWidth, NumLeadingZeroes);
+    break;
   }
 }
 
index 3fd1b3212883d27ef2b0d54a314913f0530a4064..487e522e9dbc6ea48c375358a291f7c2ecc063ec 100644 (file)
@@ -10,3 +10,25 @@ define i8 @test_mul(i32 %a, i32 %b) {
   %3 = trunc i32 %2 to i8
   ret i8 %3
 }
+
+; CHECK-LABEL: 'test_icmp1'
+; CHECK-DAG: DemandedBits: 0x1 for   %3 = icmp eq i32 %1, %2
+; CHECK-DAG: DemandedBits: 0xFFF for   %1 = and i32 %a, 255
+; CHECK-DAG: DemandedBits: 0xFFF for   %2 = shl i32 %1, 4
+define i1 @test_icmp1(i32 %a, i32 %b) {
+  %1 = and i32 %a, 255
+  %2 = shl i32 %1, 4
+  %3 = icmp eq i32 %1, %2
+  ret i1 %3
+}
+
+; CHECK-LABEL: 'test_icmp2'
+; CHECK-DAG: DemandedBits: 0x1 for   %3 = icmp eq i32 %1, %2
+; CHECK-DAG: DemandedBits: 0xFF for   %1 = and i32 %a, 255
+; CHECK-DAG: DemandedBits: 0xF for   %2 = ashr i32 %1, 4
+define i1 @test_icmp2(i32 %a, i32 %b) {
+  %1 = and i32 %a, 255
+  %2 = ashr i32 %1, 4
+  %3 = icmp eq i32 %1, %2
+  ret i1 %3
+}