From c5cd80815666f535ffc37cd582e7576a29ba6816 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. llvm-svn: 371981 --- llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | 5 +---- llvm/test/Transforms/InstCombine/icmp.ll | 4 ++-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp index a7732c475..5c443fa 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/llvm/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/llvm/test/Transforms/InstCombine/icmp.ll b/llvm/test/Transforms/InstCombine/icmp.ll index 02c26ef..ec9fc77 100644 --- a/llvm/test/Transforms/InstCombine/icmp.ll +++ b/llvm/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.7.4