Commit 2a1d78d8 by Jakub Jelinek Committed by Jakub Jelinek

re PR rtl-optimization/64756 (wrong code at -O3 on x86_64-linux-gnu (in 32-bit mode))

	PR rtl-optimization/64756
	* cse.c (invalidate_dest): New function.
	(cse_insn): Use it.  If dest != SET_DEST (sets[i].rtl) and
	HASH (SET_DEST (sets[i].rtl), mode) computation sets do_not_record,
	invalidate and do not record it.

	* gcc.c-torture/execute/pr64756.c: New test.

From-SVN: r220377
parent 3548abca
2015-02-03 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/64756
* cse.c (invalidate_dest): New function.
(cse_insn): Use it. If dest != SET_DEST (sets[i].rtl) and
HASH (SET_DEST (sets[i].rtl), mode) computation sets do_not_record,
invalidate and do not record it.
2015-02-03 Oleg Endo <olegendo@gcc.gnu.org> 2015-02-03 Oleg Endo <olegendo@gcc.gnu.org>
PR target/64660 PR target/64660
......
...@@ -1985,6 +1985,22 @@ invalidate (rtx x, machine_mode full_mode) ...@@ -1985,6 +1985,22 @@ invalidate (rtx x, machine_mode full_mode)
} }
} }
/* Invalidate DEST. Used when DEST is not going to be added
into the hash table for some reason, e.g. do_not_record
flagged on it. */
static void
invalidate_dest (rtx dest)
{
if (REG_P (dest)
|| GET_CODE (dest) == SUBREG
|| MEM_P (dest))
invalidate (dest, VOIDmode);
else if (GET_CODE (dest) == STRICT_LOW_PART
|| GET_CODE (dest) == ZERO_EXTRACT)
invalidate (XEXP (dest, 0), GET_MODE (dest));
}
/* Remove all expressions that refer to register REGNO, /* Remove all expressions that refer to register REGNO,
since they are already invalid, and we are about to since they are already invalid, and we are about to
mark that register valid again and don't want the old mark that register valid again and don't want the old
...@@ -5510,18 +5526,20 @@ cse_insn (rtx_insn *insn) ...@@ -5510,18 +5526,20 @@ cse_insn (rtx_insn *insn)
else if (do_not_record) else if (do_not_record)
{ {
if (REG_P (dest) || GET_CODE (dest) == SUBREG) invalidate_dest (dest);
invalidate (dest, VOIDmode);
else if (MEM_P (dest))
invalidate (dest, VOIDmode);
else if (GET_CODE (dest) == STRICT_LOW_PART
|| GET_CODE (dest) == ZERO_EXTRACT)
invalidate (XEXP (dest, 0), GET_MODE (dest));
sets[i].rtl = 0; sets[i].rtl = 0;
} }
if (sets[i].rtl != 0 && dest != SET_DEST (sets[i].rtl)) if (sets[i].rtl != 0 && dest != SET_DEST (sets[i].rtl))
{
do_not_record = 0;
sets[i].dest_hash = HASH (SET_DEST (sets[i].rtl), mode); sets[i].dest_hash = HASH (SET_DEST (sets[i].rtl), mode);
if (do_not_record)
{
invalidate_dest (SET_DEST (sets[i].rtl));
sets[i].rtl = 0;
}
}
#ifdef HAVE_cc0 #ifdef HAVE_cc0
/* If setting CC0, record what it was set to, or a constant, if it /* If setting CC0, record what it was set to, or a constant, if it
......
2015-02-03 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/64756
* gcc.c-torture/execute/pr64756.c: New test.
2015-02-03 Oleg Endo <olegendo@gcc.gnu.org> 2015-02-03 Oleg Endo <olegendo@gcc.gnu.org>
PR target/64660 PR target/64660
......
/* PR rtl-optimization/64756 */
int a, *tmp, **c = &tmp;
volatile int d;
static int *volatile *e = &tmp;
unsigned int f;
static void
fn1 (int *p)
{
int g;
for (; f < 1; f++)
for (g = 1; g >= 0; g--)
{
d || d;
*c = p;
if (tmp != &a)
__builtin_abort ();
*e = 0;
}
}
int
main ()
{
fn1 (&a);
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment