[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