================
@@ -298,11 +298,15 @@ namespace {
 }
 
 Address AtomicInfo::CreateTempAlloca() const {
-  Address TempAlloca = CGF.CreateMemTemp(
-      (LVal.isBitField() && ValueSizeInBits > AtomicSizeInBits) ? ValueTy
-                                                                : AtomicTy,
-      getAtomicAlignment(),
-      "atomic-temp");
+  QualType TmpTy;
+  // Remove addrspace info from the atomic pointer element when making the
+  // alloca pointer element.
+  if (LVal.isBitField() && ValueSizeInBits > AtomicSizeInBits)
+    TmpTy = ValueTy;
+  else
+    TmpTy = AtomicTy.getUnqualifiedType();
----------------
vtjnash wrote:

So the complication here is that we're getting an atomic operation like `T 
_Atomic volatile addrspace(1)*` for some `T` which isn't an integer for some 
memory that probably isn't the stack, so now that atomic load needs to be 
bitcast into the actual `T`. But the C spec doesn't quite provide accurate 
enough information on whether it is acceptable to store `T` to the stack with 
all of those qualifiers. Prior to this PR, the qualifiers of T would be 
implicitly ignored when making the pointer and load/store for the on-stack 
bitcast here. But after this PR, getting the unqualified type for this purpose 
needs to be done explicitly instead.

https://github.com/llvm/llvm-project/pull/181390
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to