mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-27 14:45:50 +00: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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@15291 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2311d717f8
commit
71698285e8
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user