On Wed, Mar 23, 2011 at 3:13 PM, Richard Sandiford
<richard.sandif...@linaro.org> wrote:
> Richard Guenther <richard.guent...@gmail.com> 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?  I'm confused.  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?).

> We still make generic vectors available when there's no underlying
> hardware support, so I'd have expected these 3-element-array-of-vector
> types to be available too.  That's why I prefer the idea of making the
> mode conditional, as for vector types, rather than rejecting uses of
> the type outright.
>
> But from this:
>
>> 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.

I realize this is all a bit tricky and probably nobody properly designed
the target attribute stuff with all these details in mind.  But now
we have to live with it ... :(

>> And I still think that only changing DECL_MODEs based on
>> target attributes and not TYPE_MODEs is appealing ;)
>
> Understood.  I just think that, if we do that, we really should
> get rid of TYPE_MODE (as a global property) as well, otherwise there'd
> be even more chaos than there is now.  And that sounds like it could
> be several months' work in itself.

True.  But I like the idea of TYPE_MODE becoming even more "dynamic"
even less.

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 ...

Richard.

Reply via email to