summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-02-28 05:49:21 +0000
committerChris Lattner <sabre@nondot.org>2006-02-28 05:49:21 +0000
commitb70f141893266f8e065fec991e271b6cb3708865 (patch)
treeeb53bb3cae8fe7a749ff3414c4201e2a2526f6e1 /llvm/lib
parent3059128d02ca1b5244503e535b424676aeea165e (diff)
downloadbcm5719-llvm-b70f141893266f8e065fec991e271b6cb3708865.tar.gz
bcm5719-llvm-b70f141893266f8e065fec991e271b6cb3708865.zip
Implement rem.ll:test[7-9] and PR712
llvm-svn: 26415
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Transforms/Scalar/InstructionCombining.cpp28
1 files changed, 22 insertions, 6 deletions
diff --git a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
index 3caa4cf10e9..63de8fa2225 100644
--- a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
+++ b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
@@ -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))) {
OpenPOWER on IntegriCloud