[llvm-dev] LTO and intrinsics mangling

Ahmed Bougacha via llvm-dev llvm-dev at lists.llvm.org
Tue Apr 19 14:30:43 PDT 2016


On Tue, Apr 19, 2016 at 1:51 PM, Philip Reames
<listmail at philipreames.com> wrote:
>
>
> On 04/19/2016 09:35 AM, Ahmed Bougacha wrote:
>>
>> On Mon, Apr 18, 2016 at 4:28 PM, Philip Reames
>> <listmail at philipreames.com> wrote:
>>>
>>>
>>>
>>> On 04/18/2016 10:52 AM, Ahmed Bougacha via llvm-dev wrote:
>>>
>>> On Mon, Apr 18, 2016 at 9:45 AM, Artur Pilipenko via llvm-dev
>>> <llvm-dev at lists.llvm.org> wrote:
>>>>
>>>> Does this sound reasonable? Are there any other alternatives?
>>>
>>> Would demoting pointer types to pNi8 work?
>>>
>>> As you say, that could potentially mask problems, but I don't think the
>>> type of the masked load/store matters, only the types of the pointer
>>> elements at the subsequent loads/stores.
>>> In other words, this sounds equivalent to opaque pointer types to me. A
>>> pointer load shouldn't care about the type.
>>>
>>> I went down this path too.  It doesn't work unfortunately.  The problem
>>> is that the value type of the store is also part of the signature and could
>>> be a struct type.  Analogously, the same problem exists for the return type
>>> of the load.  We can and do lower loads/stores of different value types
>>> differently.  Memory isn't typed, but the operation is.
>>
>> You're right, but I don't think that applies to masked load/stores, as
>> the value type can't be a struct type, it can only be a pointer to
>> struct type (langref says "The loaded data is a vector of any integer,
>> floating point or pointer data type.").
>
> Er, not sure what you're getting at.  The value type has to match the
> pointee type of the address type.  If we can't have a value type which is a
> struct, how'd we end up with a struct typed pointer?

It's the pointee type that's a struct pointer. Artur's example is:

  %struct.foobar = type { i32 }
  declare <4 x %struct.foobar*> @llvm.masked.load.v4p0struct.foobar(<4
x %struct.foobar*>*, i32, <4 x i1>, <4 x %struct.foobar*>)

Which - I think - is guaranteed to lower equivalently to:
  declare <4 x i8*> @llvm.masked.load.v4p0i8(<4 x i8*>*, i32, <4 x
i1>, <4 x i8*>)

I think you're imagining something like:
  declare <4 x %struct.foobar> @llvm.masked.load.p0v4struct.foobar(<4
x %struct.foobar>*, i32, <4 x i1>, <4 x %struct.foobar>)

But, according to the langref, that's forbidden.
Am I making sense?

-Ahmed

>>
>> And since the backend only distinguishes pointer types based on
>> addresspace, pNi8 seems sufficient, no?
>>
>> -Ahmed
>
>


More information about the llvm-dev mailing list