summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
diff options
context:
space:
mode:
authorRobert Bocchino <bocchino@illinois.edu>2004-07-27 21:02:21 +0000
committerRobert Bocchino <bocchino@illinois.edu>2004-07-27 21:02:21 +0000
commit7b5b86cd0f696820280fbaae19a0cc6e5d1c59d4 (patch)
treeb3ab6ec0389073c786d6a1cdc2e16f4ab18eabce /llvm/lib/Transforms/Scalar/InstructionCombining.cpp
parent22fddc7d16cf617fd8b6a7ca3943e2bff54daf43 (diff)
downloadbcm5719-llvm-7b5b86cd0f696820280fbaae19a0cc6e5d1c59d4.tar.gz
bcm5719-llvm-7b5b86cd0f696820280fbaae19a0cc6e5d1c59d4.zip
This change fixed a bug in the function visitMul. The prior version
assumed that a constant on the RHS of a multiplication was either an IntConstant or an FPConstant. It checked for an IntConstant and then, if it did not find one, did a hard cast to an FPConstant. That code would crash if the RHS were a ConstantExpr that was neither an IntConstant nor an FPConstant. This version replaces the hard cast with a dyn_cast. It performs the same way for IntConstants and FPConstants but does nothing, instead of crashing, for constant expressions. The regression test for this change is 2004-07-27-ConstantExprMul.ll. llvm-svn: 15291
Diffstat (limited to 'llvm/lib/Transforms/Scalar/InstructionCombining.cpp')
-rw-r--r--llvm/lib/Transforms/Scalar/InstructionCombining.cpp6
1 files changed, 3 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
index 3c46e2c554b..8a797bfe222 100644
--- a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
+++ b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
@@ -509,8 +509,9 @@ Instruction *InstCombiner::visitAdd(BinaryOperator &I) {
}
// X + X --> X << 1
- if (I.getType()->isInteger())
+ if (I.getType()->isInteger()) {
if (Instruction *Result = AssociativeOpt(I, AddRHS(RHS))) return Result;
+ }
// -A + B --> B - A
if (Value *V = dyn_castNegVal(LHS))
@@ -745,8 +746,7 @@ Instruction *InstCombiner::visitMul(BinaryOperator &I) {
if (uint64_t C = Log2(Val)) // Replace X*(2^C) with X << C
return new ShiftInst(Instruction::Shl, Op0,
ConstantUInt::get(Type::UByteTy, C));
- } else {
- ConstantFP *Op1F = cast<ConstantFP>(Op1);
+ } else if (ConstantFP *Op1F = dyn_cast<ConstantFP>(Op1)) {
if (Op1F->isNullValue())
return ReplaceInstUsesWith(I, Op1);
OpenPOWER on IntegriCloud