> From: Jakub Jelinek [mailto:ja...@redhat.com]
> Sent: 15 March 2013 13:06
> On Fri, Mar 15, 2013 at 08:00:50AM -0500, Gabriel Dos Reis wrote:
> > On Fri, Mar 15, 2013 at 3:51 AM, Richard Biener
> > <richard.guent...@gmail.com> wrote:
> > > On Thu, Mar 14, 2013 at 10:08 PM, Marc Glisse
> <marc.gli...@inria.fr> wrote:
> > >> On Thu, 14 Mar 2013, Jakub Jelinek wrote:
> > >>
> > >>> I wonder if it wouldn't be better to fold the target builtins
> only later
> > >>> on
> > >>> (e.g. guard the folding with cfun && gimple_in_ssa_p (cfun) (or
> if we have
> > >>> any predicate that is set starting with gimplification or so)).
> > >>> Having all the FEs have to deal with myriads of weird tree codes
> etc.
> > >>> isn't
> > >>> IMHO desirable.
> > >>
> > >>
> > >> Wouldn't that prevent from using those builtins in constant
> expressions?
> > >> That seems undesirable. Maybe an alternative could be to push some
> of the
> > >> functionality from potential_constant_expression_1 to the middle-
> end?
> > >
> > > True, but is that bad?
> > >
> > > If we want to delay such folding then please don't do it with a
> magic flag
> > > but instead do the folding only via fold_stmt - that is, add a new
> target hook
> > > that folds a gimple call.  I bet we have only a very limited set of
> target call
> > > foldings, so transitioning them all to fold gimple calls would be
> easy.
> >
> > upon reflection, I think we don't want to delay.  the C++ front-end
> > needs to know (while type checking) whether a certain operation
> > can be evaluated at compile time and possibly get the value of the
> > operation.
> 
> If all arguments to the target builtin constant, then it better not be
> folded into REDUC_PLUS_EXPR, but instead just some constant.  That is
> just
> fine.  If all arguments to the target builtin aren't constant, then it
> won't
> be a constant expression anyway, there is no point in showing all those
> weird tree codes to the FE.

So based on this argument, while a front-end may not need to implement
all the weird tree codes it should at least have a sensible default
case for an tree code which it doesn't understand.

That would suggest the correct fix would be to change
potential_constant_expression_1 to simply return false if it encounters
a tree it doesn't know about, rather than the current gcc_unreachable ().

The argument would be; if we found an unexpected tree code then
it must have been introduced by folding. If it was a constant,
folding would have returned the constant not the expression. So it must
not be a constant.

Is that be sensible? It certainly seems like someone intended to
explicitly enumerate all the possible cases and ensure that they were
correctly handled.

I have some other patches kicking around which will fold to REDUC_MAX_EXPR,
which will be another unhandled tree code. The approach of adding a case
in potential_constant_expression_1 each time a shiny new tree code appears
just feels wrong.

James



Reply via email to