From eb61d07edaf05f36151bfe4382777eaa79bce4d9 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 2 Dec 2016 16:42:04 +0100 Subject: [PATCH] re PR target/78614 (ICE error: invalid rtl sharing found in the insn (verify_rtx_sharing) gcc/emit-rtl.c:2743) PR target/78614 * rtl.c (copy_rtx): Don't clear used flag here. (shallow_copy_rtx_stat): Clear used flag here unless code the rtx is shareable. * simplify-rtx.c (simplify_replace_fn_rtx): When copying rtx with 'E' in format, copy all vectors. * emit-rtl.c (copy_insn_1): Don't clear used flag here. * valtrack.c (cleanup_auto_inc_dec): Likewise. * config/rs6000/rs6000.c (rs6000_frame_related): Likewise. From-SVN: r243194 --- gcc/ChangeLog | 12 ++++++++++++ gcc/config/rs6000/rs6000.c | 1 - gcc/emit-rtl.c | 4 ---- gcc/rtl.c | 28 +++++++++++++++++++++++----- gcc/valtrack.c | 4 ---- 5 files changed, 35 insertions(+), 14 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 65443a19582..68d3588715b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2016-12-02 Jakub Jelinek + + PR target/78614 + * rtl.c (copy_rtx): Don't clear used flag here. + (shallow_copy_rtx_stat): Clear used flag here unless code the rtx + is shareable. + * simplify-rtx.c (simplify_replace_fn_rtx): When copying rtx with + 'E' in format, copy all vectors. + * emit-rtl.c (copy_insn_1): Don't clear used flag here. + * valtrack.c (cleanup_auto_inc_dec): Likewise. + * config/rs6000/rs6000.c (rs6000_frame_related): Likewise. + 2016-12-02 Andre Vieira Thomas Preud'homme diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 425a885e75b..59bd3fe5989 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -27186,7 +27186,6 @@ rs6000_frame_related (rtx_insn *insn, rtx reg, HOST_WIDE_INT val, { pat = shallow_copy_rtx (pat); XVEC (pat, 0) = shallow_copy_rtvec (XVEC (pat, 0)); - RTX_FLAG (pat, used) = 0; for (int i = 0; i < XVECLEN (pat, 0); i++) if (GET_CODE (XVECEXP (pat, 0, i)) == SET) diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index d2ac88bd510..46505400723 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -5552,10 +5552,6 @@ copy_insn_1 (rtx orig) us to explicitly document why we are *not* copying a flag. */ copy = shallow_copy_rtx (orig); - /* We do not copy the USED flag, which is used as a mark bit during - walks over the RTL. */ - RTX_FLAG (copy, used) = 0; - /* We do not copy JUMP, CALL, or FRAME_RELATED for INSNs. */ if (INSN_P (orig)) { diff --git a/gcc/rtl.c b/gcc/rtl.c index 3fac1931f3f..0410f019e51 100644 --- a/gcc/rtl.c +++ b/gcc/rtl.c @@ -318,10 +318,6 @@ copy_rtx (rtx orig) us to explicitly document why we are *not* copying a flag. */ copy = shallow_copy_rtx (orig); - /* We do not copy the USED flag, which is used as a mark bit during - walks over the RTL. */ - RTX_FLAG (copy, used) = 0; - format_ptr = GET_RTX_FORMAT (GET_CODE (copy)); for (i = 0; i < GET_RTX_LENGTH (GET_CODE (copy)); i++) @@ -367,7 +363,29 @@ shallow_copy_rtx_stat (const_rtx orig MEM_STAT_DECL) { const unsigned int size = rtx_size (orig); rtx const copy = ggc_alloc_rtx_def_stat (size PASS_MEM_STAT); - return (rtx) memcpy (copy, orig, size); + memcpy (copy, orig, size); + switch (GET_CODE (orig)) + { + /* RTX codes copy_rtx_if_shared_1 considers are shareable, + the used flag is often used for other purposes. */ + case REG: + case DEBUG_EXPR: + case VALUE: + CASE_CONST_ANY: + case SYMBOL_REF: + case CODE_LABEL: + case PC: + case CC0: + case RETURN: + case SIMPLE_RETURN: + case SCRATCH: + break; + default: + /* For all other RTXes clear the used flag on the copy. */ + RTX_FLAG (copy, used) = 0; + break; + } + return copy; } /* Nonzero when we are generating CONCATs. */ diff --git a/gcc/valtrack.c b/gcc/valtrack.c index 9a1ae2def17..002f49fa6ee 100644 --- a/gcc/valtrack.c +++ b/gcc/valtrack.c @@ -119,10 +119,6 @@ cleanup_auto_inc_dec (rtx src, machine_mode mem_mode ATTRIBUTE_UNUSED) us to explicitly document why we are *not* copying a flag. */ x = shallow_copy_rtx (x); - /* We do not copy the USED flag, which is used as a mark bit during - walks over the RTL. */ - RTX_FLAG (x, used) = 0; - /* We do not copy FRAME_RELATED for INSNs. */ if (INSN_P (x)) RTX_FLAG (x, frame_related) = 0; -- 2.30.2