From 0678a3af2a164d9af8b2f62e72e3a5740f6b59a8 Mon Sep 17 00:00:00 2001 From: Camsyn 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 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;