From 0781e93a6eaa71ec5d87be3bbeeeed053067f7ee Mon Sep 17 00:00:00 2001 From: =?utf8?q?Lu=C3=ADs=20Marques?= Date: Fri, 21 Feb 2020 19:26:09 +0000 Subject: [PATCH] [CodeGen][RISCV] Fix clang/test/CodeGen/atomic_ops.c for RISC-V By default the RISC-V target doesn't have the atomics standard extension enabled. The first RUN line in `clang/test/CodeGen/atomic_ops.c` didn't specify a target triple, which meant that on RISC-V Linux hosts it would target RISC-V, but because it used clang cc1 we didn't get the toolchain driver functionality to automatically turn on the extensions implied by the target triple (riscv64-linux includes atomics). This would cause the test to fail on RISC-V hosts. This patch changes the test to have RUN lines for two explicit targets, one with native atomics and one without. To work around FileCheck limitations and more accurately match the output, some tests now have separate prefixes for the two cases. Reviewers: jyknight, eli.friedman, lenary, efriedma Reviewed By: efriedma Differential Revision: https://reviews.llvm.org/D74847 --- clang/test/CodeGen/atomic_ops.c | 55 +++++++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 19 deletions(-) diff --git a/clang/test/CodeGen/atomic_ops.c b/clang/test/CodeGen/atomic_ops.c index a853ba9..c1eb1d0 100644 --- a/clang/test/CodeGen/atomic_ops.c +++ b/clang/test/CodeGen/atomic_ops.c @@ -1,7 +1,7 @@ -// XFAIL: hexagon,sparc -// (due to not having native load atomic support) -// RUN: %clang_cc1 -emit-llvm %s -o - | FileCheck %s -// RUN: %clang_cc1 -triple mips-linux-gnu -emit-llvm %s -o - | FileCheck %s +// RUN: %clang_cc1 -triple x86_64 -emit-llvm %s \ +// RUN: -o - | FileCheck -check-prefixes=CHECK,NATIVE %s +// RUN: %clang_cc1 -triple riscv32 -target-feature -a -emit-llvm %s \ +// RUN: -o - | FileCheck -check-prefixes=CHECK,LIBCALL %s void foo(int x) { @@ -9,32 +9,47 @@ void foo(int x) _Atomic(short) j = 0; // Check that multiply / divides on atomics produce a cmpxchg loop i *= 2; - // CHECK: mul nsw i32 - // CHECK: {{(cmpxchg i32*|i1 @__atomic_compare_exchange\(i32 4,)}} + // NATIVE: mul nsw i32 + // NATIVE: cmpxchg i32* + // LIBCALL: mul nsw i32 + // LIBCALL: i1 @__atomic_compare_exchange(i32 4, i /= 2; - // CHECK: sdiv i32 - // CHECK: {{(cmpxchg i32*|i1 @__atomic_compare_exchange\(i32 4, )}} + // NATIVE: sdiv i32 + // NATIVE: cmpxchg i32* + // LIBCALL: sdiv i32 + // LIBCALL: i1 @__atomic_compare_exchange(i32 4, j /= x; - // CHECK: sdiv i32 - // CHECK: {{(cmpxchg i16*|i1 @__atomic_compare_exchange\(i32 2, )}} + // NATIVE: sdiv i32 + // NATIVE: cmpxchg i16* + // LIBCALL: sdiv i32 + // LIBCALL: i1 @__atomic_compare_exchange(i32 2, } extern _Atomic _Bool b; _Bool bar() { -// CHECK-LABEL: @bar -// CHECK: %[[load:.*]] = load atomic i8, i8* @b seq_cst -// CHECK: %[[tobool:.*]] = trunc i8 %[[load]] to i1 -// CHECK: ret i1 %[[tobool]] +// NATIVE-LABEL: @bar +// NATIVE: %[[load:.*]] = load atomic i8, i8* @b seq_cst +// NATIVE: %[[tobool:.*]] = trunc i8 %[[load]] to i1 +// NATIVE: ret i1 %[[tobool]] +// LIBCALL-LABEL: @bar +// LIBCALL: call void @__atomic_load(i32 1, i8* @b, i8* %atomic-temp, i32 5) +// LIBCALL: %[[load:.*]] = load i8, i8* %atomic-temp +// LIBCALL: %[[tobool:.*]] = trunc i8 %[[load]] to i1 +// LIBCALL: ret i1 %[[tobool]] + return b; } extern _Atomic(_Complex int) x; void baz(int y) { -// CHECK-LABEL: @baz -// CHECK: {{store atomic|call void @__atomic_store}} +// NATIVE-LABEL: @baz +// NATIVE: store atomic +// LIBCALL-LABEL: @baz +// LIBCALL: call void @__atomic_store + x += y; } @@ -84,9 +99,11 @@ _Atomic(int) compound_and(_Atomic(int) in) { } _Atomic(int) compound_mul(_Atomic(int) in) { -// CHECK-LABEL: @compound_mul -// CHECK: cmpxchg i32* {{%.*}}, i32 {{%.*}}, i32 [[NEW:%.*]] seq_cst seq_cst -// CHECK: ret i32 [[NEW]] +// NATIVE-LABEL: @compound_mul +// NATIVE: cmpxchg i32* {{%.*}}, i32 {{%.*}}, i32 [[NEW:%.*]] seq_cst seq_cst +// NATIVE: ret i32 [[NEW]] +// LIBCALL-LABEL: @compound_mul +// LIBCALL: i1 @__atomic_compare_exchange(i32 4, return (in *= 5); } -- 2.7.4