This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [patch] for PR 18040
- From: kenner at vlsi1 dot ultra dot nyu dot edu (Richard Kenner)
- To: dberlin at dberlin dot org
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Sun, 17 Oct 04 16:07:59 EDT
- Subject: Re: [patch] for PR 18040
((cast)var).field is not valid gimple.
Casts must be in a statement by themselves, unless the argument is
is_gimple_min_invariant.
The issue here is historical. The point is to view a single nested component
reference as valid so we don't try to split it up since it can normally be
done in a single operation and spliting it up will make it more expensive.
The idea is that handled_component_p returns true for exactly those things
that will be stripped by get_inner_reference.
So we wanted to support conversions *inside* a nest of references. In other
words, ((cast) var.field1).field2. I thought that was specified in the
grammer; if not, it should be.
Your example above is simply a degenerate form of that and certainly needs to
be supported because otherwise we pessimize code quite badly (at best).
Suppose that cast is to a variable-size type. Then we can't even gimplify
that expression because we can't have a variable-size temporary. Such an
expression is certainly valid GENERIC, so saying we can't gimplify it is bad.
But if we say that it's the responsibility of the front-end to generate that
temporary, we now have horrible code: we might be copying a 1MB structure
into a temporary just to retreive one byte!
However, a side-effect of allowing this is that we allow the conversion as
the *outer* operation. That hasn't be quite correct for a while, but
apparently never caused problems before.
So my suggestion is to modify handled_component_p to exclude a conversion at
the outer level but to have a recursive version of it that *does* allow the
conversion inside fields. But I don't know if that addresses your issue.