Since GOT_memory_operand and GOT32_symbol_operand are simple pattern
matches, don't check ix86_indirect_branch_register here.  If needed,
-mindirect-branch= will convert indirect branch via GOT slot to a call
and return thunk.

        * config/i386/constraints.md (Bs): Update
        ix86_indirect_branch_register check.  Don't check
        ix86_indirect_branch_register with GOT_memory_operand.
        (Bw): Likewise.
        * config/i386/predicates.md (GOT_memory_operand): Don't check
        ix86_indirect_branch_register here.
        (GOT32_symbol_operand): Likewise.
---
 gcc/config/i386/constraints.md | 14 ++++++--------
 gcc/config/i386/predicates.md  |  6 ++----
 2 files changed, 8 insertions(+), 12 deletions(-)

diff --git a/gcc/config/i386/constraints.md b/gcc/config/i386/constraints.md
index d6072b9bcd9..664e906b311 100644
--- a/gcc/config/i386/constraints.md
+++ b/gcc/config/i386/constraints.md
@@ -225,20 +225,18 @@
 
 (define_constraint "Bs"
   "@internal Sibcall memory operand."
-  (ior (and (not (match_test "TARGET_X32
-                             || ix86_indirect_branch_register"))
+  (ior (and (not (match_test "ix86_indirect_branch_register"))
+           (not (match_test "TARGET_X32"))
            (match_operand 0 "sibcall_memory_operand"))
-       (and (match_test "TARGET_X32 && Pmode == DImode
-                        && !ix86_indirect_branch_register")
+       (and (match_test "TARGET_X32 && Pmode == DImode")
            (match_operand 0 "GOT_memory_operand"))))
 
 (define_constraint "Bw"
   "@internal Call memory operand."
-  (ior (and (not (match_test "TARGET_X32
-                             || ix86_indirect_branch_register"))
+  (ior (and (not (match_test "ix86_indirect_branch_register"))
+           (not (match_test "TARGET_X32"))
            (match_operand 0 "memory_operand"))
-       (and (match_test "TARGET_X32 && Pmode == DImode
-                        && !ix86_indirect_branch_register")
+       (and (match_test "TARGET_X32 && Pmode == DImode")
            (match_operand 0 "GOT_memory_operand"))))
 
 (define_constraint "Bz"
diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md
index 6ec7ff2e784..a502657f9e3 100644
--- a/gcc/config/i386/predicates.md
+++ b/gcc/config/i386/predicates.md
@@ -695,8 +695,7 @@
 
 ;; Return true if OP is a GOT memory operand.
 (define_predicate "GOT_memory_operand"
-  (and (match_test "!ix86_indirect_branch_register")
-       (match_operand 0 "memory_operand"))
+  (match_operand 0 "memory_operand")
 {
   op = XEXP (op, 0);
   return (GET_CODE (op) == CONST
@@ -729,8 +728,7 @@
 
 ;; Return true if OP is a 32-bit GOT symbol operand.
 (define_predicate "GOT32_symbol_operand"
-  (match_test "!ix86_indirect_branch_register
-              && GET_CODE (op) == CONST
+  (match_test "GET_CODE (op) == CONST
                && GET_CODE (XEXP (op, 0)) == UNSPEC
                && XINT (XEXP (op, 0), 1) == UNSPEC_GOT"))
 
-- 
2.14.3

Reply via email to