aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans-Peter Nilsson <hp@axis.com>2013-12-23 22:33:52 +0000
committerHans-Peter Nilsson <hp@gcc.gnu.org>2013-12-23 22:33:52 +0000
commita13a866e54572861d8e506764298507d715ba495 (patch)
treef14a05f6ec60fc78fd4f06a3a8e73d19e3d36000
parent2a0da5ad16b11e37bcd3109d4fc7968568dbfc05 (diff)
downloadgcc-a13a866e54572861d8e506764298507d715ba495.zip
gcc-a13a866e54572861d8e506764298507d715ba495.tar.gz
gcc-a13a866e54572861d8e506764298507d715ba495.tar.bz2
re PR middle-end/59584 (regressions related to __builtin_stack_restore)
PR middle-end/59584 * config/cris/predicates.md (cris_nonsp_register_operand): New define_predicate. * config/cris/cris.md: Replace register_operand with cris_nonsp_register_operand for destinations in all define_splits where a register is set more than once. From-SVN: r206187
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/config/cris/cris.md27
-rw-r--r--gcc/config/cris/predicates.md4
3 files changed, 27 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1f170a6..00b2c21 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2013-12-23 Hans-Peter Nilsson <hp@axis.com>
+
+ PR middle-end/59584
+ * config/cris/predicates.md (cris_nonsp_register_operand):
+ New define_predicate.
+ * config/cris/cris.md: Replace register_operand with
+ cris_nonsp_register_operand for destinations in all
+ define_splits where a register is set more than once.
+
2013-12-23 Jason Merrill <jason@redhat.com>
* gdbinit.in (input_line, input_filename): Define.
diff --git a/gcc/config/cris/cris.md b/gcc/config/cris/cris.md
index 8a7f0bf..b3e9f04 100644
--- a/gcc/config/cris/cris.md
+++ b/gcc/config/cris/cris.md
@@ -758,7 +758,7 @@
(match_operand:SI 1 "const_int_operand" ""))
(match_operand:SI 2 "register_operand" ""))])
(match_operand 3 "register_operand" ""))
- (set (match_operand:SI 4 "register_operand" "")
+ (set (match_operand:SI 4 "cris_nonsp_register_operand" "")
(plus:SI (mult:SI (match_dup 0)
(match_dup 1))
(match_dup 2)))])]
@@ -859,7 +859,7 @@
(match_operand:SI 0 "cris_bdap_operand" "")
(match_operand:SI 1 "cris_bdap_operand" ""))])
(match_operand 2 "register_operand" ""))
- (set (match_operand:SI 3 "register_operand" "")
+ (set (match_operand:SI 3 "cris_nonsp_register_operand" "")
(plus:SI (match_dup 0) (match_dup 1)))])]
"reload_completed && reg_overlap_mentioned_p (operands[3], operands[2])"
[(set (match_dup 4) (match_dup 2))
@@ -3960,7 +3960,7 @@
;; up.
(define_split
- [(set (match_operand 0 "register_operand" "")
+ [(set (match_operand 0 "cris_nonsp_register_operand" "")
(match_operator
4 "cris_operand_extend_operator"
[(match_operand 1 "register_operand" "")
@@ -3990,7 +3990,7 @@
;; Call this op-extend-split-rx=rz
(define_split
- [(set (match_operand 0 "register_operand" "")
+ [(set (match_operand 0 "cris_nonsp_register_operand" "")
(match_operator
4 "cris_plus_or_bound_operator"
[(match_operand 1 "register_operand" "")
@@ -4018,7 +4018,7 @@
;; Call this op-extend-split-swapped
(define_split
- [(set (match_operand 0 "register_operand" "")
+ [(set (match_operand 0 "cris_nonsp_register_operand" "")
(match_operator
4 "cris_plus_or_bound_operator"
[(match_operator
@@ -4044,7 +4044,7 @@
;; bound. Call this op-extend-split-swapped-rx=rz.
(define_split
- [(set (match_operand 0 "register_operand" "")
+ [(set (match_operand 0 "cris_nonsp_register_operand" "")
(match_operator
4 "cris_plus_or_bound_operator"
[(match_operator
@@ -4075,7 +4075,7 @@
;; Call this op-extend.
(define_split
- [(set (match_operand 0 "register_operand" "")
+ [(set (match_operand 0 "cris_nonsp_register_operand" "")
(match_operator
3 "cris_orthogonal_operator"
[(match_operand 1 "register_operand" "")
@@ -4099,7 +4099,7 @@
;; Call this op-split-rx=rz
(define_split
- [(set (match_operand 0 "register_operand" "")
+ [(set (match_operand 0 "cris_nonsp_register_operand" "")
(match_operator
3 "cris_commutative_orth_op"
[(match_operand 2 "memory_operand" "")
@@ -4123,7 +4123,7 @@
;; Call this op-split-swapped.
(define_split
- [(set (match_operand 0 "register_operand" "")
+ [(set (match_operand 0 "cris_nonsp_register_operand" "")
(match_operator
3 "cris_commutative_orth_op"
[(match_operand 1 "register_operand" "")
@@ -4146,7 +4146,7 @@
;; Call this op-split-swapped-rx=rz.
(define_split
- [(set (match_operand 0 "register_operand" "")
+ [(set (match_operand 0 "cris_nonsp_register_operand" "")
(match_operator
3 "cris_orthogonal_operator"
[(match_operand 2 "memory_operand" "")
@@ -4555,10 +4555,11 @@
;; We're not allowed to generate copies of registers with different mode
;; until after reload; copying pseudos upsets reload. CVS as of
;; 2001-08-24, unwind-dw2-fde.c, _Unwind_Find_FDE ICE in
-;; cselib_invalidate_regno.
+;; cselib_invalidate_regno. Also, don't do this for the stack-pointer,
+;; as we don't want it set temporarily to an invalid value.
(define_split ; indir_to_reg_split
- [(set (match_operand 0 "register_operand" "")
+ [(set (match_operand 0 "cris_nonsp_register_operand" "")
(match_operand 1 "indirect_operand" ""))]
"reload_completed
&& REG_P (operands[0])
@@ -4574,7 +4575,7 @@
;; As the above, but MOVS and MOVU.
(define_split
- [(set (match_operand 0 "register_operand" "")
+ [(set (match_operand 0 "cris_nonsp_register_operand" "")
(match_operator
4 "cris_extend_operator"
[(match_operand 1 "indirect_operand" "")]))]
diff --git a/gcc/config/cris/predicates.md b/gcc/config/cris/predicates.md
index 040482b..2acd02f 100644
--- a/gcc/config/cris/predicates.md
+++ b/gcc/config/cris/predicates.md
@@ -76,6 +76,10 @@
(match_test "cris_simple_address_operand (XEXP (op, 0),
Pmode)"))))
+(define_predicate "cris_nonsp_register_operand"
+ (and (match_operand 0 "register_operand")
+ (match_test "op != stack_pointer_rtx")))
+
;; The caller needs to use :SI.
(define_predicate "cris_bdap_sign_extend_operand"
; Disabled until <URL:http://gcc.gnu.org/ml/gcc-patches/2005-10/msg01376.html>