[LLVMdev] 32bit pointers on a (pure) 64bit architecture

Matt Arsenault
Thu, 03 Apr 2014 22:56:02 -0000

On 04/03/2014 03:31 PM, Jeroen Dobbelaere wrote:
> Hi,
>
> I am trying to get llvm working for an architecture that has 64bit
> registers, but 32bit addresses.
> Because of that, I want the pointers to also be 32bit, although they
> will live in a 64 bit register.
>
> On the frontend, I do not encounter any issues, but when I provide a
>   ...
>   "p:32:32:32"
>   ...
> DataLayout specification to the backend, things get ugly:
> - SelectionDag is producing a mix of 64bit and 32bit nodes, and it
> seems that a number of
> necessary legalizations/promotions are missing.
>
> After adding support for 'PromoteIntRes_GlobalAddress(...)', I get
a
> failure, because a 'store' node now has a mix of operands:
> - some of the operands were already 'i64' from the beginning,
> - others were 'i32' (due to the 32bit pointers) and have been
promoted
> to 'i64'
>
> Because of the latter, the 'PromoteIntOp_STORE' is called. This
uses
> 'GetPromotedInteger' to access the operands.
> But, GetPromotedInteger fails if the operand was not promoted. So it
> fails on the operands of the 'store' that were already legal (i64).
>
> What would be the recommended way to fix this ?
> (Or did I miss something, and should 32bit pointers on a 64bit
> architecture be done in a completely different way)
>
How are you implementing GlobalAddress?

R600/SI has both 32-bit and 64-bit pointers, and (sort of) 64-bit
registers if you want to see how it handles it.
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20140403/b09e1ced/attachment.html>