aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/pa/predicates.md
diff options
context:
space:
mode:
authorJohn David Anglin <danglin@gcc.gnu.org>2015-01-03 19:16:37 +0000
committerJohn David Anglin <danglin@gcc.gnu.org>2015-01-03 19:16:37 +0000
commit846ef40a534f7b3c0b4945def933cbf0962a5897 (patch)
tree6d27ff113c30fb038e702aa82e7bac32f376cbd5 /gcc/config/pa/predicates.md
parentd50a179343470eda71460e1a8d6f076c3c060632 (diff)
downloadgcc-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.md21
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.