aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-12-02 16:42:04 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2016-12-02 16:42:04 +0100
commiteb61d07edaf05f36151bfe4382777eaa79bce4d9 (patch)
tree26d9c8c50957315a60c37f181ee12d0fb67a19fb /gcc
parent8261e476cb64cee8891fa676202d1f42decdcd14 (diff)
downloadgcc-eb61d07edaf05f36151bfe4382777eaa79bce4d9.zip
gcc-eb61d07edaf05f36151bfe4382777eaa79bce4d9.tar.gz
gcc-eb61d07edaf05f36151bfe4382777eaa79bce4d9.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog12
-rw-r--r--gcc/config/rs6000/rs6000.c1
-rw-r--r--gcc/emit-rtl.c4
-rw-r--r--gcc/rtl.c28
-rw-r--r--gcc/valtrack.c4
5 files changed, 35 insertions, 14 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 65443a1..68d3588 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,15 @@
+2016-12-02 Jakub Jelinek <jakub@redhat.com>
+
+ 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 <andre.simoesdiasvieira@arm.com>
Thomas Preud'homme <thomas.preudhomme@arm.com>
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 425a885..59bd3fe 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 d2ac88b..4650540 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 3fac1931..0410f01 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 9a1ae2d..002f49f 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;