diff options
author | John David Anglin <danglin@gcc.gnu.org> | 2015-01-03 19:16:37 +0000 |
---|---|---|
committer | John David Anglin <danglin@gcc.gnu.org> | 2015-01-03 19:16:37 +0000 |
commit | 846ef40a534f7b3c0b4945def933cbf0962a5897 (patch) | |
tree | 6d27ff113c30fb038e702aa82e7bac32f376cbd5 /gcc/config/pa/predicates.md | |
parent | d50a179343470eda71460e1a8d6f076c3c060632 (diff) | |
download | gcc-846ef40a534f7b3c0b4945def933cbf0962a5897.zip gcc-846ef40a534f7b3c0b4945def933cbf0962a5897.tar.gz gcc-846ef40a534f7b3c0b4945def933cbf0962a5897.tar.bz2 |
pa.md (decrement_and_branch_until_zero): Use `Q' constraint instead of `m' constraint.
* config/pa/pa.md (decrement_and_branch_until_zero): Use `Q' constraint
instead of `m' constraint. Likewise for unnamed movb comparison
patterns using reg_before_reload_operand predicate.
* config/pa/predicates.md (reg_before_reload_operand): Tighten
predicate to reject register index and LO_SUM DLT memory forms
after reload.
From-SVN: r219162
Diffstat (limited to 'gcc/config/pa/predicates.md')
-rw-r--r-- | gcc/config/pa/predicates.md | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/gcc/config/pa/predicates.md b/gcc/config/pa/predicates.md index 8dcfce0..405cf7f 100644 --- a/gcc/config/pa/predicates.md +++ b/gcc/config/pa/predicates.md @@ -528,20 +528,29 @@ ;; This predicate is used for branch patterns that internally handle ;; register reloading. We need to accept non-symbolic memory operands ;; after reload to ensure that the pattern is still valid if reload -;; didn't find a hard register for the operand. +;; didn't find a hard register for the operand. We also reject index +;; and lo_sum DLT address as these are invalid for move destinations. (define_predicate "reg_before_reload_operand" (match_code "reg,mem") { + rtx op0; + if (register_operand (op, mode)) return true; - if (reload_completed - && memory_operand (op, mode) - && !symbolic_memory_operand (op, mode)) - return true; + if (!reload_in_progress && !reload_completed) + return false; - return false; + if (! MEM_P (op)) + return false; + + op0 = XEXP (op, 0); + + return (memory_address_p (mode, op0) + && !IS_INDEX_ADDR_P (op0) + && !IS_LO_SUM_DLT_ADDR_P (op0) + && !symbolic_memory_operand (op, mode)); }) ;; True iff OP is a register or const_0 operand for MODE. |