[llvm-commits] [llvm-gcc-4.0] r43324 - /llvm-gcc-4.0/trunk/gcc/llvm-convert.cpp

Dale Johannesen dalej at apple.com
Wed Oct 24 17:52:04 PDT 2007


Author: johannes
Date: Wed Oct 24 19:52:03 2007
New Revision: 43324

URL: http://llvm.org/viewvc/llvm-project?rev=43324&view=rev
Log:
Handle the case where the struct return output area
and one of the input parameters overlap.  This is
not optimal.
gcc.c-torture/execute/20010124-1.c


Modified:
    llvm-gcc-4.0/trunk/gcc/llvm-convert.cpp

Modified: llvm-gcc-4.0/trunk/gcc/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.0/trunk/gcc/llvm-convert.cpp?rev=43324&r1=43323&r2=43324&view=diff

==============================================================================
--- llvm-gcc-4.0/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.0/trunk/gcc/llvm-convert.cpp Wed Oct 24 19:52:03 2007
@@ -3020,7 +3020,7 @@
       Emit(TREE_OPERAND(exp, 1), LV.Ptr);
       EmitAggregateCopy(DestLoc, LV.Ptr, TREE_TYPE(exp), isVolatile, false,
                         Alignment);
-    } else if (!isVolatile) {
+    } else if (!isVolatile && TREE_CODE(TREE_OPERAND(exp, 0))!=RESULT_DECL) {
       Emit(TREE_OPERAND(exp, 1), LV.Ptr);
     } else {
       // Need to do a volatile store into TREE_OPERAND(exp, 1).  To do this, we
@@ -3029,6 +3029,10 @@
       // it gets the volatile memory access right.  It would be better if the
       // destloc pointer of 'Emit' had a flag that indicated it should be
       // volatile.
+      // We do this for stores into RESULT_DECL because it is possible for that
+      // memory area to overlap with the object being stored into it; see 
+      // gcc.c-torture/execute/20010124-1.c.
+
       Value *Tmp = CreateTemporary(ConvertType(TREE_TYPE(TREE_OPERAND(exp,1))));
       Emit(TREE_OPERAND(exp, 1), Tmp);
       EmitAggregateCopy(LV.Ptr, Tmp, TREE_TYPE(TREE_OPERAND(exp,1)),





More information about the llvm-commits mailing list