diff options
author | Steven Bosscher <steven@gcc.gnu.org> | 2014-06-07 21:12:03 +0000 |
---|---|---|
committer | Steven Bosscher <steven@gcc.gnu.org> | 2014-06-07 21:12:03 +0000 |
commit | 0dbaf51e0b8af46617c34f174fdb065f0f157ef4 (patch) | |
tree | a681c7cd97e0f0aece92ad93a8795a5e3edcab26 | |
parent | 51d2abebc4155932e23becf6304628a8105a2c51 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/gcse.c | 19 |
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 @@ -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 |