[llvm] [UTC] Align label var handling of old lines to new lines (PR #173850)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 29 03:55:06 PST 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-testing-tools
Author: Kunqiu Chen (Camsyn)
<details>
<summary>Changes</summary>
BB labels have been treated as variables in newer UTC versions.
However, UTC previously handled BB labels in old lines differently from new lines, causing incorrect `remap_metavar_names`.
E.g.,
- New lines var `exit:` and `label %exit`: UTC generalized them as `[[@@]]` and `[[@@]]`.
- Old lines var `[[EXIT]]:` and `label %[[EXIT]]`: UTC generalized them as `[[@@]]:` and `label %[[@@]]`, which mismatched with the generalization of new lines.
This mismatch might cause unexpected variable name remappings, even if the new lines are indeed equivalent to the old lines.
This PR aligns label var handling of old lines to new lines, i.e., generalizes `[[EXIT]]:` and `label %[[EXIT]]` as `[[@@]]` and `[[@@]]`.
---
Full diff: https://github.com/llvm/llvm-project/pull/173850.diff
4 Files Affected:
- (added) llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/keep-label-name.ll (+57)
- (added) llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/keep-label-name.ll.expected (+57)
- (added) llvm/test/tools/UpdateTestChecks/update_test_checks/keep-label-name.test (+3)
- (modified) llvm/utils/UpdateTestChecks/common.py (+8-2)
``````````diff
diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/keep-label-name.ll b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/keep-label-name.ll
new file mode 100644
index 0000000000000..c065d8a09461d
--- /dev/null
+++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/keep-label-name.ll
@@ -0,0 +1,57 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt < %s -S | FileCheck %s
+
+define void @foo(i32 %v) {
+; CHECK-LABEL: define void @foo(
+; CHECK-SAME: i32 [[V:%.*]]) {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: br i1 false, label %[[CASE2:.*]], label %[[IF_ELSE:.*]]
+; CHECK: [[IF_ELSE]]:
+; CHECK-NEXT: switch i32 [[V]], label %[[DEFAULT:.*]] [
+; CHECK-NEXT: i32 3, label %[[EXIT:.*]]
+; CHECK-NEXT: i32 2, label %[[CASE2]]
+; CHECK-NEXT: i32 1, label %[[CASE1:.*]]
+; CHECK-NEXT: ]
+; CHECK: [[CASE1]]:
+; CHECK-NEXT: br label %[[DEFAULT]]
+; CHECK: [[CASE2]]:
+; CHECK-NEXT: br label %[[DEFAULT]]
+; CHECK: [[DEFAULT]]:
+; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 1, %[[CASE1]] ], [ 2, %[[CASE2]] ], [ [[V]], %[[IF_ELSE]] ]
+; CHECK-NEXT: br label %[[SWITCH:.*]]
+; CHECK: [[SWITCH]]:
+; CHECK-NEXT: br label %[[EXIT]]
+; CHECK: [[UNREACH:.*:]]
+; CHECK-NEXT: br label %[[EXIT]]
+; CHECK: [[EXIT]]:
+; CHECK-NEXT: ret void
+;
+entry:
+ br i1 false, label %case2, label %if.else
+
+if.else: ; preds = %entry
+ switch i32 %v, label %default [
+ i32 3, label %exit
+ i32 2, label %case2
+ i32 1, label %case1
+ ]
+
+case1: ; preds = %if.else
+ br label %default
+
+case2: ; preds = %if.else, %entry
+ br label %default
+
+default: ; preds = %case2, %case1, %if.else
+ %phi = phi i32 [ 1, %case1 ], [ 2, %case2 ], [ %v, %if.else ]
+ br label %switch
+
+switch: ; preds = %default
+ br label %exit
+
+unreach: ; No predecessors!
+ br label %exit
+
+exit: ; preds = %unreach, %switch, %if.else
+ ret void
+}
diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/keep-label-name.ll.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/keep-label-name.ll.expected
new file mode 100644
index 0000000000000..c065d8a09461d
--- /dev/null
+++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/keep-label-name.ll.expected
@@ -0,0 +1,57 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt < %s -S | FileCheck %s
+
+define void @foo(i32 %v) {
+; CHECK-LABEL: define void @foo(
+; CHECK-SAME: i32 [[V:%.*]]) {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: br i1 false, label %[[CASE2:.*]], label %[[IF_ELSE:.*]]
+; CHECK: [[IF_ELSE]]:
+; CHECK-NEXT: switch i32 [[V]], label %[[DEFAULT:.*]] [
+; CHECK-NEXT: i32 3, label %[[EXIT:.*]]
+; CHECK-NEXT: i32 2, label %[[CASE2]]
+; CHECK-NEXT: i32 1, label %[[CASE1:.*]]
+; CHECK-NEXT: ]
+; CHECK: [[CASE1]]:
+; CHECK-NEXT: br label %[[DEFAULT]]
+; CHECK: [[CASE2]]:
+; CHECK-NEXT: br label %[[DEFAULT]]
+; CHECK: [[DEFAULT]]:
+; CHECK-NEXT: [[PHI:%.*]] = phi i32 [ 1, %[[CASE1]] ], [ 2, %[[CASE2]] ], [ [[V]], %[[IF_ELSE]] ]
+; CHECK-NEXT: br label %[[SWITCH:.*]]
+; CHECK: [[SWITCH]]:
+; CHECK-NEXT: br label %[[EXIT]]
+; CHECK: [[UNREACH:.*:]]
+; CHECK-NEXT: br label %[[EXIT]]
+; CHECK: [[EXIT]]:
+; CHECK-NEXT: ret void
+;
+entry:
+ br i1 false, label %case2, label %if.else
+
+if.else: ; preds = %entry
+ switch i32 %v, label %default [
+ i32 3, label %exit
+ i32 2, label %case2
+ i32 1, label %case1
+ ]
+
+case1: ; preds = %if.else
+ br label %default
+
+case2: ; preds = %if.else, %entry
+ br label %default
+
+default: ; preds = %case2, %case1, %if.else
+ %phi = phi i32 [ 1, %case1 ], [ 2, %case2 ], [ %v, %if.else ]
+ br label %switch
+
+switch: ; preds = %default
+ br label %exit
+
+unreach: ; No predecessors!
+ br label %exit
+
+exit: ; preds = %unreach, %switch, %if.else
+ ret void
+}
diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/keep-label-name.test b/llvm/test/tools/UpdateTestChecks/update_test_checks/keep-label-name.test
new file mode 100644
index 0000000000000..5488e78c4ac03
--- /dev/null
+++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/keep-label-name.test
@@ -0,0 +1,3 @@
+## keep-label-name test checking that update_test_checks.py does not replace unchanged label names
+# RUN: cp -f %S/Inputs/keep-label-name.ll %t.ll && %update_test_checks %t.ll
+# RUN: diff -u %t.ll %S/Inputs/keep-label-name.ll.expected
diff --git a/llvm/utils/UpdateTestChecks/common.py b/llvm/utils/UpdateTestChecks/common.py
index baa0377cd8b81..cd15994326f98 100644
--- a/llvm/utils/UpdateTestChecks/common.py
+++ b/llvm/utils/UpdateTestChecks/common.py
@@ -1577,7 +1577,12 @@ def find_diff_matching(lhs: List[str], rhs: List[str]) -> List[tuple]:
VARIABLE_TAG = "[[@@]]"
-METAVAR_RE = re.compile(r"\[\[([A-Z0-9_]+)(?::[^]]+)?\]\]")
+METAVAR_PATTERN = r"\[\[([A-Z0-9_]+)(?::[^]]+)?\]\]"
+LABEL_METAVAR_PATTERN1 = r"label %" + METAVAR_PATTERN
+LABEL_METAVAR_PATTERN2 = r"^" + METAVAR_PATTERN + r":"
+METAVAR_RE = re.compile(
+ rf"(?:{LABEL_METAVAR_PATTERN1})|(?:{LABEL_METAVAR_PATTERN2})|(?:{METAVAR_PATTERN})"
+)
NUMERIC_SUFFIX_RE = re.compile(r"[0-9]*$")
@@ -2014,7 +2019,8 @@ def escape_braces(match_obj):
CheckValueInfo(
key=None,
text=None,
- name=m.group(1),
+ # The sole capturing group is only designated for the name.
+ name=m.group(m.lastindex),
prefix="",
suffix="",
)
``````````
</details>
https://github.com/llvm/llvm-project/pull/173850
More information about the llvm-commits
mailing list