On Thu, Dec 17, 2015 at 2:00 PM, H.J. Lu <hjl.to...@gmail.com> wrote:
> On Thu, Dec 17, 2015 at 2:04 AM, Uros Bizjak <ubiz...@gmail.com> wrote:
>> On Thu, Dec 17, 2015 at 12:29 AM, H.J. Lu <hongjiu...@intel.com> wrote:
>>> Since sibcall never returns, we can only use call-clobbered register
>>> as GOT base.  Otherwise, callee-saved register used as GOT base won't
>>> be properly restored.
>>>
>>> Tested on x86-64 with -m32.  OK for trunk?
>>
>> You don't have to add explicit clobber for members of "CLOBBERED_REGS"
>> class, and register_no_elim_operand predicate should be used with "U"
>> constraint. Also, please introduce new predicate, similar to how
>> GOT_memory_operand is defined and handled.
>>
>
> Here is the updated patch.  There is a predicate already,
> sibcall_memory_operand.  It allows any registers to
> be as GOT base, which is the root of our problem.
> This patch removes GOT slot from it and handles
> sibcall over GOT slot with *sibcall_GOT_32 and
> *sibcall_value_GOT_32 patterns.  Since I need to
> expose constraints on GOT base register to RA,
> I have to use 2 operands, GOT base and function
> symbol, to describe sibcall over 32-bit GOT slot.

Please use

       (mem:SI (plus:SI
             (match_operand:SI 0 "register_no_elim_operand" "U")
             (match_operand:SI 1 "GOT32_symbol_operand")))
...

to avoid manual rebuild of the operand.

Uros.

Reply via email to