================
Comment at: lib/CodeGen/CGAtomic.cpp:1011
@@ +1010,3 @@
+  AtomicInfo AI(*this, LV);
+  return CGM.getCodeGenOpts().MSVolatile && !AI.shouldUseLibcall() &&
+         (LV.isVolatile() || hasVolatileMember(LV.getType()));
----------------
dvyukov wrote:
> I don't get the !AI.shouldUseLibcall() part.
> If the atomic operation would use a libcall, then you don't turn volatile 
> access into atomic? Why? How is it related to libcalls?
`shouldUseLibcall` means that than atomic operation is not suitably aligned or 
sized to be lowered to a `load atomic` or `store atomic` instruction.  These 
conditions are identical to the conditions that MSVC uses to say that a 
volatile load or store will also have acquire or release semantics.

================
Comment at: lib/CodeGen/CGAtomic.cpp:1017
@@ +1016,3 @@
+  return CGM.getCodeGenOpts().MSVolatile &&
+         getContext().getTargetInfo().hasBuiltinAtomic(
+             getContext().getTypeSize(Ty), getContext().getTypeAlign(Ty));
----------------
dvyukov wrote:
> Same here. How presence of builtin atomic affects this?
As I mentioned earlier, not all volatile loads or stores will turn into acquire 
or release loads and stores.

================
Comment at: lib/CodeGen/CGAtomic.cpp:1018
@@ +1017,3 @@
+         getContext().getTargetInfo().hasBuiltinAtomic(
+             getContext().getTypeSize(Ty), getContext().getTypeAlign(Ty));
+}
----------------
dvyukov wrote:
> In volatileIsAtomic you check that the value is volatile, but here you don't. 
> Please make then consistent. Either check in both or don't check in both.
I can't check it here because the type being passed in might not be qualified 
with volatile, it might be a record with a volatile field. I'd rather not make 
everyone who calls the other overload to have to manually check 
`LV.isVolatile() || hasVolatileMember(LV.getType())`.

I'll just rename one of these to make it clear what it does.

================
Comment at: lib/CodeGen/CGExpr.cpp:1141
@@ -1138,3 +1140,3 @@
   // Atomic operations have to be done on integral types.
-  if (Ty->isAtomicType()) {
+  if (Ty->isAtomicType() || VolatileIsAtomic) {
     LValue lvalue = LValue::MakeAddr(Addr, Ty,
----------------
dvyukov wrote:
> Won't this be overly fragile?
> MS semantics effectively turn volatile variables into atomic variables. So 
> the current isAtomicType becomes effectively useless, and whoever uses 
> isAtomicType must also remember to add volatileIsAtomic. And there is nothing 
> that reminds of that. Ty->isAtomicType() looks pretty much like what you need.
> It would be less fragile if you fix the isAtomic predicate itself.
> But I know very little about llvm internals, maybe it is not possible, or a 
> bad idea for some other reason. I don't know.
I don't think that is semantically correct. `isAtomicType()` is used for types 
which are "qualified" with `_Atomic`.

Moreover, we would still need to be able to determine the different from a real 
`_Atomic` qualified type and a MS `volatile` type in order to determine the 
memory operation's order.

================
Comment at: lib/CodeGen/CGStmtOpenMP.cpp:836
@@ -834,1 +835,3 @@
+                                        IsSeqCst ? llvm::SequentiallyConsistent
+                                                 : llvm::Unordered);
   // OpenMP, 2.12.6, atomic Construct
----------------
ABataev wrote:
> I'd say that if IsSeqCst is false, Atomic Ordering must be Monotonic rather 
> than Unordered.
> 1. According to OpenMP 4.0 "non-sequentially consistent atomic construct has 
> the same semantics as a
> memory_order_relaxed atomic operation in C++11/C11.". 
> 2. According to http://llvm.org/docs/Atomics.html "Monotonic... This 
> corresponds to the C++11/C11 memory_order_relaxed"
Good catch, will do.

================
Comment at: lib/CodeGen/CodeGenFunction.h:2159
@@ +2158,3 @@
+    } else {
+      IsSeqCst = false;
+      IsVolatile = true;
----------------
dvyukov wrote:
> Here you use IsSeqCst, but in EmitAtomicStore you use AO.
> Please make them consistent.
Sure, will do.

http://reviews.llvm.org/D7580

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/



_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to