On Mon, Jan 15, 2018 at 4:05 AM, H.J. Lu <hjl.to...@gmail.com> wrote: > On Sun, Jan 14, 2018 at 1:23 PM, H.J. Lu <hjl.to...@gmail.com> wrote: >> On Sun, Jan 14, 2018 at 10:52 AM, Uros Bizjak <ubiz...@gmail.com> wrote: >>> On Sun, Jan 14, 2018 at 7:08 PM, H.J. Lu <hjl.to...@gmail.com> wrote: >>>> On Sun, Jan 14, 2018 at 9:51 AM, Uros Bizjak <ubiz...@gmail.com> wrote: >>>>> - (ior (and (not (match_test "TARGET_X32")) >>>>> + (ior (and (not (match_test "TARGET_X32 >>>>> + || ix86_indirect_branch_thunk_register")) >>>>> (match_operand 0 "sibcall_memory_operand")) >>>>> - (and (match_test "TARGET_X32 && Pmode == DImode") >>>>> + (and (match_test "TARGET_X32 && Pmode == DImode >>>>> + && !ix86_indirect_branch_thunk_register") >>>>> (match_operand 0 "GOT_memory_operand")))) >>>>> >>>>> Is this patch just trying to disable the predicate when >>>>> ix86_indirect_branch_thunk_register is set? Because this is what this >>>>> convoluted logic does. >>>> >>>> Yes, we want to disable all indirect branch via memory with >>>> -mindirect-branch-register, just like -mx32. We could do >>>> >>>> #idefine TARGET_INDIRECT_BRANCH_REGISTER \ >>>> (TARGER_X32 || ix86_indirect_branch_thunk_register) >>> >>> Index: predicates.md >>> =================================================================== >>> --- predicates.md (revision 256666) >>> +++ predicates.md (working copy) >>> @@ -710,11 +710,10 @@ >>> (ior (match_test "constant_call_address_operand >>> (op, mode == VOIDmode ? mode : Pmode)") >>> (match_operand 0 "call_register_no_elim_operand") >>> - (ior (and (not (match_test "TARGET_X32 >>> - || ix86_indirect_branch_thunk_register")) >>> + (and (not (match_test "ix86_indirect_branch_thunk_register")) >>> + (ior (and (not (match_test "TARGET_X32"))) >>> (match_operand 0 "memory_operand")) >>> - (and (match_test "TARGET_X32 && Pmode == DImode >>> - && !ix86_indirect_branch_thunk_register") >>> + (and (match_test "TARGET_X32 && Pmode == DImode") >>> (match_operand 0 "GOT_memory_operand"))))) >>> >>> or something like that. >>> >> >> I am testing this patch. OK for trunk if there is no regression? >> > > Here is the updated patch. Tested on i686 and x86-64. OK for > trunk?
There are two of the same issues in constraints.md On further inspection, there are several new ix86_indirect_branch_thunk_register conditions sprinkled around predicates.md. The one in indirect_branch_operand is understandable (but should be written as: (ior (match_operand 0 "register_operand") (and (not (match_test "ix86_indirect_thunk_register")) (not (match_test "TARGET_X32")) (match_operand 0 "memory_operand")))) ) but the ones in GOT_memory_operand and GOT32_symbol_operand should *not* be there, since these are simple pattern matches. Now we have situation where e.g. call_got_x32 and sibcall_got_32 patterns never match, and should be disabled with ix86_indirect_branch_thunk_register. Please move ix86_indirect_branch_thunk_register conditions out of these two predicates. Uros.