Implement rem.ll:test[7-9] and PR712
authorChris Lattner <sabre@nondot.org>
Tue, 28 Feb 2006 05:49:21 +0000 (05:49 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 28 Feb 2006 05:49:21 +0000 (05:49 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@26415 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/InstructionCombining.cpp

index 3caa4cf10e9ffc74cce5ececafd545dcb80b404d..63de8fa2225f3e20c65533781c1abc6db373043c 100644 (file)
@@ -1867,12 +1867,28 @@ Instruction *InstCombiner::visitRem(BinaryOperator &I) {
       if (isPowerOf2_64(C->getValue()))
         return BinaryOperator::createAnd(Op0, SubOne(C));
 
-    if (SelectInst *SI = dyn_cast<SelectInst>(Op0))
-      if (Instruction *R = FoldOpIntoSelect(I, SI, this))
-        return R;
-    if (isa<PHINode>(Op0))
-      if (Instruction *NV = FoldOpIntoPhi(I))
-        return NV;
+    if (Instruction *Op0I = dyn_cast<Instruction>(Op0)) {
+      if (SelectInst *SI = dyn_cast<SelectInst>(Op0I)) {
+        if (Instruction *R = FoldOpIntoSelect(I, SI, this))
+          return R;
+      } else if (isa<PHINode>(Op0I)) {
+        if (Instruction *NV = FoldOpIntoPhi(I))
+          return NV;
+      } else if (Op0I->getOpcode() == Instruction::Mul) {
+        // X*C1%C2 --> 0  iff  C1%C2 == 0
+        if (ConstantInt *MulRHS = dyn_cast<ConstantInt>(Op0I->getOperand(1))) {
+          if (ConstantExpr::getRem(MulRHS, RHS)->isNullValue())
+            return ReplaceInstUsesWith(I, Constant::getNullValue(I.getType()));
+        }
+      } else if (Op0I->getOpcode() == Instruction::Shl) {
+        // (X<<C1)%C2 --> 0  iff  (1<<C1)%C2 == 0
+        if (Constant *ShRHS = dyn_cast<Constant>(Op0I->getOperand(1))) {
+          ShRHS = ConstantExpr::getShl(ConstantInt::get(I.getType(), 1), ShRHS);
+          if (ConstantExpr::getRem(ShRHS, RHS)->isNullValue())
+            return ReplaceInstUsesWith(I, Constant::getNullValue(I.getType()));
+        }
+      }
+    }
   }
 
   if (Instruction *RHSI = dyn_cast<Instruction>(I.getOperand(1))) {