From: Richard Sandiford <richard.sandiford@linaro.org>
To: Richard Guenther <richard.guenther@gmail.com>
Cc: gcc@gcc.gnu.org
Subject: Re: RFC: Representing vector lane load/store operations
Date: Wed, 23 Mar 2011 14:14:00 -0000 [thread overview]
Message-ID: <g47hbpx6u9.fsf@linaro.org> (raw)
In-Reply-To: <AANLkTin13WeKwDw4jp=VvT5gA1z+8xwLXf1oLSBYjvxu@mail.gmail.com> (Richard Guenther's message of "Wed, 23 Mar 2011 14:14:22 +0100")
Richard Guenther <richard.guenther@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.
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.
> 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.
Richard
next prev parent reply other threads:[~2011-03-23 14:14 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-03-22 16:52 Richard Sandiford
2011-03-22 17:10 ` Richard Guenther
2011-03-22 19:43 ` Richard Sandiford
2011-03-23 9:23 ` Richard Guenther
2011-03-23 10:38 ` Richard Sandiford
2011-03-23 11:52 ` Richard Guenther
2011-03-23 12:18 ` Richard Sandiford
2011-03-23 12:37 ` Richard Guenther
2011-03-23 13:01 ` Richard Sandiford
2011-03-23 13:14 ` Richard Guenther
2011-03-23 14:14 ` Richard Sandiford [this message]
2011-03-23 14:28 ` Richard Guenther
2011-03-23 14:41 ` Richard Sandiford
2011-03-29 12:50 ` Richard Sandiford
2011-03-29 14:05 ` Richard Guenther
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=g47hbpx6u9.fsf@linaro.org \
--to=richard.sandiford@linaro.org \
--cc=gcc@gcc.gnu.org \
--cc=richard.guenther@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).