Skip to content

[UTC] Don't leave dangling CHECK-SAME when removing CHECK lines #82569

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Feb 29, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
; RUN: opt -S < %s | FileCheck %s

define i32 @foo() {
; CHECK-LABEL: @foo(
; CHECK-NEXT: [[RESULT:%.*]] = call i32 @bar(i32 0, i32 1)
; CHECK-NEXT: ret i32 [[RESULT]]
;
%result = call i32 @bar(i32 0, i32 1)
ret i32 %result
}

declare i32 @bar(i32, i32)
; CHECK-LABEL: @bar(
; CHECK-SAME: i32
; CHECK-SAME: i32
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt -S < %s | FileCheck %s

define i32 @foo() {
; CHECK-LABEL: @foo(
; CHECK-NEXT: [[RESULT:%.*]] = call i32 @bar(i32 0, i32 1)
; CHECK-NEXT: ret i32 [[RESULT]]
;
%result = call i32 @bar(i32 0, i32 1)
ret i32 %result
}

declare i32 @bar(i32, i32)
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
## Basic test checking global checks split over multiple lines are removed together
# RUN: cp -f %S/Inputs/global_remove_same.ll %t.ll && %update_test_checks %t.ll
# RUN: diff -u %t.ll %S/Inputs/global_remove_same.ll.expected

15 changes: 13 additions & 2 deletions llvm/utils/UpdateTestChecks/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -388,7 +388,12 @@ def itertests(


def should_add_line_to_output(
input_line, prefix_set, skip_global_checks=False, comment_marker=";"
input_line,
prefix_set,
*,
skip_global_checks=False,
skip_same_checks=False,
comment_marker=";",
):
# Skip any blank comment lines in the IR.
if not skip_global_checks and input_line.strip() == comment_marker:
Expand All @@ -402,9 +407,14 @@ def should_add_line_to_output(
# And skip any CHECK lines. We're building our own.
m = CHECK_RE.match(input_line)
if m and m.group(1) in prefix_set:
if skip_same_checks and CHECK_SAME_RE.match(input_line):
# The previous CHECK line was removed, so don't leave this dangling
return False
if skip_global_checks:
# Skip checks only if they are of global value definitions
global_ir_value_re = re.compile(r"(\[\[|@)", flags=(re.M))
return not global_ir_value_re.search(input_line)
is_global = global_ir_value_re.search(input_line)
return not is_global
return False

return True
Expand Down Expand Up @@ -483,6 +493,7 @@ def invoke_tool(exe, cmd_args, ir, preprocess_cmd=None, verbose=False):
CHECK_RE = re.compile(
r"^\s*(?://|[;#])\s*([^:]+?)(?:-NEXT|-NOT|-DAG|-LABEL|-SAME|-EMPTY)?:"
)
CHECK_SAME_RE = re.compile(r"^\s*(?://|[;#])\s*([^:]+?)(?:-SAME)?:")

UTC_ARGS_KEY = "UTC_ARGS:"
UTC_ARGS_CMD = re.compile(r".*" + UTC_ARGS_KEY + r"\s*(?P<cmd>.*)\s*$")
Expand Down
10 changes: 9 additions & 1 deletion llvm/utils/update_test_checks.py
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,7 @@ def main():
)
else:
# "Normal" mode.
dropped_previous_line = False
for input_line_info in ti.iterlines(output_lines):
input_line = input_line_info.line
args = input_line_info.args
Expand Down Expand Up @@ -282,17 +283,24 @@ def main():
has_checked_pre_function_globals = True

if common.should_add_line_to_output(
input_line, prefix_set, not is_in_function
input_line,
prefix_set,
skip_global_checks=not is_in_function,
skip_same_checks=dropped_previous_line,
):
# This input line of the function body will go as-is into the output.
# Except make leading whitespace uniform: 2 spaces.
input_line = common.SCRUB_LEADING_WHITESPACE_RE.sub(
r" ", input_line
)
output_lines.append(input_line)
dropped_previous_line = False
if input_line.strip() == "}":
is_in_function = False
continue
else:
# If we are removing a check line, and the next line is CHECK-SAME, it MUST also be removed
dropped_previous_line = True

if is_in_function:
continue
Expand Down