Hmm, odd that such a rule wouldn't exist.  

Not at all odd!  We have almost no rules *whatsoever* on what's allowed
in each operand of a GENERIC tree.  That's the problem here.

    To me it seems an ADDR_EXPR only makes sense on something that is
    addressable,

First of all, define "addressable".  Clearly a STRING_CST is, but is an
INTEGER_CST?

But secondly, why make that restriction at all?  Suppose I have a function to
which a language semantics requires passing by reference.  Now suppose the
operand is "a + b".  Why not just make an ADDR_EXPR of the PLUS_EXPR?

Sure, the front end *could* make a temporary, but the gimplifier has all the
logic already to do that, so why shouldn't it?

The whole point of the gimplifier is to avoid making too many restrictions on
what are valid trees: it's GIMPLE where we want to make those restrictions.
It seems very duplicative to me to say that the process of creating
temporaries for certain expressable trees is the job of the front end and for
others is the job of the gimplifier?  Why not just be consistent and say it's
the gimplifier's job to do all of them?

Reply via email to