1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 03:33:20 +01:00

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
This commit is contained in:
Robert Bocchino 2004-07-27 21:02:21 +00:00
parent af0decf1d9
commit 4325ca6606

View File

@ -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);