Add a couple of missed optimizations on integer vectors. Multiply and divide

by 1, as well as multiply by -1.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60182 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Nick Lewycky 2008-11-27 20:21:08 +00:00
parent 9918fb5631
commit 895f085385
3 changed files with 44 additions and 6 deletions

View File

@ -2576,12 +2576,21 @@ Instruction *InstCombiner::visitMul(BinaryOperator &I) {
} 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 (ConstantVector *Op1V = dyn_cast<ConstantVector>(Op1)) {
if (Op1V->isAllOnesValue()) // X * -1 == 0 - X
return BinaryOperator::CreateNeg(Op0, I.getName());
// As above, vector X*splat(1.0) -> X in all defined cases.
if (Constant *Splat = Op1V->getSplatValue()) {
if (ConstantFP *F = dyn_cast<ConstantFP>(Splat))
if (F->isExactlyValue(1.0))
return ReplaceInstUsesWith(I, Op0);
if (ConstantInt *CI = dyn_cast<ConstantInt>(Splat))
if (CI->equalsInt(1))
return ReplaceInstUsesWith(I, Op0);
}
}
}
if (BinaryOperator *Op0I = dyn_cast<BinaryOperator>(Op0))
@ -2856,6 +2865,13 @@ Instruction *InstCombiner::commonIDivTransforms(BinaryOperator &I) {
if (I.getType() == Type::Int1Ty)
return ReplaceInstUsesWith(I, Op0);
if (ConstantVector *Op1V = dyn_cast<ConstantVector>(Op1)) {
if (ConstantInt *X = cast_or_null<ConstantInt>(Op1V->getSplatValue()))
// div X, 1 == X
if (X->isOne())
return ReplaceInstUsesWith(I, Op0);
}
return 0;
}

View File

@ -0,0 +1,11 @@
; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep div
define <2 x i8> @f(<2 x i8> %x) {
%A = udiv <2 x i8> %x, <i8 1, i8 1>
ret <2 x i8> %A
}
define <2 x i8> @g(<2 x i8> %x) {
%A = sdiv <2 x i8> %x, <i8 1, i8 1>
ret <2 x i8> %A
}

View File

@ -0,0 +1,11 @@
; RUN: llvm-as < %s | opt -instcombine | llvm-dis | not grep mul
define <2 x i8> @f(<2 x i8> %x) {
%A = mul <2 x i8> %x, <i8 1, i8 1>
ret <2 x i8> %A
}
define <2 x i8> @g(<2 x i8> %x) {
%A = mul <2 x i8> %x, <i8 -1, i8 -1>
ret <2 x i8> %A
}