[llvm-dev] Manipulating global address inside GlobalAddress SDNode in (RISCV) LLVM backend

Reshabh Sharma via llvm-dev llvm-dev at lists.llvm.org
Thu Jul 11 10:03:22 PDT 2019


On Thu, Jul 11, 2019 at 10:21 PM Tim Northover <t.p.northover at gmail.com>
wrote:

> On Thu, 11 Jul 2019 at 17:16, Reshabh Sharma <reshabhsh at gmail.com> wrote:
> > We thought LUI and ADDI pair will be good to store the values in a i32
> register.
>
> With you so far, I think. To be explicit, to materialize a full 64-bit
> pointer you'd need 4 instructions:
>
>     lui rLO32, addr:MO_LO32_LO
>     addi rLO32, rLO32, addr:MO_LO32_HI
>     lui rHI32, addr:MO_HI32_LO
>     addi rHI32, rLO32, addr:MO_LO32_HI
>
> or some variation for PIC etc.
>
> >  If we could transform GlobalAddress<0xHighLow> directly to
> GlobalAddress<0xLow>, we could use the present RISCVII::MO_HI and MO_LO as
> they only exact the 32 high bits. What do you think?
>
> I still recommend against reusing GlobalAddress as-is with an i32
> type, but that's probably a minor detail. The only way I can see to
> reuse the existing modifiers unambiguously would be to modify the
> above sequence to:
>
>     lui rLO32, addr:MO_LO
>     addi rLO32, rLO32, addr:MO_LO
>     lui rHI32, addr:MO_HI
>     addi rHI32, rLO32, addr:MO_HI
>
> It kind of works, but personally I think it's stretching the
> understood semantics of MO_LO and MO_HI too far -- I'd add new ones if
> it was me. But I'm not an active RISC-V maintainer so take my opinions
> with a grain of salt.
>

Ah now I could see it more clearly. I was not sure that should I add them
(MO_LO32_LO and MO_LO32_HI), btw this was backup plan. Probably for now we
are going with this. I implemented them today and they seem to work well.

Many thanks,
Reshabh


> Cheers.
>
> Tim.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20190711/7bcdef76/attachment.html>


More information about the llvm-dev mailing list