re PR middle-end/78540 (ICE: in df_refs_verify, at df-scan.c:4062 with -O -march=core2)

PR middle-end/78540
	* rtl.h (remove_reg_equal_equiv_notes): Return bool instead of void.
	* rtlanal.c (remove_reg_equal_equiv_notes): Return true if any
	note has been removed.
	* postreload.c (reload_combine_recognize_pattern): If
	remove_reg_equal_equiv_notes returns true, call df_notes_rescan.

	* gcc.dg/pr78540.c: New test.

From-SVN: r242937
This commit is contained in:
Jakub Jelinek 2016-11-28 23:51:29 +01:00 committed by Jakub Jelinek
parent de6aa93370
commit a5a4add7aa
6 changed files with 56 additions and 8 deletions

View File

@ -1,3 +1,12 @@
2016-11-28 Jakub Jelinek <jakub@redhat.com>
PR middle-end/78540
* rtl.h (remove_reg_equal_equiv_notes): Return bool instead of void.
* rtlanal.c (remove_reg_equal_equiv_notes): Return true if any
note has been removed.
* postreload.c (reload_combine_recognize_pattern): If
remove_reg_equal_equiv_notes returns true, call df_notes_rescan.
2016-11-28 Martin Sebor <msebor@redhat.com>
PR middle-end/78520

View File

@ -1192,10 +1192,11 @@ reload_combine_recognize_pattern (rtx_insn *insn)
/* Delete the reg-reg addition. */
delete_insn (insn);
if (reg_state[regno].offset != const0_rtx)
/* Previous REG_EQUIV / REG_EQUAL notes for PREV
are now invalid. */
remove_reg_equal_equiv_notes (prev);
if (reg_state[regno].offset != const0_rtx
/* Previous REG_EQUIV / REG_EQUAL notes for PREV
are now invalid. */
&& remove_reg_equal_equiv_notes (prev))
df_notes_rescan (prev);
reg_state[regno].use_index = RELOAD_COMBINE_MAX_USES;
return true;

View File

@ -3057,7 +3057,7 @@ extern void add_int_reg_note (rtx_insn *, enum reg_note, int);
extern void add_shallow_copy_of_reg_note (rtx_insn *, rtx);
extern rtx duplicate_reg_note (rtx);
extern void remove_note (rtx_insn *, const_rtx);
extern void remove_reg_equal_equiv_notes (rtx_insn *);
extern bool remove_reg_equal_equiv_notes (rtx_insn *);
extern void remove_reg_equal_equiv_notes_for_regno (unsigned int);
extern int side_effects_p (const_rtx);
extern int volatile_refs_p (const_rtx);

View File

@ -2351,22 +2351,28 @@ remove_note (rtx_insn *insn, const_rtx note)
}
}
/* Remove REG_EQUAL and/or REG_EQUIV notes if INSN has such notes. */
/* Remove REG_EQUAL and/or REG_EQUIV notes if INSN has such notes.
Return true if any note has been removed. */
void
bool
remove_reg_equal_equiv_notes (rtx_insn *insn)
{
rtx *loc;
bool ret = false;
loc = &REG_NOTES (insn);
while (*loc)
{
enum reg_note kind = REG_NOTE_KIND (*loc);
if (kind == REG_EQUAL || kind == REG_EQUIV)
*loc = XEXP (*loc, 1);
{
*loc = XEXP (*loc, 1);
ret = true;
}
else
loc = &XEXP (*loc, 1);
}
return ret;
}
/* Remove all REG_EQUAL and REG_EQUIV notes referring to REGNO. */

View File

@ -1,3 +1,8 @@
2016-11-28 Jakub Jelinek <jakub@redhat.com>
PR middle-end/78540
* gcc.dg/pr78540.c: New test.
2016-11-28 Martin Sebor <msebor@redhat.com>
PR middle-end/78520

View File

@ -0,0 +1,27 @@
/* PR middle-end/78540 */
/* { dg-do compile { target int128 } } */
/* { dg-options "-O2 -Wno-psabi" } */
/* { dg-additional-options "-march=core2" { target i?86-*-* x86_64-*-* } } */
typedef unsigned __int128 V __attribute__ ((vector_size (64)));
V g;
static inline V
foo (V a)
{
V b, c;
c[0] = 0;
a += 2281559097;
c ^= 0;
b[0] = 0;
return 1 + c + b + a;
}
V
bar ()
{
V a = g, b = g;
a[1] ^= 1;
b[foo (a)[0] & 3] |= 1;
return b;
}