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.

Reply via email to