[LLVMdev] Casting between address spaces and address space semantics

Matthijs Kooijman matthijs at stdin.nl
Mon Aug 11 04:09:37 PDT 2008


Hi Mon Ping,

> I don't have a problem having another class, TargetAddrSpace, to store this 
> information.  However, I don't think it make sense being a standalone pass. 
>  Address spaces seems to part of the TargetData and it seems more natural 
> to ask the TargetData to return the TargetAddrSpace object  (similar to 
> struct layout) to describe the relationships between address spaces.
This is pretty much what I did in my first patch, but Chris didn't like it.
Currently, the TargetData class can be completely described using it's string
representation (which is also stored inside a module). Adding address space
information to target data breaks this, unless we also make a string
representation of the address spaces that we can put in a module.

I think that having a seperate class is somewhat cleaner, since it also makes
sure that this info is only made available to the passes that actually use it.

> BTW, there is a comment in TargetAddrspaces.h that indicate the default is
> that all address spaces are equivalent. I assume you meant disjoint here.
Uh, yeah :-)

>> The last part of this patch is an addition to InstCombine to make use of
>> this information: It removes any bitcasts from a subset to a superset
>> address space. It gets at the address space information by requiring the
>> TargetAddrspaces analysis, which will give it the default implementation in
>> all current tools.
>
> For the case of a GetElementPointer, we are replacing a bitcast to a 
> pointer, getelem with a getelem bitcast.  The assumption is the latter 
> bitcast will hopefully go away when we iterate through those uses.
Uh? Is this a comment about what the current code or my patch does, or what it
should do? I don't understand what you mean here.

>> Mon Ping suggests using address space information for alias analysis as
>> well, which seems to make sense. In effect this is a form of type-based
>> alias analysis, but different address spaces don't preclude pointers from
>> being equal. A problem here is that pointers in disjoint address spaces
>> would be marked as not aliasing, but when the default relation is disjoint
>> this is not so conservative. This might require an extra option "Unknown",
>> which can be used as the default instead of "Disjoint". For Unknown, any
>> pass can do the conservative thing.
>
> What I'm suggesting is that Alias Analysis can be a client to where we 
> store address space information.  In the example you gave, alias analysis 
> will examine two memory locations, ask the TargetAddressSpace what the 
> relationship is and if it is disjoint, it will return no alias.  If the 
> address spaces are in subset relationship, the alias analysis returns maybe 
> unless it has more information.  If a client doesn't tell the compiler the 
> correct address space information, the client shouldn't expect correct 
> answers from coming out of the compiler.
True, anyone actually using address space should make sure that this info is
correct anyway. So, no need for an unknown default?

>> Lastly, I'm still not so sure if InstCombine is the right place for this
>> simplification. This needs some more thought, but currently it is a problem
>> that instcombine does not process BitCastConstantExprs. I might end up
>> writing a seperate pass for just this.
>
> I'm not sure either. At some level, what we want is to propagate the most 
> precise address space (or restrict) information to its use.
Exactly.

> This means that ideally we would want to be able to handle copies of the
> value stored in some temporary and track it all the way through to it use.
> InstCombine will not handle this case, e.g, address space 1 is a subset of 2
>    int<1>* ptr = ...
>    int<2>* ptr2 = ptr1+4
>    *ptr2 = ...
Won't this code produce a bitcast in the IR, which can be propagated? My
current patch doesn't do this, but it should be easy to extend it to also
propagate a bitcast past pointer arithmetic.

Ie, it should change

%tmp = bitcast i32 addrspace(1)* %ptr1 to i32 addrspace(2)*
%ptr2 = add i32 addrspace(2)* %tmp, 4
store i32 0 i32 addrspace(2)* %ptr2

to 

%tmp  = add i32 addrspace(1)* %ptr, 4
%ptr2 = bitcast %tmp to i32 addrspace(2)
store i32 0 i32 addrspace(2)* %ptr2

and then to 

%ptr2  = add i32 addrspace(1)* %ptr, 4
store i32 0 i32 addrspace(1)* %ptr2

Which shouldn't be too hard?

Coming to think of it, the above won't even use the add instruction, but will
probably use a GEP to do the +4. The current code already propagates bitcasts
past GEP instructions. Also, I suspect that our C frontends will already
produce the second version of the IR for the C code you give.

Or am I totally missing the point you are making here?


Gr.

Matthijs
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20080811/59bb448b/attachment.sig>


More information about the llvm-dev mailing list