diff options
Diffstat (limited to 'llvm/lib/Transforms/Scalar/InstructionCombining.cpp')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/InstructionCombining.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp index eebb7cf82f5..bdea6e40d21 100644 --- a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp @@ -2480,10 +2480,17 @@ Instruction *InstCombiner::visitMul(BinaryOperator &I) { // "In IEEE floating point, x*1 is not equivalent to x for nans. However, // ANSI says we can drop signals, so we can do this anyway." (from GCC) - // We need a better interface for long double here. - if (Op1->getType() == Type::FloatTy || Op1->getType() == Type::DoubleTy) - if (Op1F->isExactlyValue(1.0)) - return ReplaceInstUsesWith(I, Op0); // Eliminate 'mul double %X, 1.0' + if (Op1F->isExactlyValue(1.0)) + return ReplaceInstUsesWith(I, Op0); // Eliminate 'mul double %X, 1.0' + } else if (isa<VectorType>(Op1->getType())) { + if (isa<ConstantAggregateZero>(Op1)) + return ReplaceInstUsesWith(I, Op1); + + // As above, vector X*splat(1.0) -> X in all defined cases. + if (ConstantVector *Op1V = dyn_cast<ConstantVector>(Op1)) + if (ConstantFP *F = dyn_cast_or_null<ConstantFP>(Op1V->getSplatValue())) + if (F->isExactlyValue(1.0)) + return ReplaceInstUsesWith(I, Op0); } if (BinaryOperator *Op0I = dyn_cast<BinaryOperator>(Op0)) @@ -11636,3 +11643,4 @@ FunctionPass *llvm::createInstructionCombiningPass() { return new InstCombiner(); } + |

