[PATCH] PR target/68937: i686: -fno-plt produces wrong code (maybe only with tailcall
Uros Bizjak
ubizjak@gmail.com
Thu Dec 17 21:21:00 GMT 2015
On Thu, Dec 17, 2015 at 7:09 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Thu, Dec 17, 2015 at 8:11 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
>> On Thu, Dec 17, 2015 at 7:50 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
>>> On Thu, Dec 17, 2015 at 5:42 AM, Uros Bizjak <ubizjak@gmail.com> wrote:
>>>> On Thu, Dec 17, 2015 at 2:00 PM, H.J. Lu <hjl.tools@gmail.com> wrote:
>>>>> On Thu, Dec 17, 2015 at 2:04 AM, Uros Bizjak <ubizjak@gmail.com> wrote:
>>>>>> On Thu, Dec 17, 2015 at 12:29 AM, H.J. Lu <hongjiu.lu@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.
>>>>
>>>
>>> Is this OK?
>>>
>>
>> An updated patch to allow sibcall_memory_operand for RTL
>> expansion. OK for trunk if there is no regression?
>>
>
> There is no regressions on x86-64 with -m32. OK for trunk?
OK for mainline, with a following change:
@@ -597,11 +597,17 @@
(match_operand 0 "memory_operand"))))
;; Return true if OP is a memory operands that can be used in sibcalls.
+;; Since sibcall never returns, we can only use call-clobbered register
+;; as GOT base. Allow GOT slot here only with pseudo register as GOT
+;; base. Properly handle sibcall over GOT slot with *sibcall_GOT_32
+;; and *sibcall_value_GOT_32 patterns.
(define_predicate "sibcall_memory_operand"
(and (match_operand 0 "memory_operand")
(match_test "CONSTANT_P (XEXP (op, 0))
|| (GET_CODE (XEXP (op, 0)) == PLUS
&& REG_P (XEXP (XEXP (op, 0), 0))
+ && (REGNO (XEXP (XEXP (op, 0), 0))
+ >= FIRST_PSEUDO_REGISTER)
&& GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST
&& GET_CODE (XEXP (XEXP (XEXP (op, 0), 1), 0)) == UNSPEC
&& XINT (XEXP (XEXP (XEXP (op, 0), 1), 0), 1) == UNSPEC_GOT)")))
You can use (!HARD_REGISTER_NUM_P (...) || call_used_regs[...]) here.
Call-used hard regs are still allowed here.
Can you please also rewrite this horrible match_test as a block of C
code using GOT32_symbol_operand predicate?
Thanks,
Uros.
More information about the Gcc-patches
mailing list