Richard Guenther <[email protected]> writes:
> On Wed, Mar 23, 2011 at 3:13 PM, Richard Sandiford
> <[email protected]> wrote:
>> Richard Guenther <[email protected]> writes:
>>>>> For your case in question the vectorizer would create local vars with
>>>>> that mode, knowing it is supported, so I don't see big problems for
>>>>> that particular case.
>>>>
>>>> The problem is that I'd like to use this for intrinsics as well as for
>>>> automatic vectorisation. E.g. I'd like:
>>>>
>>>> typedef struct int8x16x4_t
>>>> {
>>>> int8x16_t val[4];
>>>> } int8x16x4_t;
>>>>
>>>> to have non-BLKmode as well. arm_neon.h uses this type of structure
>>>> to represent compounds vectors. But once the type is defined (with Neon
>>>> support enabled), there's nothing to stop someone using the type
>>>> (not the intrinsics) in a function that has Neon disabled. We mustn't
>>>> use the special mode in such cases, because there aren't enough GPRs to
>>>> store it. It should be treated as BLKmode instead. Which I suppose
>>>> is the same situation as...
>>>
>>> I'd use non-BLKmode for the above unconditionally.
>>
>> But without Neon, there aren't enough registers to store the structure.
>> Any use of the Neon mode would just lead to a reload failure. Even if
>> we think it's not sensible to use the type without Neon, we need a better
>> diagnostic than that.
>>
>> So I think this mode has to be conditional in exactly the way that
>> vector modes are, or be subject to the same diagnostics that you
>> were suggesting for 128-bit types.
>>
>> I was actually thinking along the lines of having a target hook such as:
>>
>> array_mode_supported_p (tree elemtype, unsigned HOST_WIDE_INT size)
>>
>> which would return true if ELEMTYPE[SIZE] should use non-BLKmode where
>> possible. When it returns true, we'd pass 0 rather than 1 to this
>> mode_for_size_tree call (from the ARRAY_TYPE case in layout_type):
>>
>> /* One-element arrays get the component type's mode. */
>> if (simple_cst_equal (TYPE_SIZE (type),
>> TYPE_SIZE (TREE_TYPE (type))))
>> SET_TYPE_MODE (type, TYPE_MODE (TREE_TYPE (type)));
>> else
>> SET_TYPE_MODE (type, mode_for_size_tree (TYPE_SIZE (type),
>> MODE_INT, 1));
>>
>> This would have the "advantage" (as I see it) of working with the
>> generic vector extensions too. E.g. if a user defines their own
>> 3-element-array-of-vector type, they would benefit from the same
>> handling as the Neon-specific intrinsics and the vectoriser-generated
>> arrays.
>
> So the 3-element-array-of-vector type has the vector mode of a single
> element?
No, it has a wider, non-vector mode. At the moment, ARM uses integer
modes for this, and after trying a few variations, I think that's
actually the best compromise. So the uint8x16x4_t ought to have a
64-byte integer type(!), which ARM defines as XImode:
INT_MODE (XI, 64);
> I also don't see how a user could want to have a non-BLK mode on such
> array types (consider them being part of a struct - how would that
> affect argument passing and other ABI details?).
The point is that we shouldn't use the mode for the ABI anyway. Even the
intrinsic-defined types (like uint8x16x4_t above) should be passed in
the same way as BLKmode structures would.
>>> I'd say if somebody writes
>>>
>>> v4sf float_vec;
>>>
>>> void __attribute__((target("no-sse")))
>>> foo (void)
>>> {
>>> float_vec += float_vec;
>>> }
>>>
>>> he deserves to get a diagnostic. Thus, even for global decls I think we
>>> can reject such uses. Complication arises whenever we do not see
>>> a decl, like for
>>>
>>> void foo(v4sf *x)
>>> {
>>> }
>>>
>>> which we could of course reject (at function definition time) if an
>>> unsupported type is used in this way. But the function might
>>> not even dereference that pointer ...
>>
>> it sounds like you think there's no point supporting generic vectors
>> when no underlying hardware support is available.
>
> Well, I meant if the user compiles with -msse, declares such a
> global var (which means it gets V4SFmode and not BLKmode)
> and then uses it in a function where he explicitly disables SSE
> then something is wrong. If he declares a BLKmode global
> then generic vector support will happily trigger and make it work.
Ah, OK. I'm just not sure whether, to take a MIPS example,
MIPS16 functions in a "-mno-mips16" compile should behave
differently from unannotated functions in a "-mips16" compile.
> If it's just three element array-of-vector types you need why not expose
> it via attribute((mode(xyz))) only? You could alias that mode to BLKmode
> if neon is not enabled ...
I don't think that really changes anything. Getting the non-BLK mode
on the array type seems like the easy part. The difficult part is
dealing with the fallout when the array is defined in a Neon context
and used in a non-Neon context.
Richard