[Sema] Make the atomic builtins more efficient by reducing volatility
authorDavid Majnemer <david.majnemer@gmail.com>
Wed, 3 Jun 2015 00:26:35 +0000 (00:26 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Wed, 3 Jun 2015 00:26:35 +0000 (00:26 +0000)
The parameter types and return type do not need to be volatile just
because the pointer type's pointee type is volatile qualified.  This is
an unnecessary pessimization.

llvm-svn: 238892

clang/lib/Sema/SemaChecking.cpp
clang/test/CodeGen/atomic-ops.c

index 23a6fc3..c3b81b6 100644 (file)
@@ -1604,6 +1604,10 @@ ExprResult Sema::SemaAtomicOpsOverloaded(ExprResult TheCallResult,
     return ExprError();
   }
 
+  // atomic_fetch_or takes a pointer to a volatile 'A'.  We shouldn't let the
+  // volatile-ness of the pointee-type inject itself into the result or the
+  // other operands.
+  ValType.removeLocalVolatile();
   QualType ResultType = ValType;
   if (Form == Copy || Form == GNUXchg || Form == Init)
     ResultType = Context.VoidTy;
index 733c60e..13ab5f1 100644 (file)
@@ -105,6 +105,14 @@ int fi3e(atomic_int *i) {
   return atomic_fetch_or(i, 1);
 }
 
+int fi3f(int *i) {
+  // CHECK-LABEL: @fi3f
+  // CHECK-NOT: store volatile
+  // CHECK: atomicrmw or
+  // CHECK-NOT: {{ or }}
+  return __atomic_fetch_or(i, (short)1, memory_order_seq_cst);
+}
+
 _Bool fi4(_Atomic(int) *i) {
   // CHECK-LABEL: @fi4(
   // CHECK: [[PAIR:%[.0-9A-Z_a-z]+]] = cmpxchg i32* [[PTR:%[.0-9A-Z_a-z]+]], i32 [[EXPECTED:%[.0-9A-Z_a-z]+]], i32 [[DESIRED:%[.0-9A-Z_a-z]+]]