re PR c/7411 (cistore.c:392: Internal compiler error in instantiate_virtual_regs_1...
authorEric Botcazou <ebotcazou@libertysurf.fr>
Mon, 7 Oct 2002 07:37:12 +0000 (09:37 +0200)
committerRichard Henderson <rth@gcc.gnu.org>
Mon, 7 Oct 2002 07:37:12 +0000 (00:37 -0700)
 PR c/7411
 * expr.c (expand_expr) [PLUS]: Simplify after the operands
 have been expanded in EXPAND_NORMAL mode.

Co-Authored-By: Volker Reichelt <reichelt@igpm.rwth-aachen.de>
From-SVN: r57882

gcc/ChangeLog
gcc/expr.c
gcc/testsuite/gcc.c-torture/compile/20021007-1.c [new file with mode: 0644]

index b31645380c0477a5b6c3f8d73578b5441417d185..47717e7d9975cce191426aa0d24ed735a91fdf30 100644 (file)
@@ -1,3 +1,10 @@
+2002-09-25  Eric Botcazou  <ebotcazou@libertysurf.fr>
+            Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+       PR c/7411
+       * expr.c (expand_expr) [PLUS]: Simplify after the operands
+       have been expanded in EXPAND_NORMAL mode.
+
 2002-10-06  Richard Henderson  <rth@redhat.com>
 
        * config/rs6000/rs6000.md (load_toc_v4_PIC_2): Fix base constraint.
index 01c360315b8f98a0d70d3f1da95b6b890b517850..e33d8145e1f8957580fefffde44e20831093ee0e 100644 (file)
@@ -7899,16 +7899,23 @@ expand_expr (exp, target, tmode, modifier)
            }
        }
 
+      if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1), 1))
+       subtarget = 0;
+
       /* No sense saving up arithmetic to be done
         if it's all in the wrong mode to form part of an address.
         And force_operand won't know whether to sign-extend or
         zero-extend.  */
       if ((modifier != EXPAND_SUM && modifier != EXPAND_INITIALIZER)
          || mode != ptr_mode)
-       goto binop;
-
-      if (! safe_from_p (subtarget, TREE_OPERAND (exp, 1), 1))
-       subtarget = 0;
+       {
+         op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, 0);
+         op1 = expand_expr (TREE_OPERAND (exp, 1), NULL_RTX, VOIDmode, 0);
+         temp = simplify_binary_operation (PLUS, mode, op0, op1);
+         if (temp)
+           return temp;
+         goto binop2;
+       }
 
       op0 = expand_expr (TREE_OPERAND (exp, 0), subtarget, VOIDmode, modifier);
       op1 = expand_expr (TREE_OPERAND (exp, 1), NULL_RTX, VOIDmode, modifier);
diff --git a/gcc/testsuite/gcc.c-torture/compile/20021007-1.c b/gcc/testsuite/gcc.c-torture/compile/20021007-1.c
new file mode 100644 (file)
index 0000000..de4c0de
--- /dev/null
@@ -0,0 +1,11 @@
+/* PR c/7411 */
+/* Verify that GCC simplifies the null addition to i before
+   virtual register substitution tries it and winds up with
+   a memory to memory move.  */
+                        
+void foo ()     
+{
+   int i = 0,j;
+   i+=j=0;
+}