[LLVMdev] 32bit pointers on a (pure) 64bit architecture
Hal Finkel
hfinkel at anl.gov
Fri Apr 4 08:19:45 PDT 2014
----- Original Message -----
> From: "Jeroen Dobbelaere" <jeroen.dobbelaere at gmail.com>
> To: "Hal Finkel" <hfinkel at anl.gov>
> Cc: LLVMdev at cs.uiuc.edu
> Sent: Friday, April 4, 2014 10:07:07 AM
> Subject: Re: [LLVMdev] 32bit pointers on a (pure) 64bit architecture
>
>
> Hi Hal,
>
>
>
>
>
> On Fri, Apr 4, 2014 at 1:22 PM, Hal Finkel < hfinkel at anl.gov > wrote:
>
>
> [..]
>
>
> Agreed; but what does your *ISelLowering::getPointerTy() function
> look like? Did you override the default implementation? I wonder if
> returning MVT::i64 from this function will make things work for you.
>
> -Hal
>
>
>
>
>
> I actually missed implementing this one. But, depending on the
> testcase that I use,
>
> implementing it has no or worse effect:
>
>
> I now get assertion errors complaining of different value sizes,
> coming from the
>
> difference between the datalayout (ptrsize:i32) and the pointerty
> (size overruled to i64).
>
> in SelectionDag::InferPtrAlignment.
>
> I also found out the this method is not called at all (for my
> (failing) tests) during the initial selection dag buildup.
>
>
> Note:
> - most of my testing is done on llvm-3.3, but I verified that the
> same issues are there for llvm-3.4
>
> - I did implement:
> virtual MVT getScalarShiftAmountTy(EVT LHSTy) const { return
> MVT::i64; }
>
> although I have no good idea why the default for that is mapped to
> the pointer type...
>
>
> In the following sample:
> - if full 64bit pointers are used, XXXi32 will be 'i64' and
> everything legalizes/compiles fine
> - if 32bit pointers are used, XXXi32 will be 'i32' and legalization
> fails.
>
> *** IR Dump After Module Verifier ***
> ; Function Attrs: nounwind
> define void @foo(i32 %lhs) #0 {
> entry:
> store i32 %lhs, i32* @g_bar, align 4, !tbaa !0
> ret void
> }
> Computing probabilities for entry
>
> Initial selection DAG: BB#0 'foo:entry'
> SelectionDAG has 9 nodes:
> 0xbb93e8c: ch = EntryToken [ORD=1]
> 0xbbb8428: XXXi32 = Constant<0>
> 0xbb93e8c: <multiple use>
> 0xbb93e8c: <multiple use>
> 0xbbb8208: i64 = Register %vreg0 [ORD=1]
> 0xbbb8290: i64,ch = CopyFromReg 0xbb93e8c, 0xbbb8208 [ORD=1]
> 0xbbb8318: i32 = truncate 0xbbb8290 [ORD=1]
> 0xbbb83a0: XXXi32 = GlobalAddress<i32* @g_bar> 0 [ORD=1]
> 0xbbb84b0: XXXi32 = undef [ORD=1]
> 0xbbb8538: ch = store 0xbb93e8c, 0xbbb8318, 0xbbb83a0,
> 0xbbb84b0<ST4[@g_bar](tbaa=!"int")> [ORD=1]
> 0xbbb85c0: ch = PDISD::NODE_RET_FLAG 0xbbb8538
> -----
>
>
> Is this difference indeed what we would need to expect at this level
> ?
> - should we learn the selection dag creator to use the first larger
> or equal valid type (i64) here ?
>
> - or should we make sure that the legalization phase accepts the mix
> of types that is produced in that case ?
Is i32 a legal type? In the PowerPC backend, in 64-bit mode, we have 32-bit subregisters of the 64-bit registers, and both i32 and i64 are legal types. I suspect that if you do something similar, things will work for you.
-Hal
>
>
>
> Greetings,
>
> --
> Jeroen Dobbelaere
>
--
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory
More information about the llvm-dev
mailing list