From 7177f67b84c9d20a9e211aa05c21f8cede4206be Mon Sep 17 00:00:00 2001 From: Yingwei Zheng Date: Tue, 26 Dec 2023 19:57:32 +0800 Subject: [PATCH 1/2] [InstCombine] Add pre-commit tests. NFC. --- llvm/test/Transforms/InstCombine/icmp.ll | 47 ++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/llvm/test/Transforms/InstCombine/icmp.ll b/llvm/test/Transforms/InstCombine/icmp.ll index 1c7bb36f0d34c..dd5eb3a628323 100644 --- a/llvm/test/Transforms/InstCombine/icmp.ll +++ b/llvm/test/Transforms/InstCombine/icmp.ll @@ -815,6 +815,53 @@ define i1 @test46(i32 %X, i32 %Y, i32 %Z) { ret i1 %C } +define i1 @test46_multiuse1(i32 %X, i32 %Y, i32 %Z) { +; CHECK-LABEL: @test46_multiuse1( +; CHECK-NEXT: [[A:%.*]] = ashr exact i32 [[X:%.*]], [[Z:%.*]] +; CHECK-NEXT: call void @use_i32(i32 [[A]]) +; CHECK-NEXT: [[B:%.*]] = ashr exact i32 [[Y:%.*]], [[Z]] +; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[A]], [[B]] +; CHECK-NEXT: ret i1 [[C]] +; + %A = ashr exact i32 %X, %Z + call void @use_i32(i32 %A) + %B = ashr exact i32 %Y, %Z + %C = icmp ult i32 %A, %B + ret i1 %C +} + +define i1 @test46_multiuse2(i32 %X, i32 %Y, i32 %Z) { +; CHECK-LABEL: @test46_multiuse2( +; CHECK-NEXT: [[A:%.*]] = ashr exact i32 [[X:%.*]], [[Z:%.*]] +; CHECK-NEXT: [[B:%.*]] = ashr exact i32 [[Y:%.*]], [[Z]] +; CHECK-NEXT: call void @use_i32(i32 [[B]]) +; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[A]], [[B]] +; CHECK-NEXT: ret i1 [[C]] +; + %A = ashr exact i32 %X, %Z + %B = ashr exact i32 %Y, %Z + call void @use_i32(i32 %B) + %C = icmp ult i32 %A, %B + ret i1 %C +} + +define i1 @test46_multiuse3(i32 %X, i32 %Y, i32 %Z) { +; CHECK-LABEL: @test46_multiuse3( +; CHECK-NEXT: [[A:%.*]] = ashr exact i32 [[X:%.*]], [[Z:%.*]] +; CHECK-NEXT: call void @use_i32(i32 [[A]]) +; CHECK-NEXT: [[B:%.*]] = ashr exact i32 [[Y:%.*]], [[Z]] +; CHECK-NEXT: call void @use_i32(i32 [[B]]) +; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[A]], [[B]] +; CHECK-NEXT: ret i1 [[C]] +; + %A = ashr exact i32 %X, %Z + call void @use_i32(i32 %A) + %B = ashr exact i32 %Y, %Z + call void @use_i32(i32 %B) + %C = icmp ult i32 %A, %B + ret i1 %C +} + ; PR9343 #5 define i1 @test47(i32 %X, i32 %Y, i32 %Z) { ; CHECK-LABEL: @test47( From aa888125d682f68804d31c1449cf3b188c1af6e2 Mon Sep 17 00:00:00 2001 From: Yingwei Zheng Date: Tue, 26 Dec 2023 21:26:38 +0800 Subject: [PATCH 2/2] [InstCombine] Relax the one-use constraints for `icmp pred (binop X, Z), (binop Y, Z)` --- llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp | 5 +++-- llvm/test/Transforms/InstCombine/icmp.ll | 8 +++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp index 289976718e52f..1e1d09843b13e 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp @@ -4911,8 +4911,9 @@ Instruction *InstCombinerImpl::foldICmpBinOp(ICmpInst &I, } } - if (BO0 && BO1 && BO0->getOpcode() == BO1->getOpcode() && BO0->hasOneUse() && - BO1->hasOneUse() && BO0->getOperand(1) == BO1->getOperand(1)) { + if (BO0 && BO1 && BO0->getOpcode() == BO1->getOpcode() && + (BO0->hasOneUse() || BO1->hasOneUse()) && + BO0->getOperand(1) == BO1->getOperand(1)) { switch (BO0->getOpcode()) { default: break; diff --git a/llvm/test/Transforms/InstCombine/icmp.ll b/llvm/test/Transforms/InstCombine/icmp.ll index dd5eb3a628323..5b0c1f58bd882 100644 --- a/llvm/test/Transforms/InstCombine/icmp.ll +++ b/llvm/test/Transforms/InstCombine/icmp.ll @@ -819,8 +819,7 @@ define i1 @test46_multiuse1(i32 %X, i32 %Y, i32 %Z) { ; CHECK-LABEL: @test46_multiuse1( ; CHECK-NEXT: [[A:%.*]] = ashr exact i32 [[X:%.*]], [[Z:%.*]] ; CHECK-NEXT: call void @use_i32(i32 [[A]]) -; CHECK-NEXT: [[B:%.*]] = ashr exact i32 [[Y:%.*]], [[Z]] -; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[A]], [[B]] +; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[X]], [[Y:%.*]] ; CHECK-NEXT: ret i1 [[C]] ; %A = ashr exact i32 %X, %Z @@ -832,10 +831,9 @@ define i1 @test46_multiuse1(i32 %X, i32 %Y, i32 %Z) { define i1 @test46_multiuse2(i32 %X, i32 %Y, i32 %Z) { ; CHECK-LABEL: @test46_multiuse2( -; CHECK-NEXT: [[A:%.*]] = ashr exact i32 [[X:%.*]], [[Z:%.*]] -; CHECK-NEXT: [[B:%.*]] = ashr exact i32 [[Y:%.*]], [[Z]] +; CHECK-NEXT: [[B:%.*]] = ashr exact i32 [[Y:%.*]], [[Z:%.*]] ; CHECK-NEXT: call void @use_i32(i32 [[B]]) -; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[A]], [[B]] +; CHECK-NEXT: [[C:%.*]] = icmp ult i32 [[X:%.*]], [[Y]] ; CHECK-NEXT: ret i1 [[C]] ; %A = ashr exact i32 %X, %Z