From: aoliva Date: Fri, 9 Mar 2007 20:13:10 +0000 (+0000) Subject: gcc/ChangeLog: X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=06320855211a99597e4d4489a1816fb8712daf14;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index beb4477d1692..115b84f0d5a4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-03-09 Alexandre Oliva + + 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 * 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 c354041b01fe..6976d455753c 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 d3b6b98fd587..d407ff64bdf7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-03-09 Alexandre Oliva + + PR rtl-optimization/30643 + * gcc.dg/pr30643.c: New. + 2007-03-09 Chao-ying Fu * 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 000000000000..67fe111a77f1 --- /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; +}