[llvm] [InstCombine] Relax the one-use constraints for `icmp pred (binop X, Z), (binop Y, Z)` (PR #76384)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 25 22:41:31 PST 2023
https://github.com/dtcxzyw created https://github.com/llvm/llvm-project/pull/76384
This patch relaxes the one-use constraints for `icmp pred (binop X, Z), (binop Y, Z)`. It will enable more optimizations with pointer arithmetic.
One example in `boost::match_results::set_size`:
```
declare void @use(i64)
define i1 @src(ptr %a1, ptr %a2, ptr %add.ptr.i66, i64 %sub.ptr.rhs.cast.i) {
%sub.ptr.lhs.cast.i = ptrtoint ptr %a1 to i64
%sub.ptr.rhs.cast.i = ptrtoint ptr %a2 to i64
%sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i
%sub.ptr.div.i = sdiv exact i64 %sub.ptr.sub.i, 24
call void @use(i64 %sub.ptr.div.i)
%sub.ptr.lhs.cast.i.i = ptrtoint ptr %add.ptr.i66 to i64
%sub.ptr.sub.i.i = sub i64 %sub.ptr.lhs.cast.i.i, %sub.ptr.rhs.cast.i
%sub.ptr.div.i.i = sdiv exact i64 %sub.ptr.sub.i.i, 24
%cmp.i.not.i.i = icmp eq i64 %sub.ptr.div.i.i, %sub.ptr.div.i
ret i1 %cmp.i.not.i.i
}
define i1 @tgt(ptr %a1, ptr %a2, ptr %add.ptr.i66, i64 %sub.ptr.rhs.cast.i) {
%sub.ptr.lhs.cast.i = ptrtoint ptr %a1 to i64
%sub.ptr.rhs.cast.i = ptrtoint ptr %a2 to i64
%sub.ptr.sub.i = sub i64 %sub.ptr.lhs.cast.i, %sub.ptr.rhs.cast.i
%sub.ptr.div.i = sdiv exact i64 %sub.ptr.sub.i, 24
call void @use(i64 %sub.ptr.div.i)
%cmp.i.not.i.i = icmp eq i64 %sub.ptr.sub.i.i, %sub.ptr.sub.i
ret i1 %cmp.i.not.i.i
}
```
>From 8c740b4bff860e44e09166802a40c88ae93cf476 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Tue, 26 Dec 2023 14:31:24 +0800
Subject: [PATCH 1/2] [InstCombine] Add pre-commit tests. NFC.
---
llvm/test/Transforms/InstCombine/icmp.ll | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/llvm/test/Transforms/InstCombine/icmp.ll b/llvm/test/Transforms/InstCombine/icmp.ll
index 1c7bb36f0d34c0..39d638dab6e251 100644
--- a/llvm/test/Transforms/InstCombine/icmp.ll
+++ b/llvm/test/Transforms/InstCombine/icmp.ll
@@ -815,6 +815,23 @@ define i1 @test46(i32 %X, i32 %Y, i32 %Z) {
ret i1 %C
}
+define i1 @test46_multiuse(i32 %X, i32 %Y, i32 %Z) {
+; CHECK-LABEL: @test46_multiuse(
+; 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 cfa9abbd2754c5ac01f2b957afa1a16dff3903ed Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Tue, 26 Dec 2023 14:33:31 +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 | 4 ++--
llvm/test/Transforms/InstCombine/icmp.ll | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
index 289976718e52f3..0afb415a482411 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
@@ -4911,8 +4911,8 @@ 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->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 39d638dab6e251..6d881be56dc2b4 100644
--- a/llvm/test/Transforms/InstCombine/icmp.ll
+++ b/llvm/test/Transforms/InstCombine/icmp.ll
@@ -821,7 +821,7 @@ define i1 @test46_multiuse(i32 %X, i32 %Y, i32 %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: [[C:%.*]] = icmp ult i32 [[X]], [[Y]]
; CHECK-NEXT: ret i1 [[C]]
;
%A = ashr exact i32 %X, %Z
More information about the llvm-commits
mailing list