mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-08 03:30:22 +00:00
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:
parent
9918fb5631
commit
895f085385
@ -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;
|
||||
}
|
||||
|
||||
|
11
test/Transforms/InstCombine/2008-11-27-IDivVector.ll
Normal file
11
test/Transforms/InstCombine/2008-11-27-IDivVector.ll
Normal 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
|
||||
}
|
11
test/Transforms/InstCombine/2008-11-27-MultiplyIntVec.ll
Normal file
11
test/Transforms/InstCombine/2008-11-27-MultiplyIntVec.ll
Normal 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
|
||||
}
|
Loading…
Reference in New Issue
Block a user