On Mon, Jan 15, 2018 at 8:54 AM, Uros Bizjak <ubiz...@gmail.com> wrote:
> 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.

I break them into 4 smaller patches:

https://gcc.gnu.org/ml/gcc-patches/2018-01/msg01361.html
https://gcc.gnu.org/ml/gcc-patches/2018-01/msg01360.html
https://gcc.gnu.org/ml/gcc-patches/2018-01/msg01362.html
https://gcc.gnu.org/ml/gcc-patches/2018-01/msg01359.html


-- 
H.J.

Reply via email to