From cba3b2c1c37a84400b7d96b00fd5dcaad611acd4 Mon Sep 17 00:00:00 2001 From: Sanjay Patel Date: Mon, 16 Sep 2019 12:54:34 +0000 Subject: [PATCH] [InstCombine] remove unneeded one-use checks for icmp fold This fold and several others were added in: rL125734 ...with no explanation for the one-use checks other than the code comments about register pressure. Given that this is IR canonicalization, we shouldn't be worried about register pressure though; the backend should be able to adjust for that as needed. This is part of solving PR43310 the theoretically right way: https://bugs.llvm.org/show_bug.cgi?id=43310 ...ie, if we don't cripple basic transforms, then we won't need to add special-case code to detect larger patterns. rL371940 is a related patch in this series. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@371981 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/InstCombine/InstCombineCompares.cpp | 5 +---- test/Transforms/InstCombine/icmp.ll | 4 ++-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/lib/Transforms/InstCombine/InstCombineCompares.cpp b/lib/Transforms/InstCombine/InstCombineCompares.cpp index a7732c475b4..5c443faf2f2 100644 --- a/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -3849,10 +3849,7 @@ Instruction *InstCombiner::foldICmpBinOp(ICmpInst &I) { return new ICmpInst(Pred, A, C); // icmp (A-B), (A-D) -> icmp D, B for equalities or if there is no overflow. - // TODO: The one-use checks should not be necessary. - if (A && C && A == C && NoOp0WrapProblem && NoOp1WrapProblem && - // Try not to increase register pressure. - BO0->hasOneUse() && BO1->hasOneUse()) + if (A && C && A == C && NoOp0WrapProblem && NoOp1WrapProblem) return new ICmpInst(Pred, D, B); // icmp (0-X) < cst --> x > -cst diff --git a/test/Transforms/InstCombine/icmp.ll b/test/Transforms/InstCombine/icmp.ll index 02c26ef58b8..ec9fc77d9fc 100644 --- a/test/Transforms/InstCombine/icmp.ll +++ b/test/Transforms/InstCombine/icmp.ll @@ -734,7 +734,7 @@ define i1 @test37_extra_uses(i32 %x, i32 %y, i32 %z) { ; CHECK-NEXT: call void @foo(i32 [[LHS]]) ; CHECK-NEXT: [[RHS:%.*]] = sub nsw i32 [[X]], [[Z:%.*]] ; CHECK-NEXT: call void @foo(i32 [[RHS]]) -; CHECK-NEXT: [[C:%.*]] = icmp sgt i32 [[LHS]], [[RHS]] +; CHECK-NEXT: [[C:%.*]] = icmp sgt i32 [[Z]], [[Y]] ; CHECK-NEXT: ret i1 [[C]] ; %lhs = sub nsw i32 %x, %y @@ -763,7 +763,7 @@ define i1 @test38_extra_uses(i32 %x, i32 %y, i32 %z) { ; CHECK-NEXT: call void @foo(i32 [[LHS]]) ; CHECK-NEXT: [[RHS:%.*]] = sub nuw i32 [[X]], [[Z:%.*]] ; CHECK-NEXT: call void @foo(i32 [[RHS]]) -; CHECK-NEXT: [[C:%.*]] = icmp ugt i32 [[LHS]], [[RHS]] +; CHECK-NEXT: [[C:%.*]] = icmp ugt i32 [[Z]], [[Y]] ; CHECK-NEXT: ret i1 [[C]] ; %lhs = sub nuw i32 %x, %y -- 2.50.1