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 --- /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 --- /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 --- /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 --- /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 --- /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 --- /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 --- /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 --- /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 --- /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 --- /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 --- a/llvm/utils/UpdateTestChecks/common.py +++ b/llvm/utils/UpdateTestChecks/common.py @@ -258,6 +258,20 @@ 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,17 +301,24 @@ 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) diff --git a/llvm/utils/update_analyze_test_checks.py b/llvm/utils/update_analyze_test_checks.py --- a/llvm/utils/update_analyze_test_checks.py +++ b/llvm/utils/update_analyze_test_checks.py @@ -125,7 +125,8 @@ common.build_function_body_dictionary( common.ANALYZE_FUNCTION_RE, common.scrub_body, [], raw_tool_output, prefixes, func_dict, func_order, args.verbose, False, False) - + + common.warn_on_failed_prefixes(func_dict) is_in_function = False is_in_function_start = False prefix_set = set([prefix for prefixes, _ in prefix_list for prefix in prefixes]) diff --git a/llvm/utils/update_cc_test_checks.py b/llvm/utils/update_cc_test_checks.py --- a/llvm/utils/update_cc_test_checks.py +++ b/llvm/utils/update_cc_test_checks.py @@ -266,7 +266,8 @@ # mangled names. Forward all clang args for now. for k, v in get_line2spell_and_mangled(ti.args, clang_args).items(): line2spell_and_mangled_list[k].append(v) - + + common.warn_on_failed_prefixes(func_dict) global_vars_seen_dict = {} prefix_set = set([prefix for p in run_list for prefix in p[0]]) output_lines = [] diff --git a/llvm/utils/update_llc_test_checks.py b/llvm/utils/update_llc_test_checks.py --- a/llvm/utils/update_llc_test_checks.py +++ b/llvm/utils/update_llc_test_checks.py @@ -118,6 +118,8 @@ asm.build_function_body_dictionary_for_triple(ti.args, raw_tool_output, triple, prefixes, func_dict, func_order) + common.warn_on_failed_prefixes(func_dict) + is_in_function = False is_in_function_start = False func_name = None diff --git a/llvm/utils/update_test_checks.py b/llvm/utils/update_test_checks.py --- a/llvm/utils/update_test_checks.py +++ b/llvm/utils/update_test_checks.py @@ -117,7 +117,8 @@ common.OPT_FUNCTION_RE, common.scrub_body, [], raw_tool_output, prefixes, func_dict, func_order, ti.args.verbose, ti.args.function_signature, ti.args.check_attributes) - + + common.warn_on_failed_prefixes(func_dict) is_in_function = False is_in_function_start = False prefix_set = set([prefix for prefixes, _ in prefix_list for prefix in prefixes])