[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