[llvm] [InstCombine] Added optimisation for trunc (Pow2 >> x) to i1 (PR #157030)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Sep 7 13:00:24 PDT 2025
https://github.com/kper updated https://github.com/llvm/llvm-project/pull/157030
>From 766e5f7d5de6d9af309c0957756c3866befdceff Mon Sep 17 00:00:00 2001
From: Kevin Per <kevin.per at protonmail.com>
Date: Fri, 5 Sep 2025 06:23:45 +0000
Subject: [PATCH] [InstCombine] Added optimisation for trunc (Pow2 >> x) to i1
---
.../InstCombine/InstCombineCasts.cpp | 21 +++++++++++++++++++
.../test/Transforms/InstCombine/trunc-lshr.ll | 21 +++++++++++++++++++
2 files changed, 42 insertions(+)
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
index fdef49e310f81..e75546031eeca 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
@@ -11,11 +11,13 @@
//===----------------------------------------------------------------------===//
#include "InstCombineInternal.h"
+#include "llvm/ADT/APInt.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/Analysis/ConstantFolding.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DebugInfo.h"
#include "llvm/IR/PatternMatch.h"
+#include "llvm/IR/Value.h"
#include "llvm/Support/KnownBits.h"
#include "llvm/Transforms/InstCombine/InstCombiner.h"
#include <optional>
@@ -969,6 +971,25 @@ Instruction *InstCombinerImpl::visitTrunc(TruncInst &Trunc) {
Changed = true;
}
+ const APInt *C1;
+ Value *V1;
+ // trunc (lshr i8 C1, V1) to i1 -> icmp eq V1, log_2(C1) iff C1 is power of 2
+ if (DestWidth == 1 &&
+ match(Src, m_OneUse(m_Shr(m_Power2(C1), m_Value(V1))))) {
+ Value *Right = ConstantInt::get(V1->getType(), C1->nearestLogBase2());
+ Value *Icmp = Builder.CreateICmpEQ(V1, Right);
+ return replaceInstUsesWith(Trunc, Icmp);
+ }
+
+ // trunc (lshr i8 C1, V1) to i1 -> icmp ult V1, log_2(C1 + 1) iff (C1 + 1) is
+ // power of 2
+ if (DestWidth == 1 && match(Src, m_OneUse(m_Shr(m_APInt(C1), m_Value(V1)))) &&
+ (*C1 + 1).isPowerOf2()) {
+ Value *Right = ConstantInt::get(V1->getType(), (*C1 + 1).nearestLogBase2());
+ Value *Icmp = Builder.CreateICmpULT(V1, Right);
+ return replaceInstUsesWith(Trunc, Icmp);
+ }
+
return Changed ? &Trunc : nullptr;
}
diff --git a/llvm/test/Transforms/InstCombine/trunc-lshr.ll b/llvm/test/Transforms/InstCombine/trunc-lshr.ll
index 4364b09cfa709..84daba3d13b9a 100644
--- a/llvm/test/Transforms/InstCombine/trunc-lshr.ll
+++ b/llvm/test/Transforms/InstCombine/trunc-lshr.ll
@@ -93,3 +93,24 @@ define i1 @test5(i32 %i, ptr %p) {
ret i1 %op
}
+define i1 @test6(i8 %x) {
+; CHECK-LABEL: define i1 @test6(
+; CHECK-SAME: i8 [[X:%.*]]) {
+; CHECK-NEXT: [[TRUNC:%.*]] = icmp eq i8 [[X]], 2
+; CHECK-NEXT: ret i1 [[TRUNC]]
+;
+ %lshr = lshr i8 4, %x
+ %trunc = trunc i8 %lshr to i1
+ ret i1 %trunc
+}
+
+define i1 @test7(i8 %x) {
+; CHECK-LABEL: define i1 @test7(
+; CHECK-SAME: i8 [[X:%.*]]) {
+; CHECK-NEXT: [[TRUNC:%.*]] = icmp ult i8 [[X]], 4
+; CHECK-NEXT: ret i1 [[TRUNC]]
+;
+ %lshr = lshr i8 15, %x
+ %trunc = trunc i8 %lshr to i1
+ ret i1 %trunc
+}
More information about the llvm-commits
mailing list