[llvm-commits] [llvm-gcc-4.2] r43325 - /llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
Dale Johannesen
dalej at apple.com
Wed Oct 24 18:16:43 PDT 2007
Author: johannes
Date: Wed Oct 24 20:16:42 2007
New Revision: 43325
URL: http://llvm.org/viewvc/llvm-project?rev=43325&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.2/trunk/gcc/llvm-convert.cpp
Modified: llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp?rev=43325&r1=43324&r2=43325&view=diff
==============================================================================
--- llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp (original)
+++ llvm-gcc-4.2/trunk/gcc/llvm-convert.cpp Wed Oct 24 20:16:42 2007
@@ -2540,7 +2540,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
@@ -2549,6 +2549,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