From: Mircea Trofin Date: Fri, 11 Dec 2020 00:15:18 +0000 (-0800) Subject: [utils] Fix UpdateTestChecks case where 2 runs differ for last label X-Git-Tag: llvmorg-13-init~3355 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e2dc306b1ac71258e6ce40a66e778527f282c355;p=platform%2Fupstream%2Fllvm.git [utils] Fix UpdateTestChecks case where 2 runs differ for last label Two RUN lines produce outputs that, each, have some common parts and some different parts. The common parts are checked under label A. The differing parts are associated to a function and checked under labels B and C, respectivelly. When build_function_body_dictionary is called for the first RUN line, it will attribute the function body to labels A and C. When the second RUN is passed to build_function_body_dictionary, it sees that the function body under A is different from what it has. If in this second RUN line, A were at the end of the prefixes list, A's body is still kept associated with the first run's function. When we output the function body (i.e. add_checks), we stop after emitting for the first prefix matching that function. So we end up with the wrong function body (first RUN's A-association). There is no reason to special-case the last label in the prefixes list, and the fix is to always clear a label association if we find a RUN line where the body is different. Differential Revision: https://reviews.llvm.org/D93078 --- diff --git a/clang/test/utils/update_cc_test_checks/Inputs/prefix-never-matches.cpp b/clang/test/utils/update_cc_test_checks/Inputs/prefix-never-matches.cpp new file mode 100644 index 0000000..75bd5b1 --- /dev/null +++ b/clang/test/utils/update_cc_test_checks/Inputs/prefix-never-matches.cpp @@ -0,0 +1,6 @@ +// RUN: %clang_cc1 -triple=x86_64-unknown-linux-gnu -emit-llvm -O0 -o - %s | FileCheck %s -check-prefix=A +// RUN: %clang_cc1 -triple=x86_64-unknown-linux-gnu -emit-llvm -O3 -o - %s | FileCheck %s -check-prefix=A + +int foo(int i ) { + return 1; +} \ No newline at end of file diff --git a/clang/test/utils/update_cc_test_checks/prefix-never-matches.test b/clang/test/utils/update_cc_test_checks/prefix-never-matches.test new file mode 100644 index 0000000..7100377 --- /dev/null +++ b/clang/test/utils/update_cc_test_checks/prefix-never-matches.test @@ -0,0 +1,6 @@ +# RUN: cp -f %S/Inputs/prefix-never-matches.cpp %t.cpp +# RUN: %update_cc_test_checks %t.cpp 2>&1 | FileCheck %s +# RUN: FileCheck --input-file=%t.cpp %s --check-prefix=OUTPUT + +# CHECK: WARNING: Prefix A had conflicting output +# OUTPUT-NOT: A: \ No newline at end of file diff --git a/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/common-label-different-bodies-1.ll b/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/common-label-different-bodies-1.ll new file mode 100644 index 0000000..c5f2bc9 --- /dev/null +++ b/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/common-label-different-bodies-1.ll @@ -0,0 +1,11 @@ +; RUN: llc < %s -mtriple=i686-unknown-linux-gnu -mattr=+sse2 | FileCheck %s --check-prefixes=A,B +; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck %s --allow-unused-prefixes=true --check-prefixes=C,A,UNUSED + +declare <2 x i64> @llvm.bswap.v2i64(<2 x i64>) +; A: declare <2 x i64> @llvm.bswap.v2i64(<2 x i64>) + +define <2 x i64> @fold_v2i64() { +entry: + %r = call <2 x i64> @llvm.bswap.v2i64(<2 x i64> ) + ret <2 x i64> %r +} diff --git a/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/common-label-different-bodies-2.ll b/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/common-label-different-bodies-2.ll new file mode 100644 index 0000000..bc19904 --- /dev/null +++ b/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/common-label-different-bodies-2.ll @@ -0,0 +1,11 @@ +; RUN: llc < %s -mtriple=i686-unknown-linux-gnu -mattr=+sse2 | FileCheck %s --check-prefixes=A,B +; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck %s --check-prefixes=C,A + +declare <2 x i64> @llvm.bswap.v2i64(<2 x i64>) +; A: declare <2 x i64> @llvm.bswap.v2i64(<2 x i64>) + +define <2 x i64> @fold_v2i64() { +entry: + %r = call <2 x i64> @llvm.bswap.v2i64(<2 x i64> ) + ret <2 x i64> %r +} diff --git a/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/common-label-different-bodies-3.ll b/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/common-label-different-bodies-3.ll new file mode 100644 index 0000000..b478b0a --- /dev/null +++ b/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/common-label-different-bodies-3.ll @@ -0,0 +1,11 @@ +; RUN: llc < %s -mtriple=i686-unknown-linux-gnu -mattr=+sse2 | FileCheck %s --check-prefixes=A,B +; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck %s --check-prefixes=A,C + +declare <2 x i64> @llvm.bswap.v2i64(<2 x i64>) +; A: declare <2 x i64> @llvm.bswap.v2i64(<2 x i64>) + +define <2 x i64> @fold_v2i64() { +entry: + %r = call <2 x i64> @llvm.bswap.v2i64(<2 x i64> ) + ret <2 x i64> %r +} diff --git a/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/prefix-never-matches.ll b/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/prefix-never-matches.ll new file mode 100644 index 0000000..fe50a82 --- /dev/null +++ b/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/Inputs/prefix-never-matches.ll @@ -0,0 +1,10 @@ +; RUN: llc < %s -mtriple=i686-unknown-linux-gnu -mattr=+sse2 | FileCheck %s --check-prefixes=A +; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu | FileCheck %s --check-prefixes=A + +declare <2 x i64> @llvm.bswap.v2i64(<2 x i64>) + +define <2 x i64> @fold_v2i64() { +entry: + %r = call <2 x i64> @llvm.bswap.v2i64(<2 x i64> ) + ret <2 x i64> %r +} diff --git a/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/common-label-different-bodies.test b/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/common-label-different-bodies.test new file mode 100644 index 0000000..409114d --- /dev/null +++ b/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/common-label-different-bodies.test @@ -0,0 +1,14 @@ +# REQUIRES: x86-registered-target + +# RUN: cp -f %S/Inputs/common-label-different-bodies-1.ll %t-1.ll +# RUN: cp -f %S/Inputs/common-label-different-bodies-2.ll %t-2.ll +# RUN: cp -f %S/Inputs/common-label-different-bodies-3.ll %t-3.ll +# RUN: %update_llc_test_checks %t-1.ll +# RUN: %update_llc_test_checks %t-2.ll +# RUN: %update_llc_test_checks %t-3.ll +# RUN: FileCheck --input-file=%t-1.ll %s +# RUN: FileCheck --input-file=%t-2.ll %s +# RUN: FileCheck --input-file=%t-3.ll %s + +# CHECK: B-LABEL: fold_v2i64 +# CHECK-NOT: A-LABEL: fold_v2i64 \ No newline at end of file diff --git a/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/prefix-never-matches.test b/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/prefix-never-matches.test new file mode 100644 index 0000000..c8b15cd --- /dev/null +++ b/llvm/test/tools/UpdateTestChecks/update_llc_test_checks/prefix-never-matches.test @@ -0,0 +1,8 @@ +# REQUIRES: x86-registered-target + +# RUN: cp -f %S/Inputs/prefix-never-matches.ll %t.ll +# RUN: %update_llc_test_checks %t.ll 2>&1 | FileCheck %s +# RUN: FileCheck --input-file=%t.ll %s --check-prefix=OUTPUT + +# CHECK: WARNING: Prefix A had conflicting output +# OUTPUT-NOT: A: \ No newline at end of file diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/prefix-never-matches.ll b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/prefix-never-matches.ll new file mode 100644 index 0000000..972ec53 --- /dev/null +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/Inputs/prefix-never-matches.ll @@ -0,0 +1,7 @@ +; RUN: opt -O0 -S < %s | FileCheck %s -check-prefix=A +; RUN: opt -O3 -S < %s | FileCheck %s -check-prefix=A + +define i32 @foo(i32 %i) { + %r = add i32 1, 1 + ret i32 %r +} \ No newline at end of file diff --git a/llvm/test/tools/UpdateTestChecks/update_test_checks/prefix-never-matches.test b/llvm/test/tools/UpdateTestChecks/update_test_checks/prefix-never-matches.test new file mode 100644 index 0000000..d6d1634 --- /dev/null +++ b/llvm/test/tools/UpdateTestChecks/update_test_checks/prefix-never-matches.test @@ -0,0 +1,6 @@ +# RUN: cp -f %S/Inputs/prefix-never-matches.ll %t.ll +# RUN: %update_test_checks %t.ll 2>&1 | FileCheck %s +# RUN: FileCheck --input-file=%t.ll %s --check-prefix=OUTPUT + +# CHECK: WARNING: Prefix A had conflicting output +# OUTPUT-NOT: A: \ No newline at end of file diff --git a/llvm/utils/UpdateTestChecks/common.py b/llvm/utils/UpdateTestChecks/common.py index 74c9238..8cd90de 100644 --- a/llvm/utils/UpdateTestChecks/common.py +++ b/llvm/utils/UpdateTestChecks/common.py @@ -258,6 +258,20 @@ class function_body(object): def __str__(self): return self.scrub +def get_failed_prefixes(func_dict): + # This returns the list of those prefixes that failed to match any function, + # because there were conflicting bodies produced by different RUN lines, in + # all instances of the prefix. Effectivelly, this prefix is unused and should + # be removed. + for prefix in func_dict: + if (not [fct for fct in func_dict[prefix] + if func_dict[prefix][fct] is not None]): + yield prefix + +def warn_on_failed_prefixes(func_dict): + for prefix in get_failed_prefixes(func_dict): + warn('Prefix %s had conflicting output from different RUN lines for all functions' % (prefix,)) + def build_function_body_dictionary(function_re, scrubber, scrubber_args, raw_tool_output, prefixes, func_dict, func_order, verbose, record_args, check_attributes): for m in function_re.finditer(raw_tool_output): if not m: @@ -287,20 +301,28 @@ def build_function_body_dictionary(function_re, scrubber, scrubber_args, raw_too print(' ' + l, file=sys.stderr) for prefix in prefixes: if func in func_dict[prefix]: - if str(func_dict[prefix][func]) != scrubbed_body or (func_dict[prefix][func] and (func_dict[prefix][func].args_and_sig != args_and_sig or func_dict[prefix][func].attrs != attrs)): - if func_dict[prefix][func] and func_dict[prefix][func].is_same_except_arg_names(scrubbed_extra, args_and_sig, attrs): + if (func_dict[prefix][func] is None or + str(func_dict[prefix][func]) != scrubbed_body or + func_dict[prefix][func].args_and_sig != args_and_sig or + func_dict[prefix][func].attrs != attrs): + if (func_dict[prefix][func] is not None and + func_dict[prefix][func].is_same_except_arg_names(scrubbed_extra, + args_and_sig, + attrs)): func_dict[prefix][func].scrub = scrubbed_extra func_dict[prefix][func].args_and_sig = args_and_sig continue else: - if prefix == prefixes[-1]: - warn('Found conflicting asm under the same prefix: %r!' % (prefix,)) - else: - func_dict[prefix][func] = None - continue + # 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. + func_dict[prefix][func] = None + continue func_dict[prefix][func] = function_body(scrubbed_body, scrubbed_extra, args_and_sig, attrs) func_order[prefix].append(func) + warn_on_failed_prefixes(func_dict) ##### Generator of LLVM IR CHECK lines diff --git a/llvm/utils/update_test_prefix.py b/llvm/utils/update_test_prefix.py index 28122cc..4e9e188 100755 --- a/llvm/utils/update_test_prefix.py +++ b/llvm/utils/update_test_prefix.py @@ -31,7 +31,7 @@ def remove_prefix(i, d=0): t = re.search('Assertions have been autogenerated by (.*)', s) if t: s = os.popen('llvm/' + t.group(1) + ' ' + i + ' 2>&1').read() - if 'Found conflicting' in s: + if 'had conflicting output from different RUN lines for all functions' in s: return -1 s = os.popen('git diff ' + i).read() if re.search('\n(?:-+)\n', s) or re.search('\n[+-].*(?