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: r187036
This commit is contained in:
Jakub Jelinek 2012-05-02 09:19:41 +02:00 committed by Jakub Jelinek
parent f34547ccbe
commit e81686ec0b
4 changed files with 64 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2012-05-02 Jakub Jelinek <jakub@redhat.com>
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 Uros Bizjak <ubizjak@gmail.com>
Backport from mainline

View File

@ -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

View File

@ -1,3 +1,8 @@
2012-05-02 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/53160
* gcc.c-torture/execute/pr53160.c: New test.
2012-04-30 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/53148

View File

@ -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;
}