From c5c5ba89acc96e48bf6eed87489fcda3efcd7fc3 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Tue, 12 Mar 2013 13:13:33 +0100 Subject: re PR rtl-optimization/56571 (ICE in copyprop_hardreg_forward_1, at regcprop.c (insn does not satisfy its constraints !)) PR middle-end/56571 * valtrack.c (cleanup_auto_inc_dec): Unshare clobbers originating from pseudos. * emit-rtl.c (verify_rtx_sharing): Likewise. (copy_insn_1): Likewise. * rtl.c (copy_rtx): Likewise. PR middle-end/56571 * gcc.c-torture/compile/pr56571.c: New testcase. From-SVN: r196612 --- gcc/valtrack.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'gcc/valtrack.c') diff --git a/gcc/valtrack.c b/gcc/valtrack.c index 87ce3f6..997f68b 100644 --- a/gcc/valtrack.c +++ b/gcc/valtrack.c @@ -71,7 +71,11 @@ cleanup_auto_inc_dec (rtx src, enum machine_mode mem_mode ATTRIBUTE_UNUSED) /* SCRATCH must be shared because they represent distinct values. */ return x; case CLOBBER: - if (REG_P (XEXP (x, 0)) && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER) + /* Share clobbers of hard registers (like cc0), but do not share pseudo reg + clobbers or clobbers of hard registers that originated as pseudos. + This is needed to allow safe register renaming. */ + if (REG_P (XEXP (x, 0)) && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER + && ORIGINAL_REGNO (XEXP (x, 0)) == REGNO (XEXP (x, 0))) return x; break; -- cgit v1.1