[InstCombine] Simplify 1/X for vectors.
llvm-svn: 300439
This commit is contained in:
parent
eee53c030a
commit
218a359fbd
@ -944,22 +944,21 @@ Instruction *InstCombiner::commonIDivTransforms(BinaryOperator &I) {
|
||||
}
|
||||
}
|
||||
|
||||
if (ConstantInt *One = dyn_cast<ConstantInt>(Op0)) {
|
||||
if (One->isOne() && !I.getType()->isIntegerTy(1)) {
|
||||
bool isSigned = I.getOpcode() == Instruction::SDiv;
|
||||
if (isSigned) {
|
||||
// If Op1 is 0 then it's undefined behaviour, if Op1 is 1 then the
|
||||
// result is one, if Op1 is -1 then the result is minus one, otherwise
|
||||
// it's zero.
|
||||
Value *Inc = Builder->CreateAdd(Op1, One);
|
||||
Value *Cmp = Builder->CreateICmpULT(
|
||||
Inc, ConstantInt::get(I.getType(), 3));
|
||||
return SelectInst::Create(Cmp, Op1, ConstantInt::get(I.getType(), 0));
|
||||
} else {
|
||||
// If Op1 is 0 then it's undefined behaviour. If Op1 is 1 then the
|
||||
// result is one, otherwise it's zero.
|
||||
return new ZExtInst(Builder->CreateICmpEQ(Op1, One), I.getType());
|
||||
}
|
||||
if (match(Op0, m_One())) {
|
||||
assert(!I.getType()->getScalarType()->isIntegerTy(1) &&
|
||||
"i1 divide not removed?");
|
||||
if (I.getOpcode() == Instruction::SDiv) {
|
||||
// If Op1 is 0 then it's undefined behaviour, if Op1 is 1 then the
|
||||
// result is one, if Op1 is -1 then the result is minus one, otherwise
|
||||
// it's zero.
|
||||
Value *Inc = Builder->CreateAdd(Op1, Op0);
|
||||
Value *Cmp = Builder->CreateICmpULT(
|
||||
Inc, ConstantInt::get(I.getType(), 3));
|
||||
return SelectInst::Create(Cmp, Op1, ConstantInt::get(I.getType(), 0));
|
||||
} else {
|
||||
// If Op1 is 0 then it's undefined behaviour. If Op1 is 1 then the
|
||||
// result is one, otherwise it's zero.
|
||||
return new ZExtInst(Builder->CreateICmpEQ(Op1, Op0), I.getType());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -227,7 +227,8 @@ define i32 @test19(i32 %x) {
|
||||
|
||||
define <2 x i32> @test19vec(<2 x i32> %x) {
|
||||
; CHECK-LABEL: @test19vec(
|
||||
; CHECK-NEXT: [[A:%.*]] = udiv <2 x i32> <i32 1, i32 1>, [[X:%.*]]
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = icmp eq <2 x i32> [[X:%.*]], <i32 1, i32 1>
|
||||
; CHECK-NEXT: [[A:%.*]] = zext <2 x i1> [[TMP1]] to <2 x i32>
|
||||
; CHECK-NEXT: ret <2 x i32> [[A]]
|
||||
;
|
||||
%A = udiv <2 x i32> <i32 1, i32 1>, %x
|
||||
@ -247,7 +248,9 @@ define i32 @test20(i32 %x) {
|
||||
|
||||
define <2 x i32> @test20vec(<2 x i32> %x) {
|
||||
; CHECK-LABEL: @test20vec(
|
||||
; CHECK-NEXT: [[A:%.*]] = sdiv <2 x i32> <i32 1, i32 1>, [[X:%.*]]
|
||||
; CHECK-NEXT: [[TMP1:%.*]] = add <2 x i32> [[X:%.*]], <i32 1, i32 1>
|
||||
; CHECK-NEXT: [[TMP2:%.*]] = icmp ult <2 x i32> [[TMP1]], <i32 3, i32 3>
|
||||
; CHECK-NEXT: [[A:%.*]] = select <2 x i1> [[TMP2]], <2 x i32> [[X]], <2 x i32> zeroinitializer
|
||||
; CHECK-NEXT: ret <2 x i32> [[A]]
|
||||
;
|
||||
%A = sdiv <2 x i32> <i32 1, i32 1>, %x
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user