]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gcse.c (can_assign_to_reg_without_clobbers_p): Do not let pointers from test_insn...
authorSteven Bosscher <steven@gcc.gnu.org>
Sat, 7 Jun 2014 21:12:03 +0000 (21:12 +0000)
committerSteven Bosscher <steven@gcc.gnu.org>
Sat, 7 Jun 2014 21:12:03 +0000 (21:12 +0000)
* 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

gcc/ChangeLog
gcc/gcse.c

index d7a35c3f6a3a07c1e704997d30097e2b83e464e5..34021b8dbfc99133180a71aafeb94916685c4db3 100644 (file)
@@ -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
index 84a114799b25d6ce1f0d4b2da31dd1c01ad9e690..a49cc65b7bf1d76214d0de4590a126012645d22e 100644 (file)
@@ -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