OSDN Git Service

gcc/ChangeLog:
authoraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 9 Mar 2007 20:13:10 +0000 (20:13 +0000)
committeraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 9 Mar 2007 20:13:10 +0000 (20:13 +0000)
PR rtl-optimization/30643
* cse.c (cse_insn): Recompute dest_hash after insert_regs for
(fold_rtx): Recurse, like before 2006-11-03.
gcc/testsuite/ChangeLog:
PR rtl-optimization/30643
* gcc.dg/pr30643.c: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@122760 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/cse.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr30643.c [new file with mode: 0644]

index beb4477..115b84f 100644 (file)
@@ -1,3 +1,9 @@
+2007-03-09  Alexandre Oliva  <aoliva@redhat.com>
+
+       PR rtl-optimization/30643
+       * cse.c (cse_insn): Recompute dest_hash after insert_regs for
+       (fold_rtx): Recurse, like before 2006-11-03.
+
 2007-03-09  DJ Delorie  <dj@redhat.com>
 
        * config/m32c/t-m32c (m32c-pragma.o): Add TM_H dependency to m32c-pragma.o
index c354041..6976d45 100644 (file)
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -1,6 +1,7 @@
 /* Common subexpression elimination for GNU compiler.
    Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998
-   1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
+   1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
+   Free Software Foundation, Inc.
 
 This file is part of GCC.
 
@@ -3045,11 +3046,37 @@ fold_rtx (rtx x, rtx insn)
       {
        rtx folded_arg = XEXP (x, i), const_arg;
        enum machine_mode mode_arg = GET_MODE (folded_arg);
+
+       switch (GET_CODE (folded_arg))
+         {
+         case MEM:
+         case REG:
+         case SUBREG:
+           const_arg = equiv_constant (folded_arg);
+           break;
+
+         case CONST:
+         case CONST_INT:
+         case SYMBOL_REF:
+         case LABEL_REF:
+         case CONST_DOUBLE:
+         case CONST_VECTOR:
+           const_arg = folded_arg;
+           break;
+
 #ifdef HAVE_cc0
-       if (CC0_P (folded_arg))
-         folded_arg = prev_insn_cc0, mode_arg = prev_insn_cc0_mode;
+         case CC0:
+           folded_arg = prev_insn_cc0;
+           mode_arg = prev_insn_cc0_mode;
+           const_arg = equiv_constant (folded_arg);
+           break;
 #endif
-       const_arg = equiv_constant (folded_arg);
+
+         default:
+           folded_arg = fold_rtx (folded_arg, insn);
+           const_arg = equiv_constant (folded_arg);
+           break;
+         }
 
        /* For the first three operands, see if the operand
           is constant or equivalent to a constant.  */
@@ -5254,8 +5281,11 @@ cse_insn (rtx insn, rtx libcall_insn)
                {
                  if (insert_regs (x, NULL, 0))
                    {
+                     rtx dest = SET_DEST (sets[i].rtl);
+
                      rehash_using_reg (x);
                      hash = HASH (x, mode);
+                     sets[i].dest_hash = HASH (dest, GET_MODE (dest));
                    }
                  elt = insert (x, NULL, hash, mode);
                }
index d3b6b98..d407ff6 100644 (file)
@@ -1,3 +1,8 @@
+2007-03-09  Alexandre Oliva  <aoliva@redhat.com>
+
+       PR rtl-optimization/30643
+       * gcc.dg/pr30643.c: New.
+
 2007-03-09  Chao-ying Fu  <fu@mips.com>
 
        * gcc.target/mips/mips32-dspr2-type.c: New test.
diff --git a/gcc/testsuite/gcc.dg/pr30643.c b/gcc/testsuite/gcc.dg/pr30643.c
new file mode 100644 (file)
index 0000000..67fe111
--- /dev/null
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-final { scan-assembler-not "undefined" } } */
+
+/* Make sure we optimize all calls away.  */
+
+extern void undefined (void);
+struct s { int a, b; };
+void bar (struct s *ps,  int *p, int *__restrict__ rp, int *__restrict__ rq)
+{
+  ps->a = 0;
+  ps->b = 1;
+  if (ps->a != 0)
+    undefined ();
+  p[0] = 0;
+  p[1] = 1;
+  if (p[0] != 0)
+    undefined ();
+  rp[0] = 0;
+  rq[0] = 1;
+  if (rp[0] != 0)
+    undefined ();
+}
+int main (void) {
+  return 0;
+}