[llvm] [InstCombine] Fold trunc nuw X to i1 -> true IFF X != 0 (PR #119131)

Andreas Jonson via llvm-commits llvm-commits at lists.llvm.org
Sun Dec 8 13:09:21 PST 2024


https://github.com/andjo403 updated https://github.com/llvm/llvm-project/pull/119131

>From b118f6d1b5307be070bcd41aa6b141d20aedd476 Mon Sep 17 00:00:00 2001
From: Andreas Jonson <andjo403 at hotmail.com>
Date: Sun, 8 Dec 2024 15:05:36 +0100
Subject: [PATCH] [InstCombine] Fold trunc nuw/nsw X to i1 -> true IFF X != 0

---
 llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp | 5 +++++
 llvm/test/Transforms/InstCombine/trunc.ll            | 6 ++----
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
index 102b784169ca7d..0b9379965f4249 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
@@ -934,6 +934,11 @@ Instruction *InstCombinerImpl::visitTrunc(TruncInst &Trunc) {
     }
   }
 
+  if (DestWidth == 1 &&
+      (Trunc.hasNoUnsignedWrap() || Trunc.hasNoSignedWrap()) &&
+      isKnownNonZero(Src, SQ.getWithInstruction(&Trunc)))
+    return replaceInstUsesWith(Trunc, ConstantInt::getTrue(DestTy));
+
   bool Changed = false;
   if (!Trunc.hasNoSignedWrap() &&
       ComputeMaxSignificantBits(Src, /*Depth=*/0, &Trunc) <= DestWidth) {
diff --git a/llvm/test/Transforms/InstCombine/trunc.ll b/llvm/test/Transforms/InstCombine/trunc.ll
index fda99dd5ac3e3b..a85ce716fbdfab 100644
--- a/llvm/test/Transforms/InstCombine/trunc.ll
+++ b/llvm/test/Transforms/InstCombine/trunc.ll
@@ -1129,8 +1129,7 @@ define i1 @trunc_nuw_i1_non_zero(i8 %1) {
 ; CHECK-LABEL: @trunc_nuw_i1_non_zero(
 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i8 [[TMP0:%.*]], 0
 ; CHECK-NEXT:    tail call void @llvm.assume(i1 [[TMP2]])
-; CHECK-NEXT:    [[RET:%.*]] = trunc nuw i8 [[TMP0]] to i1
-; CHECK-NEXT:    ret i1 [[RET]]
+; CHECK-NEXT:    ret i1 true
 ;
   %3 = icmp ne i8 %1, 0
   tail call void @llvm.assume(i1 %3)
@@ -1177,8 +1176,7 @@ define i1 @trunc_nsw_i1_non_zero(i8 %1) {
 ; CHECK-LABEL: @trunc_nsw_i1_non_zero(
 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i8 [[TMP0:%.*]], 0
 ; CHECK-NEXT:    tail call void @llvm.assume(i1 [[TMP2]])
-; CHECK-NEXT:    [[RET:%.*]] = trunc nsw i8 [[TMP0]] to i1
-; CHECK-NEXT:    ret i1 [[RET]]
+; CHECK-NEXT:    ret i1 true
 ;
   %3 = icmp ne i8 %1, 0
   tail call void @llvm.assume(i1 %3)



More information about the llvm-commits mailing list