--- /dev/null
+// 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
--- /dev/null
+# 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
--- /dev/null
+; 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> <i64 255, i64 -1>)
+ ret <2 x i64> %r
+}
--- /dev/null
+; 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> <i64 255, i64 -1>)
+ ret <2 x i64> %r
+}
--- /dev/null
+; 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> <i64 255, i64 -1>)
+ ret <2 x i64> %r
+}
--- /dev/null
+; 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> <i64 255, i64 -1>)
+ ret <2 x i64> %r
+}
--- /dev/null
+# 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
--- /dev/null
+# 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
--- /dev/null
+; 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
--- /dev/null
+# 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
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:
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
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[+-].*(?<!RUN):', s):