r337410 - Support implicit _Atomic struct load / store
JF Bastien via cfe-commits
cfe-commits at lists.llvm.org
Wed Jul 18 11:01:41 PDT 2018
Author: jfb
Date: Wed Jul 18 11:01:41 2018
New Revision: 337410
URL: http://llvm.org/viewvc/llvm-project?rev=337410&view=rev
Log:
Support implicit _Atomic struct load / store
Summary:
Using _Atomic to do implicit load / store is just a seq_cst atomic_load / atomic_store. Stores currently assert in Sema::ImpCastExprToType with 'can't implicitly cast lvalue to rvalue with this cast kind', but that's erroneous. The codegen is fine as the test shows.
While investigating I found that Richard had found the problem here: https://reviews.llvm.org/D46112#1113557
<rdar://problem/40347123>
Reviewers: dexonsmith
Subscribers: cfe-commits, efriedma, rsmith, aaron.ballman
Differential Revision: https://reviews.llvm.org/D49458
Modified:
cfe/trunk/lib/Sema/Sema.cpp
cfe/trunk/test/CodeGen/atomic-ops.c
Modified: cfe/trunk/lib/Sema/Sema.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.cpp?rev=337410&r1=337409&r2=337410&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/Sema.cpp (original)
+++ cfe/trunk/lib/Sema/Sema.cpp Wed Jul 18 11:01:41 2018
@@ -481,6 +481,7 @@ ExprResult Sema::ImpCastExprToType(Expr
case CK_ArrayToPointerDecay:
case CK_FunctionToPointerDecay:
case CK_ToVoid:
+ case CK_NonAtomicToAtomic:
break;
}
}
Modified: cfe/trunk/test/CodeGen/atomic-ops.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/atomic-ops.c?rev=337410&r1=337409&r2=337410&view=diff
==============================================================================
--- cfe/trunk/test/CodeGen/atomic-ops.c (original)
+++ cfe/trunk/test/CodeGen/atomic-ops.c Wed Jul 18 11:01:41 2018
@@ -183,6 +183,18 @@ struct S {
double x;
};
+void implicit_store(_Atomic(struct S) *a, struct S s) {
+ // CHECK-LABEL: @implicit_store(
+ // CHECK: store atomic i64 %{{.*}}, i64* %{{.*}} seq_cst, align 8
+ *a = s;
+}
+
+struct S implicit_load(_Atomic(struct S) *a) {
+ // CHECK-LABEL: @implicit_load(
+ // CHECK: load atomic i64, i64* %{{.*}} seq_cst, align 8
+ return *a;
+}
+
struct S fd1(struct S *a) {
// CHECK-LABEL: @fd1
// CHECK: [[RETVAL:%.*]] = alloca %struct.S, align 4
More information about the cfe-commits
mailing list