aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Bosscher <steven@gcc.gnu.org>2014-06-07 21:12:03 +0000
committerSteven Bosscher <steven@gcc.gnu.org>2014-06-07 21:12:03 +0000
commit0dbaf51e0b8af46617c34f174fdb065f0f157ef4 (patch)
treea681c7cd97e0f0aece92ad93a8795a5e3edcab26
parent51d2abebc4155932e23becf6304628a8105a2c51 (diff)
downloadgcc-0dbaf51e0b8af46617c34f174fdb065f0f157ef4.zip
gcc-0dbaf51e0b8af46617c34f174fdb065f0f157ef4.tar.gz
gcc-0dbaf51e0b8af46617c34f174fdb065f0f157ef4.tar.bz2
gcse.c (can_assign_to_reg_without_clobbers_p): Do not let pointers from test_insn into GGC space escape via SET_SRC.
* gcse.c (can_assign_to_reg_without_clobbers_p): Do not let pointers from test_insn into GGC space escape via SET_SRC. From-SVN: r211347
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/gcse.c19
2 files changed, 17 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d7a35c3..34021b8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2014-06-07 Steven Bosscher <steven@gcc.gnu.org>
+
+ * gcse.c (can_assign_to_reg_without_clobbers_p): Do not let pointers
+ from test_insn into GGC space escape via SET_SRC.
+
2014-06-07 Eric Botcazou <ebotcazou@adacore.com>
* tree-ssa-tail-merge.c (same_succ_hash): Hash the static chain of a
diff --git a/gcc/gcse.c b/gcc/gcse.c
index 84a1147..a49cc65 100644
--- a/gcc/gcse.c
+++ b/gcc/gcse.c
@@ -849,6 +849,7 @@ can_assign_to_reg_without_clobbers_p (rtx x)
{
int num_clobbers = 0;
int icode;
+ bool can_assign = false;
/* If this is a valid operand, we are OK. If it's VOIDmode, we aren't. */
if (general_operand (x, GET_MODE (x)))
@@ -866,6 +867,7 @@ can_assign_to_reg_without_clobbers_p (rtx x)
FIRST_PSEUDO_REGISTER * 2),
const0_rtx));
NEXT_INSN (test_insn) = PREV_INSN (test_insn) = 0;
+ INSN_LOCATION (test_insn) = UNKNOWN_LOCATION;
}
/* Now make an insn like the one we would make when GCSE'ing and see if
@@ -874,16 +876,19 @@ can_assign_to_reg_without_clobbers_p (rtx x)
SET_SRC (PATTERN (test_insn)) = x;
icode = recog (PATTERN (test_insn), test_insn, &num_clobbers);
- if (icode < 0)
- return false;
- if (num_clobbers > 0 && added_clobbers_hard_reg_p (icode))
- return false;
+ /* If the test insn is valid and doesn't need clobbers, and the target also
+ has no objections, we're good. */
+ if (icode >= 0
+ && (num_clobbers == 0 || !added_clobbers_hard_reg_p (icode))
+ && ! (targetm.cannot_copy_insn_p
+ && targetm.cannot_copy_insn_p (test_insn)))
+ can_assign = true;
- if (targetm.cannot_copy_insn_p && targetm.cannot_copy_insn_p (test_insn))
- return false;
+ /* Make sure test_insn doesn't have any pointers into GC space. */
+ SET_SRC (PATTERN (test_insn)) = NULL_RTX;
- return true;
+ return can_assign;
}
/* Return nonzero if the operands of expression X are unchanged from the