aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2002-03-18 22:25:50 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2002-03-18 22:25:50 +0000
commit1929c971b93d72d109d796c9977f3943a64e1d7a (patch)
treea61150ba3082d4f91fd8fd52b640fe7ad9a9343a
parent9d5e46be343e18f9798d68c52884a02c19cbc8e0 (diff)
downloadgcc-1929c971b93d72d109d796c9977f3943a64e1d7a.zip
gcc-1929c971b93d72d109d796c9977f3943a64e1d7a.tar.gz
gcc-1929c971b93d72d109d796c9977f3943a64e1d7a.tar.bz2
calls.c (precompute_arguments): Do not assume that temporaries can be destroyed after expanding the argument.
* calls.c (precompute_arguments): Do not assume that temporaries can be destroyed after expanding the argument. (expand_call): Likewise. From-SVN: r51011
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/calls.c11
-rw-r--r--gcc/testsuite/g++.dg/opt/alias2.C74
3 files changed, 80 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c44a30c..ecaedd0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2002-03-18 Mark Mitchell <mark@codesourcery.com>
+
+ * calls.c (precompute_arguments): Do not assume that temporaries
+ can be destroyed after expanding the argument.
+ (expand_call): Likewise.
+
2002-03-15 Eric Christopher <echristo@redhat.com>
* config/mips/mips.md (movdf_internal2): Add two new move constraints.
diff --git a/gcc/calls.c b/gcc/calls.c
index bbcc108..6771522 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -1511,14 +1511,9 @@ precompute_arguments (flags, num_actuals, args)
if (TREE_ADDRESSABLE (TREE_TYPE (args[i].tree_value)))
abort ();
- push_temp_slots ();
-
args[i].value
= expand_expr (args[i].tree_value, NULL_RTX, VOIDmode, 0);
- preserve_temp_slots (args[i].value);
- pop_temp_slots ();
-
/* ANSI doesn't require a sequence point here,
but PCC has one, so this will avoid some problems. */
emit_queue ();
@@ -2681,10 +2676,6 @@ expand_call (exp, target, ignore)
if (pass && (flags & ECF_LIBCALL_BLOCK))
NO_DEFER_POP;
- /* Push the temporary stack slot level so that we can free any
- temporaries we make. */
- push_temp_slots ();
-
#ifdef FINAL_REG_PARM_STACK_SPACE
reg_parm_stack_space = FINAL_REG_PARM_STACK_SPACE (args_size.constant,
args_size.var);
@@ -3334,8 +3325,6 @@ expand_call (exp, target, ignore)
if ((flags & ECF_MAY_BE_ALLOCA) && nonlocal_goto_handler_slots != 0)
emit_stack_save (SAVE_NONLOCAL, &nonlocal_goto_stack_level, NULL_RTX);
- pop_temp_slots ();
-
/* Free up storage we no longer need. */
for (i = 0; i < num_actuals; ++i)
if (args[i].aligned_regs)
diff --git a/gcc/testsuite/g++.dg/opt/alias2.C b/gcc/testsuite/g++.dg/opt/alias2.C
new file mode 100644
index 0000000..ea2bcb3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/alias2.C
@@ -0,0 +1,74 @@
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern "C" int printf (...);
+
+struct _Deque_iterator {
+ int _M_cur;
+ int x[2];
+ int* _M_node;
+
+ _Deque_iterator() : _M_cur(0), _M_node(0) {}
+ _Deque_iterator(const _Deque_iterator& __x)
+ : _M_cur(__x._M_cur),
+ _M_node(__x._M_node) {}
+};
+
+class _Deque_base
+{
+public:
+ int yy;
+
+ _Deque_base()
+ : _M_start()
+ { _M_initialize_map(); }
+ ~_Deque_base();
+
+ void _M_initialize_map();
+ _Deque_iterator _M_start;
+};
+
+
+_Deque_base::~_Deque_base() {
+ printf ("bb %x %x\n", this, *_M_start._M_node);
+}
+
+void
+_Deque_base::_M_initialize_map()
+{
+ yy = 0x123;
+ printf ("aa %x %x\n", this, yy);
+
+ _M_start._M_node = &yy;
+ _M_start._M_cur = yy;
+}
+
+
+class deque : protected _Deque_base
+{
+public:
+ deque () {}
+ deque(const deque& __x) {}
+ ~deque() {
+ _Deque_iterator i = _M_start;
+ }
+};
+
+
+
+class GeometryAddress {
+public:
+ GeometryAddress(deque addressStack) {}
+};
+
+void yyy (const GeometryAddress& gb)
+{
+}
+
+deque temp1;
+
+int main()
+{
+ yyy (GeometryAddress (temp1));
+ return 0;
+}