mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
InstCombine: Propagate exact for (sdiv -X, C) -> (sdiv X, -C)
llvm-svn: 222623
This commit is contained in:
parent
815bb3182b
commit
e3d9e29780
@ -1082,10 +1082,12 @@ Instruction *InstCombiner::visitSDiv(BinaryOperator &I) {
|
||||
return new ZExtInst(Builder->CreateICmpEQ(Op0, Op1), I.getType());
|
||||
|
||||
// -X/C --> X/-C provided the negation doesn't overflow.
|
||||
if (SubOperator *Sub = dyn_cast<SubOperator>(Op0))
|
||||
if (match(Sub->getOperand(0), m_Zero()) && Sub->hasNoSignedWrap())
|
||||
return BinaryOperator::CreateSDiv(Sub->getOperand(1),
|
||||
ConstantExpr::getNeg(RHS));
|
||||
Value *X;
|
||||
if (match(Op0, m_NSWSub(m_Zero(), m_Value(X)))) {
|
||||
auto *BO = BinaryOperator::CreateSDiv(X, ConstantExpr::getNeg(RHS));
|
||||
BO->setIsExact(I.isExact());
|
||||
return BO;
|
||||
}
|
||||
}
|
||||
|
||||
// If the sign bits of both operands are zero (i.e. we can prove they are
|
||||
|
@ -295,3 +295,12 @@ define <2 x i64> @test33(<2 x i64> %x) nounwind {
|
||||
; CHECK-NEXT: udiv exact <2 x i64> %x, <i64 192, i64 192>
|
||||
; CHECK-NEXT: ret <2 x i64>
|
||||
}
|
||||
|
||||
define <2 x i64> @test34(<2 x i64> %x) nounwind {
|
||||
%neg = sub nsw <2 x i64> zeroinitializer, %x
|
||||
%div = sdiv exact <2 x i64> %neg, <i64 3, i64 4>
|
||||
ret <2 x i64> %div
|
||||
; CHECK-LABEL: @test34(
|
||||
; CHECK-NEXT: sdiv exact <2 x i64> %x, <i64 -3, i64 -4>
|
||||
; CHECK-NEXT: ret <2 x i64>
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user