From a5d5564db928fe9d3f4f6bd766566a765954ed0f Mon Sep 17 00:00:00 2001 From: Jinsong Ji Date: Thu, 23 Jan 2025 17:51:08 +0100 Subject: [PATCH 1/3] UpdateTestChecks: Ignore globals in checks when check-globals is none --- llvm/utils/UpdateTestChecks/common.py | 15 +++++++++++++-- llvm/utils/update_cc_test_checks.py | 2 +- llvm/utils/update_test_checks.py | 2 +- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/llvm/utils/UpdateTestChecks/common.py b/llvm/utils/UpdateTestChecks/common.py index 1a875c2b523e4..05d4f81dc3544 100644 --- a/llvm/utils/UpdateTestChecks/common.py +++ b/llvm/utils/UpdateTestChecks/common.py @@ -982,6 +982,7 @@ def get_failed_prefixes(self): ##### Generator of LLVM IR CHECK lines SCRUB_IR_COMMENT_RE = re.compile(r"\s*;.*") +SCRUB_IR_FUNC_META_RE = re.compile(r'((?:\!(?!dbg\b)[a-zA-Z_]\w*(?:\s+![0-9]+)?)\s*)+') # TODO: We should also derive check lines for global, debug, loop declarations, etc.. @@ -1086,6 +1087,7 @@ def __init__( nameless_values: List[NamelessValue], regexp_prefix, regexp_suffix, + no_meta_details = False ): self._version = version self._mode = mode @@ -1093,6 +1095,7 @@ def __init__( self._regexp_prefix = regexp_prefix self._regexp_suffix = regexp_suffix + self._no_meta_details = no_meta_details self._regexp, _ = self._build_regexp(False, False) ( @@ -1146,6 +1149,9 @@ def get_regexp(self): def get_unstable_globals_regexp(self): return self._unstable_globals_regexp + def no_meta_details(self): + return self._no_meta_details + # The entire match is group 0, the prefix has one group (=1), the entire # IR_VALUE_REGEXP_STRING is one group (=2), and then the nameless values start. FIRST_NAMELESS_GROUP_IN_MATCH = 3 @@ -1174,7 +1180,7 @@ def get_nameless_value_from_match(self, match) -> NamelessValue: return self.get_match_info(match)[1] -def make_ir_generalizer(version): +def make_ir_generalizer(version, no_meta_details): values = [] if version >= 5: @@ -1223,7 +1229,7 @@ def make_ir_generalizer(version): # not (unstable_ids_only and nameless_value.match_literally) # ] - return GeneralizerInfo(version, GeneralizerInfo.MODE_IR, values, prefix, suffix) + return GeneralizerInfo(version, GeneralizerInfo.MODE_IR, values, prefix, suffix, no_meta_details) def make_asm_generalizer(version): @@ -1725,6 +1731,7 @@ def generalize_check_lines( original_check_lines=None, *, unstable_globals_only=False, + no_meta_details = False, ): if unstable_globals_only: regexp = ginfo.get_unstable_globals_regexp() @@ -1754,6 +1761,9 @@ def escape_braces(match_obj): break # Ignore any comments, since the check lines will too. scrubbed_line = SCRUB_IR_COMMENT_RE.sub(r"", line) + # Ignore the metadata details if check global is none + if no_meta_details: + scrubbed_line = SCRUB_IR_FUNC_META_RE.sub(r"{{.*}}", scrubbed_line) lines[i] = scrubbed_line if not preserve_names: @@ -1985,6 +1995,7 @@ def add_checks( global_vars_seen, preserve_names, original_check_lines=[], + no_meta_details=ginfo.no_meta_details() )[0] func_name_separator = func_dict[checkprefix][func_name].func_name_separator if "[[" in args_and_sig: diff --git a/llvm/utils/update_cc_test_checks.py b/llvm/utils/update_cc_test_checks.py index 7a4796eaabb3b..7b8fff6f24c08 100755 --- a/llvm/utils/update_cc_test_checks.py +++ b/llvm/utils/update_cc_test_checks.py @@ -368,7 +368,7 @@ def main(): # Store only filechecked runlines. filecheck_run_list = [i for i in run_list if i[0]] - ginfo = common.make_ir_generalizer(version=ti.args.version) + ginfo = common.make_ir_generalizer(ti.args.version, ti.args.check_globals == "none") builder = common.FunctionTestBuilder( run_list=filecheck_run_list, flags=ti.args, diff --git a/llvm/utils/update_test_checks.py b/llvm/utils/update_test_checks.py index b413c253e3975..e71910bbb7e42 100755 --- a/llvm/utils/update_test_checks.py +++ b/llvm/utils/update_test_checks.py @@ -153,7 +153,7 @@ def main(): # now, we just ignore all but the last. prefix_list.append((check_prefixes, tool_cmd_args, preprocess_cmd)) - ginfo = common.make_ir_generalizer(ti.args.version) + ginfo = common.make_ir_generalizer(ti.args.version, ti.args.check_globals == "none") global_vars_seen_dict = {} builder = common.FunctionTestBuilder( run_list=prefix_list, From 0752d400441e7e35f977e6afa2c751ee3fdcb395 Mon Sep 17 00:00:00 2001 From: Jinsong Ji Date: Fri, 24 Jan 2025 00:04:32 +0100 Subject: [PATCH 2/3] Add test --- .../Inputs/global_none_meta.ll | 33 +++++++++++++++++++ .../Inputs/global_none_meta.ll.expected | 33 +++++++++++++++++++ .../update_test_checks/global_none_meta.test | 3 ++ 3 files changed, 69 insertions(+) create mode 100644 llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/global_none_meta.ll create mode 100644 llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/global_none_meta.ll.expected create mode 100644 llvm/test/tools/UpdateTestChecks/update_test_checks/global_none_meta.test diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/global_none_meta.ll b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/global_none_meta.ll new file mode 100644 index 0000000000000..b9fd8a47df14b --- /dev/null +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/global_none_meta.ll @@ -0,0 +1,33 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals none --version 5 +; RUN: opt < %s -S | FileCheck %s + +; Function Attrs: convergent noinline nounwind +declare hidden spir_func void @__cxx_global_var_init() #0 + +; Function Attrs: convergent noinline nounwind +define hidden spir_kernel void @_GLOBAL__sub_I_global_init.clcpp() #0 !kernel_arg_addr_space !4 !kernel_arg_access_qual !4 !kernel_arg_type !4 !kernel_arg_base_type !4 !kernel_arg_type_qual !4 { +; CHECK-LABEL: define hidden spir_kernel void @_GLOBAL__sub_I_global_init.clcpp( +; CHECK-SAME: ) #[[ATTR0:[0-9]+]] {{.*}}{ +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: call spir_func void @__cxx_global_var_init() +; CHECK-NEXT: ret void +; +entry: + call spir_func void @__cxx_global_var_init() + ret void +} + +attributes #0 = { convergent noinline nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" } + +!llvm.module.flags = !{!0} +!opencl.ocl.version = !{!1} +!opencl.cxx.version = !{!2} +!opencl.spir.version = !{!1} +!llvm.ident = !{!3} + +!0 = !{i32 1, !"wchar_size", i32 4} +!1 = !{i32 2, i32 0} +!2 = !{i32 1, i32 0} +!3 = !{!"clang version 20.0.0git"} +!4 = !{} + diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/global_none_meta.ll.expected b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/global_none_meta.ll.expected new file mode 100644 index 0000000000000..b9fd8a47df14b --- /dev/null +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/global_none_meta.ll.expected @@ -0,0 +1,33 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals none --version 5 +; RUN: opt < %s -S | FileCheck %s + +; Function Attrs: convergent noinline nounwind +declare hidden spir_func void @__cxx_global_var_init() #0 + +; Function Attrs: convergent noinline nounwind +define hidden spir_kernel void @_GLOBAL__sub_I_global_init.clcpp() #0 !kernel_arg_addr_space !4 !kernel_arg_access_qual !4 !kernel_arg_type !4 !kernel_arg_base_type !4 !kernel_arg_type_qual !4 { +; CHECK-LABEL: define hidden spir_kernel void @_GLOBAL__sub_I_global_init.clcpp( +; CHECK-SAME: ) #[[ATTR0:[0-9]+]] {{.*}}{ +; CHECK-NEXT: [[ENTRY:.*:]] +; CHECK-NEXT: call spir_func void @__cxx_global_var_init() +; CHECK-NEXT: ret void +; +entry: + call spir_func void @__cxx_global_var_init() + ret void +} + +attributes #0 = { convergent noinline nounwind "no-trapping-math"="true" "stack-protector-buffer-size"="8" } + +!llvm.module.flags = !{!0} +!opencl.ocl.version = !{!1} +!opencl.cxx.version = !{!2} +!opencl.spir.version = !{!1} +!llvm.ident = !{!3} + +!0 = !{i32 1, !"wchar_size", i32 4} +!1 = !{i32 2, i32 0} +!2 = !{i32 1, i32 0} +!3 = !{!"clang version 20.0.0git"} +!4 = !{} + diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/global_none_meta.test b/llvm/test/tools/UpdateTestChecks/update_test_checks/global_none_meta.test new file mode 100644 index 0000000000000..11a4665c44f92 --- /dev/null +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/global_none_meta.test @@ -0,0 +1,3 @@ +## Basic test checking that update_test_checks.py --check-globals none works correctly +# RUN: cp -f %S/Inputs/global_none_meta.ll %t.ll && %update_test_checks %t.ll --check-globals none +# RUN: diff -u %t.ll %S/Inputs/global_none_meta.ll.expected From 81e22597b7a0d6872fcb9906270526de86330c86 Mon Sep 17 00:00:00 2001 From: Jinsong Ji Date: Fri, 24 Jan 2025 01:14:57 +0100 Subject: [PATCH 3/3] format --- llvm/utils/UpdateTestChecks/common.py | 14 ++++++++------ llvm/utils/update_cc_test_checks.py | 4 +++- llvm/utils/update_test_checks.py | 4 +++- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/llvm/utils/UpdateTestChecks/common.py b/llvm/utils/UpdateTestChecks/common.py index 05d4f81dc3544..27a4f2e8f4056 100644 --- a/llvm/utils/UpdateTestChecks/common.py +++ b/llvm/utils/UpdateTestChecks/common.py @@ -982,7 +982,7 @@ def get_failed_prefixes(self): ##### Generator of LLVM IR CHECK lines SCRUB_IR_COMMENT_RE = re.compile(r"\s*;.*") -SCRUB_IR_FUNC_META_RE = re.compile(r'((?:\!(?!dbg\b)[a-zA-Z_]\w*(?:\s+![0-9]+)?)\s*)+') +SCRUB_IR_FUNC_META_RE = re.compile(r"((?:\!(?!dbg\b)[a-zA-Z_]\w*(?:\s+![0-9]+)?)\s*)+") # TODO: We should also derive check lines for global, debug, loop declarations, etc.. @@ -1087,7 +1087,7 @@ def __init__( nameless_values: List[NamelessValue], regexp_prefix, regexp_suffix, - no_meta_details = False + no_meta_details=False, ): self._version = version self._mode = mode @@ -1229,7 +1229,9 @@ def make_ir_generalizer(version, no_meta_details): # not (unstable_ids_only and nameless_value.match_literally) # ] - return GeneralizerInfo(version, GeneralizerInfo.MODE_IR, values, prefix, suffix, no_meta_details) + return GeneralizerInfo( + version, GeneralizerInfo.MODE_IR, values, prefix, suffix, no_meta_details + ) def make_asm_generalizer(version): @@ -1731,7 +1733,7 @@ def generalize_check_lines( original_check_lines=None, *, unstable_globals_only=False, - no_meta_details = False, + no_meta_details=False, ): if unstable_globals_only: regexp = ginfo.get_unstable_globals_regexp() @@ -1763,7 +1765,7 @@ def escape_braces(match_obj): scrubbed_line = SCRUB_IR_COMMENT_RE.sub(r"", line) # Ignore the metadata details if check global is none if no_meta_details: - scrubbed_line = SCRUB_IR_FUNC_META_RE.sub(r"{{.*}}", scrubbed_line) + scrubbed_line = SCRUB_IR_FUNC_META_RE.sub(r"{{.*}}", scrubbed_line) lines[i] = scrubbed_line if not preserve_names: @@ -1995,7 +1997,7 @@ def add_checks( global_vars_seen, preserve_names, original_check_lines=[], - no_meta_details=ginfo.no_meta_details() + no_meta_details=ginfo.no_meta_details(), )[0] func_name_separator = func_dict[checkprefix][func_name].func_name_separator if "[[" in args_and_sig: diff --git a/llvm/utils/update_cc_test_checks.py b/llvm/utils/update_cc_test_checks.py index 7b8fff6f24c08..7529d480b35dd 100755 --- a/llvm/utils/update_cc_test_checks.py +++ b/llvm/utils/update_cc_test_checks.py @@ -368,7 +368,9 @@ def main(): # Store only filechecked runlines. filecheck_run_list = [i for i in run_list if i[0]] - ginfo = common.make_ir_generalizer(ti.args.version, ti.args.check_globals == "none") + ginfo = common.make_ir_generalizer( + ti.args.version, ti.args.check_globals == "none" + ) builder = common.FunctionTestBuilder( run_list=filecheck_run_list, flags=ti.args, diff --git a/llvm/utils/update_test_checks.py b/llvm/utils/update_test_checks.py index e71910bbb7e42..4f83c02f19f6f 100755 --- a/llvm/utils/update_test_checks.py +++ b/llvm/utils/update_test_checks.py @@ -153,7 +153,9 @@ def main(): # now, we just ignore all but the last. prefix_list.append((check_prefixes, tool_cmd_args, preprocess_cmd)) - ginfo = common.make_ir_generalizer(ti.args.version, ti.args.check_globals == "none") + ginfo = common.make_ir_generalizer( + ti.args.version, ti.args.check_globals == "none" + ) global_vars_seen_dict = {} builder = common.FunctionTestBuilder( run_list=prefix_list,