Commit 005f12bf by Jakub Jelinek Committed by Jakub Jelinek

re PR debug/80025 (ICE w/ -O2 (-O3, -Ofast) -g -ftracer (infinite recursion in…

re PR debug/80025 (ICE w/ -O2 (-O3, -Ofast) -g -ftracer (infinite recursion in rtx_equal_for_cselib_1))

	PR debug/80025
	* cselib.h (rtx_equal_for_cselib_1): Add depth argument.
	(rtx_equal_for_cselib_p): Pass 0 to it.
	* cselib.c (cselib_hasher::equal): Likewise.
	(rtx_equal_for_cselib_1): Add depth argument.  If depth
	is 128, don't look up VALUE locs and punt.  Increment
	depth in recursive calls when walking VALUE locs.

	* gcc.dg/torture/pr80025.c: New test.

From-SVN: r246606
parent 62a76702
2017-03-31 Jakub Jelinek <jakub@redhat.com>
PR debug/80025
* cselib.h (rtx_equal_for_cselib_1): Add depth argument.
(rtx_equal_for_cselib_p): Pass 0 to it.
* cselib.c (cselib_hasher::equal): Likewise.
(rtx_equal_for_cselib_1): Add depth argument. If depth
is 128, don't look up VALUE locs and punt. Increment
depth in recursive calls when walking VALUE locs.
2017-03-31 Bernd Edlinger <bernd.edlinger@hotmail.de> 2017-03-31 Bernd Edlinger <bernd.edlinger@hotmail.de>
* gcov.c (md5sum_to_hex): Fix output of MD5 hex bytes. * gcov.c (md5sum_to_hex): Fix output of MD5 hex bytes.
......
...@@ -125,7 +125,7 @@ cselib_hasher::equal (const cselib_val *v, const key *x_arg) ...@@ -125,7 +125,7 @@ cselib_hasher::equal (const cselib_val *v, const key *x_arg)
/* We don't guarantee that distinct rtx's have different hash values, /* We don't guarantee that distinct rtx's have different hash values,
so we need to do a comparison. */ so we need to do a comparison. */
for (l = v->locs; l; l = l->next) for (l = v->locs; l; l = l->next)
if (rtx_equal_for_cselib_1 (l->loc, x, memmode)) if (rtx_equal_for_cselib_1 (l->loc, x, memmode, 0))
{ {
promote_debug_loc (l); promote_debug_loc (l);
return true; return true;
...@@ -834,7 +834,7 @@ autoinc_split (rtx x, rtx *off, machine_mode memmode) ...@@ -834,7 +834,7 @@ autoinc_split (rtx x, rtx *off, machine_mode memmode)
addresses, MEMMODE should be VOIDmode. */ addresses, MEMMODE should be VOIDmode. */
int int
rtx_equal_for_cselib_1 (rtx x, rtx y, machine_mode memmode) rtx_equal_for_cselib_1 (rtx x, rtx y, machine_mode memmode, int depth)
{ {
enum rtx_code code; enum rtx_code code;
const char *fmt; const char *fmt;
...@@ -867,6 +867,9 @@ rtx_equal_for_cselib_1 (rtx x, rtx y, machine_mode memmode) ...@@ -867,6 +867,9 @@ rtx_equal_for_cselib_1 (rtx x, rtx y, machine_mode memmode)
if (GET_CODE (y) == VALUE) if (GET_CODE (y) == VALUE)
return e == canonical_cselib_val (CSELIB_VAL_PTR (y)); return e == canonical_cselib_val (CSELIB_VAL_PTR (y));
if (depth == 128)
return 0;
for (l = e->locs; l; l = l->next) for (l = e->locs; l; l = l->next)
{ {
rtx t = l->loc; rtx t = l->loc;
...@@ -876,7 +879,7 @@ rtx_equal_for_cselib_1 (rtx x, rtx y, machine_mode memmode) ...@@ -876,7 +879,7 @@ rtx_equal_for_cselib_1 (rtx x, rtx y, machine_mode memmode)
list. */ list. */
if (REG_P (t) || MEM_P (t) || GET_CODE (t) == VALUE) if (REG_P (t) || MEM_P (t) || GET_CODE (t) == VALUE)
continue; continue;
else if (rtx_equal_for_cselib_1 (t, y, memmode)) else if (rtx_equal_for_cselib_1 (t, y, memmode, depth + 1))
return 1; return 1;
} }
...@@ -887,13 +890,16 @@ rtx_equal_for_cselib_1 (rtx x, rtx y, machine_mode memmode) ...@@ -887,13 +890,16 @@ rtx_equal_for_cselib_1 (rtx x, rtx y, machine_mode memmode)
cselib_val *e = canonical_cselib_val (CSELIB_VAL_PTR (y)); cselib_val *e = canonical_cselib_val (CSELIB_VAL_PTR (y));
struct elt_loc_list *l; struct elt_loc_list *l;
if (depth == 128)
return 0;
for (l = e->locs; l; l = l->next) for (l = e->locs; l; l = l->next)
{ {
rtx t = l->loc; rtx t = l->loc;
if (REG_P (t) || MEM_P (t) || GET_CODE (t) == VALUE) if (REG_P (t) || MEM_P (t) || GET_CODE (t) == VALUE)
continue; continue;
else if (rtx_equal_for_cselib_1 (x, t, memmode)) else if (rtx_equal_for_cselib_1 (x, t, memmode, depth + 1))
return 1; return 1;
} }
...@@ -914,12 +920,12 @@ rtx_equal_for_cselib_1 (rtx x, rtx y, machine_mode memmode) ...@@ -914,12 +920,12 @@ rtx_equal_for_cselib_1 (rtx x, rtx y, machine_mode memmode)
if (!xoff != !yoff) if (!xoff != !yoff)
return 0; return 0;
if (xoff && !rtx_equal_for_cselib_1 (xoff, yoff, memmode)) if (xoff && !rtx_equal_for_cselib_1 (xoff, yoff, memmode, depth))
return 0; return 0;
/* Don't recurse if nothing changed. */ /* Don't recurse if nothing changed. */
if (x != xorig || y != yorig) if (x != xorig || y != yorig)
return rtx_equal_for_cselib_1 (x, y, memmode); return rtx_equal_for_cselib_1 (x, y, memmode, depth);
return 0; return 0;
} }
...@@ -953,7 +959,8 @@ rtx_equal_for_cselib_1 (rtx x, rtx y, machine_mode memmode) ...@@ -953,7 +959,8 @@ rtx_equal_for_cselib_1 (rtx x, rtx y, machine_mode memmode)
case MEM: case MEM:
/* We have to compare any autoinc operations in the addresses /* We have to compare any autoinc operations in the addresses
using this MEM's mode. */ using this MEM's mode. */
return rtx_equal_for_cselib_1 (XEXP (x, 0), XEXP (y, 0), GET_MODE (x)); return rtx_equal_for_cselib_1 (XEXP (x, 0), XEXP (y, 0), GET_MODE (x),
depth);
default: default:
break; break;
...@@ -988,17 +995,20 @@ rtx_equal_for_cselib_1 (rtx x, rtx y, machine_mode memmode) ...@@ -988,17 +995,20 @@ rtx_equal_for_cselib_1 (rtx x, rtx y, machine_mode memmode)
/* And the corresponding elements must match. */ /* And the corresponding elements must match. */
for (j = 0; j < XVECLEN (x, i); j++) for (j = 0; j < XVECLEN (x, i); j++)
if (! rtx_equal_for_cselib_1 (XVECEXP (x, i, j), if (! rtx_equal_for_cselib_1 (XVECEXP (x, i, j),
XVECEXP (y, i, j), memmode)) XVECEXP (y, i, j), memmode, depth))
return 0; return 0;
break; break;
case 'e': case 'e':
if (i == 1 if (i == 1
&& targetm.commutative_p (x, UNKNOWN) && targetm.commutative_p (x, UNKNOWN)
&& rtx_equal_for_cselib_1 (XEXP (x, 1), XEXP (y, 0), memmode) && rtx_equal_for_cselib_1 (XEXP (x, 1), XEXP (y, 0), memmode,
&& rtx_equal_for_cselib_1 (XEXP (x, 0), XEXP (y, 1), memmode)) depth)
&& rtx_equal_for_cselib_1 (XEXP (x, 0), XEXP (y, 1), memmode,
depth))
return 1; return 1;
if (! rtx_equal_for_cselib_1 (XEXP (x, i), XEXP (y, i), memmode)) if (! rtx_equal_for_cselib_1 (XEXP (x, i), XEXP (y, i), memmode,
depth))
return 0; return 0;
break; break;
......
...@@ -82,7 +82,7 @@ extern void cselib_finish (void); ...@@ -82,7 +82,7 @@ extern void cselib_finish (void);
extern void cselib_process_insn (rtx_insn *); extern void cselib_process_insn (rtx_insn *);
extern bool fp_setter_insn (rtx_insn *); extern bool fp_setter_insn (rtx_insn *);
extern machine_mode cselib_reg_set_mode (const_rtx); extern machine_mode cselib_reg_set_mode (const_rtx);
extern int rtx_equal_for_cselib_1 (rtx, rtx, machine_mode); extern int rtx_equal_for_cselib_1 (rtx, rtx, machine_mode, int);
extern int references_value_p (const_rtx, int); extern int references_value_p (const_rtx, int);
extern rtx cselib_expand_value_rtx (rtx, bitmap, int); extern rtx cselib_expand_value_rtx (rtx, bitmap, int);
typedef rtx (*cselib_expand_callback)(rtx, bitmap, int, void *); typedef rtx (*cselib_expand_callback)(rtx, bitmap, int, void *);
...@@ -134,7 +134,7 @@ rtx_equal_for_cselib_p (rtx x, rtx y) ...@@ -134,7 +134,7 @@ rtx_equal_for_cselib_p (rtx x, rtx y)
if (x == y) if (x == y)
return 1; return 1;
return rtx_equal_for_cselib_1 (x, y, VOIDmode); return rtx_equal_for_cselib_1 (x, y, VOIDmode, 0);
} }
#endif /* GCC_CSELIB_H */ #endif /* GCC_CSELIB_H */
2017-03-31 Jakub Jelinek <jakub@redhat.com>
PR debug/80025
* gcc.dg/torture/pr80025.c: New test.
2017-03-30 Matthew Fortune <matthew.fortune@imgtec.com> 2017-03-30 Matthew Fortune <matthew.fortune@imgtec.com>
* gcc.target/mips/pr52125.c: Add -msym32. * gcc.target/mips/pr52125.c: Add -msym32.
......
/* PR debug/80025 */
/* { dg-do compile } */
/* { dg-options "-g -ftracer -w" } */
int a;
long int b, c;
long int
foo (void)
{
}
void
bar (int x, short int y, unsigned short int z)
{
}
int
baz (void)
{
a -= b;
b = !foo ();
bar (b ^= (c ^ 1) ? (c ^ 1) : foo (), (__INTPTR_TYPE__) &bar, a);
}
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