From: jules Date: Wed, 27 May 2009 18:47:26 +0000 (+0000) Subject: gcc/ X-Git-Tag: upstream/4.9.2~35783 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2b86a75ac429c90f4ebfa1581e7b0b11c18c89a9;p=platform%2Fupstream%2Flinaro-gcc.git gcc/ * gcse.c (target.h): Include. (can_assign_to_reg_without_clobbers_p): Check that the target allows copy of argument to a pseudo register. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@147925 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5094773..8068f0e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-05-27 Julian Brown + + * gcse.c (target.h): Include. + (can_assign_to_reg_without_clobbers_p): Check that the target allows + copy of argument to a pseudo register. + 2009-05-27 Diego Novillo * tree-ssa-live.c (dump_scope_block): Document arguments. diff --git a/gcc/gcse.c b/gcc/gcse.c index bfd8c68..3ff47fa 100644 --- a/gcc/gcse.c +++ b/gcc/gcse.c @@ -169,6 +169,7 @@ along with GCC; see the file COPYING3. If not see #include "hashtab.h" #include "df.h" #include "dbgcnt.h" +#include "target.h" /* Propagate flow information through back edges and thus enable PRE's moving loop invariant calculations out of loops. @@ -805,6 +806,11 @@ static GTY(()) rtx test_insn; /* Return true if we can assign X to a pseudo register such that the resulting insn does not result in clobbering a hard register as a side-effect. + + Additionally, if the target requires it, check that the resulting insn + can be copied. If it cannot, this means that X is special and probably + has hidden side-effects we don't want to mess with. + This function is typically used by code motion passes, to verify that it is safe to insert an insn without worrying about clobbering maybe live hard regs. */ @@ -837,8 +843,18 @@ can_assign_to_reg_without_clobbers_p (rtx x) valid. */ PUT_MODE (SET_DEST (PATTERN (test_insn)), GET_MODE (x)); SET_SRC (PATTERN (test_insn)) = x; - return ((icode = recog (PATTERN (test_insn), test_insn, &num_clobbers)) >= 0 - && (num_clobbers == 0 || ! added_clobbers_hard_reg_p (icode))); + + 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 (targetm.cannot_copy_insn_p && targetm.cannot_copy_insn_p (test_insn)) + return false; + + return true; } /* Return nonzero if the operands of expression X are unchanged from the