Index: clang/test/utils/update_cc_test_checks/Inputs/replace-value-regex-across-runs.c =================================================================== --- /dev/null +++ clang/test/utils/update_cc_test_checks/Inputs/replace-value-regex-across-runs.c @@ -0,0 +1,9 @@ +// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -emit-llvm -o - %s | \ +// RUN: FileCheck %s +// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -emit-llvm -o - %s | \ +// RUN: FileCheck %s + +void foo(void) { + #pragma omp target + ; +} Index: clang/test/utils/update_cc_test_checks/Inputs/replace-value-regex-across-runs.c.expected =================================================================== --- /dev/null +++ clang/test/utils/update_cc_test_checks/Inputs/replace-value-regex-across-runs.c.expected @@ -0,0 +1,15 @@ +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --replace-value-regex "__omp_offloading_[0-9a-z]+_[0-9a-z]+" +// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -emit-llvm -o - %s | \ +// RUN: FileCheck %s +// RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -fopenmp -emit-llvm -o - %s | \ +// RUN: FileCheck %s + +// CHECK-LABEL: @foo( +// CHECK-NEXT: entry: +// CHECK-NEXT: call void @{{__omp_offloading_[0-9a-z]+_[0-9a-z]+}}_foo_l7() #[[ATTR2:[0-9]+]] +// CHECK-NEXT: ret void +// +void foo(void) { + #pragma omp target + ; +} Index: clang/test/utils/update_cc_test_checks/replace-value-regex-across-runs.test =================================================================== --- /dev/null +++ clang/test/utils/update_cc_test_checks/replace-value-regex-across-runs.test @@ -0,0 +1,7 @@ +# Test that --replace-value-regex is applied correctly when multiple RUN lines +# use the same FileCheck prefix and have the same output. + +RUN: cp %S/Inputs/replace-value-regex-across-runs.c %t.c +RUN: %update_cc_test_checks %t.c \ +RUN: --replace-value-regex '__omp_offloading_[0-9a-z]+_[0-9a-z]+' +RUN: diff -u %S/Inputs/replace-value-regex-across-runs.c.expected %t.c Index: llvm/utils/UpdateTestChecks/common.py =================================================================== --- llvm/utils/UpdateTestChecks/common.py +++ llvm/utils/UpdateTestChecks/common.py @@ -350,27 +350,6 @@ for l in scrubbed_body.splitlines(): print(' ' + l, file=sys.stderr) for prefix in prefixes: - if func in self._func_dict[prefix]: - if (self._func_dict[prefix][func] is None or - str(self._func_dict[prefix][func]) != scrubbed_body or - self._func_dict[prefix][func].args_and_sig != args_and_sig or - self._func_dict[prefix][func].attrs != attrs): - if (self._func_dict[prefix][func] is not None and - self._func_dict[prefix][func].is_same_except_arg_names( - scrubbed_extra, - args_and_sig, - attrs)): - self._func_dict[prefix][func].scrub = scrubbed_extra - self._func_dict[prefix][func].args_and_sig = args_and_sig - continue - else: - # This means a previous RUN line produced a body for this function - # that is different from the one produced by this current RUN line, - # so the body can't be common accross RUN lines. We use None to - # indicate that. - self._func_dict[prefix][func] = None - continue - # Replace function names matching the regex. for regex in self._replace_value_regex: # Pattern that matches capture groups in the regex in leftmost order. @@ -393,7 +372,29 @@ func_repl = group_regex.sub(re.escape(g), func_repl, count=1) # Substitute function call names that match the regex with the same # capture groups set. - scrubbed_body = re.sub(func_repl, '{{' + func_repl + '}}', scrubbed_body) + scrubbed_body = re.sub(func_repl, '{{' + func_repl + '}}', + scrubbed_body) + + if func in self._func_dict[prefix]: + if (self._func_dict[prefix][func] is None or + str(self._func_dict[prefix][func]) != scrubbed_body or + self._func_dict[prefix][func].args_and_sig != args_and_sig or + self._func_dict[prefix][func].attrs != attrs): + if (self._func_dict[prefix][func] is not None and + self._func_dict[prefix][func].is_same_except_arg_names( + scrubbed_extra, + args_and_sig, + attrs)): + self._func_dict[prefix][func].scrub = scrubbed_extra + self._func_dict[prefix][func].args_and_sig = args_and_sig + continue + else: + # This means a previous RUN line produced a body for this function + # that is different from the one produced by this current RUN line, + # so the body can't be common accross RUN lines. We use None to + # indicate that. + self._func_dict[prefix][func] = None + continue self._func_dict[prefix][func] = function_body( scrubbed_body, scrubbed_extra, args_and_sig, attrs)