On Mon, Jun 20, 2016 at 7:05 PM, H.J. Lu <hongjiu...@intel.com> wrote:
> Hi,
>
> This patch implements the alternate code sequence recommended in
>
> https://groups.google.com/forum/#!topic/x86-64-abi/de5_KnLHxtI
>
> to load external function address via GOT slot with
>
> movq func@GOTPCREL(%rip), %rax
>
> so that linker won't create an PLT entry for extern function
> address.
>
> Tested on x86-64.  OK for trunk?

> +  else if (ix86_force_load_from_GOT_p (op1))
> +    {
> +      /* Load the external function address via the GOT slot to
> +        avoid PLT.  */
> +      op1 = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, op1),
> +                           (TARGET_64BIT
> +                            ? UNSPEC_GOTPCREL
> +                            : UNSPEC_GOT));
> +      op1 = gen_rtx_CONST (Pmode, op1);
> +      op1 = gen_const_mem (Pmode, op1);
> +      /* This symbol must be referenced via a load from the Global
> +        Offset Table.  */
> +      set_mem_alias_set (op1, ix86_GOT_alias_set ());
> +      op1 = convert_to_mode (mode, op1, 1);
> +      op1 = force_reg (mode, op1);
> +      emit_insn (gen_rtx_SET (op0, op1));
> +      /* Generate a CLOBBER so that there will be no REG_EQUAL note
> +        on the last insn to prevent cse and fwprop from replacing
> +        a GOT load with a constant.  */
> +      rtx tmp = gen_reg_rtx (Pmode);
> +      emit_clobber (tmp);
> +      return;

Jeff, is this the recommended way to prevent CSE, as far as RTL
infrastructure is concerned? I didn't find any example of this
approach with other targets.

Uros.

Reply via email to