From 338bf21006b7b80453ab48cdde669d90d0c3cc3c Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 9 Apr 2019 18:32:38 +0000 Subject: [PATCH] Revert "[InstCombine] [InstCombine] Canonicalize (-X s/ Y) to -(X s/ Y)." This reverts commit 1383a9168948aabfd827220c9445ce0ce5765800. sdiv-canonicalize.ll fails after this revision. The fold needs to be moved outside the branch handling constant operands. However when this is done there are further test changes, so I'm reverting this in the meantime. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@358026 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../InstCombine/InstCombineMulDivRem.cpp | 6 ------ .../InstCombine/sdiv-canonicalize.ll | 18 +++++++++--------- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp b/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp index 2db6e849b19..cb8708446b2 100644 --- a/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp +++ b/lib/Transforms/InstCombine/InstCombineMulDivRem.cpp @@ -1043,12 +1043,6 @@ Instruction *InstCombiner::visitSDiv(BinaryOperator &I) { Value *NarrowOp = Builder.CreateSDiv(Op0Src, NarrowDivisor); return new SExtInst(NarrowOp, Op0->getType()); } - - // -X / Y --> -(X / Y) - Value *Y; - if (match(&I, m_SDiv(m_OneUse(m_NSWSub(m_Zero(), m_Value(X))), m_Value(Y)))) - return BinaryOperator::CreateNSWNeg( - Builder.CreateSDiv(X, Y, I.getName(), I.isExact())); // -X / C --> X / -C (if the negation doesn't overflow). // TODO: This could be enhanced to handle arbitrary vector constants by diff --git a/test/Transforms/InstCombine/sdiv-canonicalize.ll b/test/Transforms/InstCombine/sdiv-canonicalize.ll index 39ba5120ed6..8e1497b900a 100644 --- a/test/Transforms/InstCombine/sdiv-canonicalize.ll +++ b/test/Transforms/InstCombine/sdiv-canonicalize.ll @@ -3,8 +3,8 @@ define i32 @test_sdiv_canonicalize_op0(i32 %x, i32 %y) { ; CHECK-LABEL: @test_sdiv_canonicalize_op0( -; CHECK-NEXT: [[SDIV1:%.*]] = sdiv i32 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[SDIV:%.*]] = sub nsw i32 0, [[SDIV1]] +; CHECK-NEXT: [[NEG:%.*]] = sub nsw i32 0, [[X:%.*]] +; CHECK-NEXT: [[SDIV:%.*]] = sdiv i32 [[NEG]], [[Y:%.*]] ; CHECK-NEXT: ret i32 [[SDIV]] ; %neg = sub nsw i32 0, %x @@ -14,8 +14,8 @@ define i32 @test_sdiv_canonicalize_op0(i32 %x, i32 %y) { define i32 @test_sdiv_canonicalize_op0_exact(i32 %x, i32 %y) { ; CHECK-LABEL: @test_sdiv_canonicalize_op0_exact( -; CHECK-NEXT: [[SDIV1:%.*]] = sdiv exact i32 [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[SDIV:%.*]] = sub nsw i32 0, [[SDIV1]] +; CHECK-NEXT: [[NEG:%.*]] = sub nsw i32 0, [[X:%.*]] +; CHECK-NEXT: [[SDIV:%.*]] = sdiv exact i32 [[NEG]], [[Y:%.*]] ; CHECK-NEXT: ret i32 [[SDIV]] ; %neg = sub nsw i32 0, %x @@ -23,7 +23,6 @@ define i32 @test_sdiv_canonicalize_op0_exact(i32 %x, i32 %y) { ret i32 %sdiv } -; (X/-Y) is not equal to -(X/Y), don't canonicalize. define i32 @test_sdiv_canonicalize_op1(i32 %x, i32 %z) { ; CHECK-LABEL: @test_sdiv_canonicalize_op1( ; CHECK-NEXT: [[Y:%.*]] = mul i32 [[Z:%.*]], 3 @@ -50,8 +49,8 @@ define i32 @test_sdiv_canonicalize_nonsw(i32 %x, i32 %y) { define <2 x i32> @test_sdiv_canonicalize_vec(<2 x i32> %x, <2 x i32> %y) { ; CHECK-LABEL: @test_sdiv_canonicalize_vec( -; CHECK-NEXT: [[SDIV1:%.*]] = sdiv <2 x i32> [[X:%.*]], [[Y:%.*]] -; CHECK-NEXT: [[SDIV:%.*]] = sub nsw <2 x i32> zeroinitializer, [[SDIV1]] +; CHECK-NEXT: [[NEG:%.*]] = sub nsw <2 x i32> zeroinitializer, [[X:%.*]] +; CHECK-NEXT: [[SDIV:%.*]] = sdiv <2 x i32> [[NEG]], [[Y:%.*]] ; CHECK-NEXT: ret <2 x i32> [[SDIV]] ; %neg = sub nsw <2 x i32> , %x @@ -72,8 +71,9 @@ define i32 @test_sdiv_canonicalize_multiple_uses(i32 %x, i32 %y) { ret i32 %sdiv2 } -; There is combination: -(X/CE) -> (X/-CE). -; If combines (X/-CE) to -(X/CE), make sure don't combine them endless. +; There is combination: (X/-CE) -> -(X/CE) +; There is another combination: -(X/CE) -> (X/-CE) +; Make sure don't combine them endless. @X = global i32 5 -- 2.50.1