[llvm] [SCCP] Attribute on single element (PR #166800)
Kunqiu Chen via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 6 08:53:49 PST 2025
https://github.com/Camsyn created https://github.com/llvm/llvm-project/pull/166800
None
>From 0678a3af2a164d9af8b2f62e72e3a5740f6b59a8 Mon Sep 17 00:00:00 2001
From: Camsyn <camsyn at foxmail.com>
Date: Thu, 6 Nov 2025 23:38:15 +0800
Subject: [PATCH 1/2] Add test before commit
---
.../Transforms/SCCP/post-update-unknown.ll | 46 +++++++++++++++++++
1 file changed, 46 insertions(+)
create mode 100644 llvm/test/Transforms/SCCP/post-update-unknown.ll
diff --git a/llvm/test/Transforms/SCCP/post-update-unknown.ll b/llvm/test/Transforms/SCCP/post-update-unknown.ll
new file mode 100644
index 0000000000000..55043c3d5efe5
--- /dev/null
+++ b/llvm/test/Transforms/SCCP/post-update-unknown.ll
@@ -0,0 +1,46 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt -S -passes=sccp < %s | FileCheck %s --check-prefixes=CHECK,SCCP
+; RUN: opt -S -passes=ipsccp < %s | FileCheck %s --check-prefixes=CHECK,IPSCCP
+
+; Test the case when a \bot (unknown) in lattice is updated to a constrange
+; via updates of non-operand
+
+define i32 @bar() {
+; CHECK-LABEL: define range(i32 1, -2147483648) i32 @bar() {
+; CHECK-NEXT: [[ENTRY:.*]]:
+; CHECK-NEXT: [[V1:%.*]] = call i32 (...) @pred()
+; CHECK-NEXT: [[DOTNOT:%.*]] = icmp eq i32 [[V1]], 0
+; CHECK-NEXT: br i1 [[DOTNOT]], label %[[EXIT:.*]], label %[[BR1:.*]]
+; CHECK: [[BR1]]:
+; CHECK-NEXT: [[V3:%.*]] = call i32 @bar()
+; CHECK-NEXT: [[V4:%.*]] = icmp sgt i32 [[V3]], 1
+; CHECK-NEXT: br i1 [[V4]], label %[[EXIT]], label %[[BR2:.*]]
+; CHECK: [[BR2]]:
+; CHECK-NEXT: br label %[[EXIT]]
+; CHECK: [[EXIT]]:
+; CHECK-NEXT: [[DOT0:%.*]] = phi i32 [ [[V3]], %[[BR1]] ], [ 2, %[[BR2]] ], [ 1, %[[ENTRY]] ]
+; CHECK-NEXT: ret i32 [[DOT0]]
+;
+entry:
+ %v1 = call i32 (...) @pred()
+ %.not = icmp eq i32 %v1, 0
+ br i1 %.not, label %exit, label %br1
+
+br1: ; preds = %entry
+ %v3 = call i32 @bar()
+ %v4 = icmp sgt i32 %v3, 1
+ br i1 %v4, label %exit, label %br2
+
+br2: ; preds = %br1
+ br label %exit
+
+exit: ; preds = %br2, %br1, %entry
+ %.0 = phi i32 [ %v3, %br1 ], [ 2, %br2 ], [ 1, %entry ]
+ ret i32 %.0
+}
+
+declare i32 @pred(...)
+
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; IPSCCP: {{.*}}
+; SCCP: {{.*}}
>From 084afc16451b4e81cb3a37039fea218950dde336 Mon Sep 17 00:00:00 2001
From: Camsyn <camsyn at foxmail.com>
Date: Fri, 7 Nov 2025 00:52:26 +0800
Subject: [PATCH 2/2] [SCCP] Attribute on single element
---
llvm/lib/Transforms/Utils/SCCPSolver.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/lib/Transforms/Utils/SCCPSolver.cpp b/llvm/lib/Transforms/Utils/SCCPSolver.cpp
index 4947d03a2dc66..f9cf7a3d11cff 100644
--- a/llvm/lib/Transforms/Utils/SCCPSolver.cpp
+++ b/llvm/lib/Transforms/Utils/SCCPSolver.cpp
@@ -476,7 +476,7 @@ bool SCCPSolver::removeNonFeasibleEdges(BasicBlock *BB, DomTreeUpdater &DTU,
static void inferAttribute(Function *F, unsigned AttrIndex,
const ValueLatticeElement &Val) {
// If there is a known constant range for the value, add range attribute.
- if (Val.isConstantRange() && !Val.getConstantRange().isSingleElement()) {
+ if (Val.isConstantRange()) {
// Do not add range attribute if the value may include undef.
if (Val.isConstantRangeIncludingUndef())
return;
More information about the llvm-commits
mailing list