]> granicus.if.org Git - clang/commitdiff
One step to fixing up codegen for a=b, where a is a volatile struct.
authorMike Stump <mrs@apple.com>
Sat, 23 May 2009 04:13:59 +0000 (04:13 +0000)
committerMike Stump <mrs@apple.com>
Sat, 23 May 2009 04:13:59 +0000 (04:13 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72315 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGExprAgg.cpp

index 81e1a12de7a2a5ba7749ca640b93120a5e742690..13559acc0df3794d603d5fc1e1ac17a99683a1d0 100644 (file)
@@ -247,7 +247,7 @@ void AggExprEmitter::VisitBinAssign(const BinaryOperator *E) {
                             RValue::getAggregate(AggLoc));
   } else {
     // Codegen the RHS so that it stores directly into the LHS.
-    CGF.EmitAggExpr(E->getRHS(), LHS.getAddress(), false /*FIXME: VOLATILE LHS*/);
+    CGF.EmitAggExpr(E->getRHS(), LHS.getAddress(), LHS.isVolatileQualified());
     
     if (DestPtr == 0)
       return;
@@ -519,6 +519,18 @@ void CodeGenFunction::EmitAggregateCopy(llvm::Value *DestPtr,
   // FIXME: Handle variable sized types.
   const llvm::Type *IntPtr = llvm::IntegerType::get(LLVMPointerWidth);
   
+  // FIXME: If we have a volatile struct, the optimizer can remove what might
+  // appear to be `extra' memory ops:
+  //
+  // volatile struct { int i; } a, b;
+  //
+  // int main() {
+  //   a = b;
+  //   a = b;
+  // }
+  //
+  // either, we need to use a differnt call here, or the backend needs to be
+  // taught to not do this.
   Builder.CreateCall4(CGM.getMemCpyFn(),
                       DestPtr, SrcPtr,
                       // TypeInfo.first describes size in bits.