From 6aae324cce99057e81876888e5f83e20bad9f55d Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 2 May 2012 09:13:49 +0200 Subject: [PATCH] re PR rtl-optimization/53160 (likely wrong code bug) PR rtl-optimization/53160 * ree.c (combine_reaching_defs): Handle the case where cand->insn has been modified by ree pass already. * gcc.c-torture/execute/pr53160.c: New test. From-SVN: r187035 --- gcc/ChangeLog | 6 ++++ gcc/ree.c | 18 ++++++++++ gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gcc.c-torture/execute/pr53160.c | 35 +++++++++++++++++++ 4 files changed, 64 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr53160.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5cf6a8ff960..972f3cc0b5e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-05-02 Jakub Jelinek + + PR rtl-optimization/53160 + * ree.c (combine_reaching_defs): Handle the case where cand->insn + has been modified by ree pass already. + 2012-05-01 Ian Lance Taylor PR c/37303 diff --git a/gcc/ree.c b/gcc/ree.c index 86fd900213a..25ee7e263db 100644 --- a/gcc/ree.c +++ b/gcc/ree.c @@ -667,6 +667,24 @@ combine_reaching_defs (ext_cand *cand, const_rtx set_pat, ext_state *state) if (!outcome) return false; + /* If cand->insn has been already modified, update cand->mode to a wider + mode if possible, or punt. */ + if (state->modified[INSN_UID (cand->insn)].kind != EXT_MODIFIED_NONE) + { + enum machine_mode mode; + rtx set; + + if (state->modified[INSN_UID (cand->insn)].kind + != (cand->code == ZERO_EXTEND + ? EXT_MODIFIED_ZEXT : EXT_MODIFIED_SEXT) + || state->modified[INSN_UID (cand->insn)].mode != cand->mode + || (set = single_set (cand->insn)) == NULL_RTX) + return false; + mode = GET_MODE (SET_DEST (set)); + gcc_assert (GET_MODE_SIZE (mode) >= GET_MODE_SIZE (cand->mode)); + cand->mode = mode; + } + merge_successful = true; /* Go through the defs vector and try to merge all the definitions diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8f32793b77d..72d9379d0d9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-05-02 Jakub Jelinek + + PR rtl-optimization/53160 + * gcc.c-torture/execute/pr53160.c: New test. + 2012-05-01 Ian Lance Taylor PR c/37303 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr53160.c b/gcc/testsuite/gcc.c-torture/execute/pr53160.c new file mode 100644 index 00000000000..1187e08f088 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr53160.c @@ -0,0 +1,35 @@ +/* PR rtl-optimization/53160 */ + +extern void abort (void); + +int a, c = 1, d, e, g; +volatile int b; +volatile char f; +long h; +short i; + +void +foo (void) +{ + for (e = 0; e; ++e) + ; +} + +int +main () +{ + if (g) + (void) b; + foo (); + for (d = 0; d >= 0; d--) + { + short j = f; + int k = 0; + i = j ? j : j << k; + } + h = c == 0 ? 0 : i; + a = h; + if (a != 0) + abort (); + return 0; +}