summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authoraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>2007-03-09 20:13:10 +0000
committeraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>2007-03-09 20:13:10 +0000
commit06320855211a99597e4d4489a1816fb8712daf14 (patch)
tree709013022c7b1d9984a66229cbe7d5f71cc86b89 /gcc
parentf58c51a5acdfd4e721f6a3874d6771d31bbc96bf (diff)
downloadgcc-06320855211a99597e4d4489a1816fb8712daf14.tar.gz
gcc/ChangeLog:
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/cse.c38
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr30643.c26
4 files changed, 71 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index beb4477d169..115b84f0d5a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/cse.c b/gcc/cse.c
index c354041b01f..6976d455753 100644
--- 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);
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index d3b6b98fd58..d407ff64bdf 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 00000000000..67fe111a77f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr30643.c
@@ -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;
+}