On Mon, 3 Aug 2015, Martin Sebor wrote: > because the ternary ?: expression is folded into a constant by > the front end even before it reaches the gimplifier, while the > if-else statement isn't folded until the control flow graph is > built. (As an aside: I'm wondering why that is. Why have the > front end do any optimization at all if the middle can and > does them too, and better?)
Well, in C, if an expression is an integer constant expression, then in certain contexts its folded value needs to be known for checking lots of other constraints that should be diagnosed in the front end, such as on bit-field widths and array sizes - and then it needs to be known for layout so that sizeof and offsetof (which can be used in other integer constant expressions) can be computed. And in other contexts (pointers conditional expressions), the value of an integer constant expression affects the type of the containing expression, so types cannot be determined without folding (with consequent effects on other diagnostics). And then certain expressions that aren't integer constant expressions but can be folded to them in fact get used (e.g. in the Linux kernel) in contexts requiring integer constant expressions, so also need folding. And then a wider range of expressions need folding in static initializers so the front end can diagnose whether an initializer is valid or not, while allowing extensions that again are used in practice (though there's a possibility such diagnostics for initializers could be left until after some middle-end optimization). -- Joseph S. Myers jos...@codesourcery.com