[llvm] [InstCombine] Avoid to create bitreverse.i1 for or of trunc to i1 (PR #142258)
Andreas Jonson via llvm-commits
llvm-commits at lists.llvm.org
Fri May 30 23:54:42 PDT 2025
https://github.com/andjo403 created https://github.com/llvm/llvm-project/pull/142258
Avoid to create bitreverse.i1 as it hinder optimizations due to there is less optimizations for bitreverse and also is a bit strange to create a i1 bitreverse
this change avoids this transform a couple of times in llvm-opt-benchmark.
>From 4bcea686f49ce92b7ac24320d4647a91a7cbbcda Mon Sep 17 00:00:00 2001
From: Andreas Jonson <andjo403 at hotmail.com>
Date: Sat, 31 May 2025 08:41:34 +0200
Subject: [PATCH 1/2] [InstCombine] Test avoid to create bitreverse.i1 (NFC)
---
llvm/test/Transforms/InstCombine/or.ll | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/llvm/test/Transforms/InstCombine/or.ll b/llvm/test/Transforms/InstCombine/or.ll
index 95f89e4ce11cd..bbeb9964d23bd 100644
--- a/llvm/test/Transforms/InstCombine/or.ll
+++ b/llvm/test/Transforms/InstCombine/or.ll
@@ -2035,3 +2035,15 @@ define i32 @or_xor_and_commuted3(i32 %x, i32 %y, i32 %z) {
%or1 = or i32 %xor, %yy
ret i32 %or1
}
+
+define i1 @or_truncs(i8 %x) {
+; CHECK-LABEL: @or_truncs(
+; CHECK-NEXT: [[TRUNC:%.*]] = trunc i8 [[X:%.*]] to i1
+; CHECK-NEXT: [[OR1:%.*]] = call i1 @llvm.bitreverse.i1(i1 [[TRUNC]])
+; CHECK-NEXT: ret i1 [[OR1]]
+;
+ %trunc1 = trunc i8 %x to i1
+ %trunc2 = trunc i8 %x to i1
+ %or1 = or i1 %trunc1, %trunc2
+ ret i1 %or1
+}
>From 6241f488b7aa8bda516416c47d808b0c36280257 Mon Sep 17 00:00:00 2001
From: Andreas Jonson <andjo403 at hotmail.com>
Date: Sat, 31 May 2025 08:45:35 +0200
Subject: [PATCH 2/2] [InstCombine] Avoid to create bitreverse.i1 for or of
trunc to i1
---
llvm/lib/Transforms/Utils/Local.cpp | 3 ++-
llvm/test/Transforms/InstCombine/or.ll | 4 ++--
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp
index fe1391a501b43..a0618726ac0ac 100644
--- a/llvm/lib/Transforms/Utils/Local.cpp
+++ b/llvm/lib/Transforms/Utils/Local.cpp
@@ -4117,7 +4117,8 @@ bool llvm::recognizeBSwapOrBitReverseIdiom(
if (!MatchBSwaps && !MatchBitReversals)
return false;
Type *ITy = I->getType();
- if (!ITy->isIntOrIntVectorTy() || ITy->getScalarSizeInBits() > 128)
+ if (!ITy->isIntOrIntVectorTy() || ITy->getScalarSizeInBits() == 1 ||
+ ITy->getScalarSizeInBits() > 128)
return false; // Can't do integer/elements > 128 bits.
// Try to find all the pieces corresponding to the bswap.
diff --git a/llvm/test/Transforms/InstCombine/or.ll b/llvm/test/Transforms/InstCombine/or.ll
index bbeb9964d23bd..a5cc933278982 100644
--- a/llvm/test/Transforms/InstCombine/or.ll
+++ b/llvm/test/Transforms/InstCombine/or.ll
@@ -2038,8 +2038,8 @@ define i32 @or_xor_and_commuted3(i32 %x, i32 %y, i32 %z) {
define i1 @or_truncs(i8 %x) {
; CHECK-LABEL: @or_truncs(
-; CHECK-NEXT: [[TRUNC:%.*]] = trunc i8 [[X:%.*]] to i1
-; CHECK-NEXT: [[OR1:%.*]] = call i1 @llvm.bitreverse.i1(i1 [[TRUNC]])
+; CHECK-NEXT: [[TMP1:%.*]] = and i8 [[X:%.*]], 1
+; CHECK-NEXT: [[OR1:%.*]] = icmp ne i8 [[TMP1]], 0
; CHECK-NEXT: ret i1 [[OR1]]
;
%trunc1 = trunc i8 %x to i1
More information about the llvm-commits
mailing list