From 4a5a0497ba984382955babd44a4d63e0d91a3243 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Mon, 15 Jan 2018 22:35:36 +0000 Subject: [PATCH] Don't check ix86_indirect_branch_register for GOT operand 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. From-SVN: r256714 --- gcc/ChangeLog | 10 ++++++++++ gcc/config/i386/constraints.md | 14 ++++++-------- gcc/config/i386/predicates.md | 6 ++---- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 44de6022d05..f89575a4c84 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2018-01-15 H.J. Lu + + * 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. + 2018-01-15 H.J. Lu * config/i386/predicates.md (constant_call_address_operand): 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.30.2