Enhance analysis of srem.
authorNick Lewycky <nicholas@mxc.ca>
Sat, 12 Jul 2008 05:04:38 +0000 (05:04 +0000)
committerNick Lewycky <nicholas@mxc.ca>
Sat, 12 Jul 2008 05:04:38 +0000 (05:04 +0000)
Remove dead code analyzing urem. 'urem' of power-of-2 is canonicalized to an
'and' instruction.

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

lib/Transforms/Scalar/InstructionCombining.cpp
test/Transforms/InstCombine/2008-07-11-RemAnd.ll [new file with mode: 0644]

index 5864a62677778c674ecf46d5ecc06a452ecb71c0..20580e30ab47d1b4aeb641f14dbb2566769afc00 100644 (file)
@@ -1254,6 +1254,9 @@ bool InstCombiner::SimplifyDemandedBits(Value *V, APInt DemandedMask,
     if (ConstantInt *Rem = dyn_cast<ConstantInt>(I->getOperand(1))) {
       APInt RA = Rem->getValue();
       if (RA.isPowerOf2() || (-RA).isPowerOf2()) {
+        if (DemandedMask.ule(RA))    // srem won't affect demanded bits
+          return UpdateValueUsesWith(I, I->getOperand(0));
+
         APInt LowBits = RA.isStrictlyPositive() ? (RA - 1) : ~RA;
         APInt Mask2 = LowBits | APInt::getSignBit(BitWidth);
         if (SimplifyDemandedBits(I->getOperand(0), Mask2,
@@ -1273,21 +1276,6 @@ bool InstCombiner::SimplifyDemandedBits(Value *V, APInt DemandedMask,
     }
     break;
   case Instruction::URem: {
-    if (ConstantInt *Rem = dyn_cast<ConstantInt>(I->getOperand(1))) {
-      APInt RA = Rem->getValue();
-      if (RA.isPowerOf2()) {
-        APInt LowBits = (RA - 1);
-        APInt Mask2 = LowBits & DemandedMask;
-        KnownZero |= ~LowBits & DemandedMask;
-        if (SimplifyDemandedBits(I->getOperand(0), Mask2,
-                                 KnownZero, KnownOne, Depth+1))
-          return true;
-
-        assert((KnownZero & KnownOne) == 0&&"Bits known to be one AND zero?"); 
-        break;
-      }
-    }
-
     APInt KnownZero2(BitWidth, 0), KnownOne2(BitWidth, 0);
     APInt AllOnes = APInt::getAllOnesValue(BitWidth);
     if (SimplifyDemandedBits(I->getOperand(0), AllOnes,
diff --git a/test/Transforms/InstCombine/2008-07-11-RemAnd.ll b/test/Transforms/InstCombine/2008-07-11-RemAnd.ll
new file mode 100644 (file)
index 0000000..0bfd41d
--- /dev/null
@@ -0,0 +1,9 @@
+; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep rem
+; PR2330
+
+define i32 @a(i32 %b) nounwind  {
+entry:
+       srem i32 %b, 8          ; <i32>:0 [#uses=1]
+       and i32 %0, 1           ; <i32>:1 [#uses=1]
+       ret i32 %1
+}