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