On Fri, Jul 13, 2018 at 01:49:38PM +0200, Richard Biener wrote:
> The testcase in the PR, while previously ICEing because the C++ FE doesn't
> properly capture VLA size fields, now ICEs because gimplification
> introduces SSA uses that appear in a different function than its
> definition. This happens because there is tree sharing between
> the functions. For nested functions (which the C++ lambdas are not)
> such tree sharing ended up being harmless before GCC7 because unnesting
> resolves all locals with wrong origin to the static chain (and
> gimplification ordering made sure definitions always appear in the
> outer function).
>
> The following resolves this by unsharing size expressions in c-common.c
>
> I realize that this may end up pessimizing early code since 1:1
> tree-sharing with what is gimplified from a DECL_EXPR doesn't
> share the gimplification result.
I think the unsharing is just wrong, we never want to unshare those,
the SAVE_EXPR expression needs to be evaluated at the DECL_EXPR point and
never anywhere else, never twice (it could have side-effects etc.).
The C++ FE must be fixed to handle the lambda cases.
> Another option might be to force gimplification to not generate
> SSA temporaries when gimplifying size positions but gimplify_one_sizepos
> oddly enough unshares trees before gimplifying ...(!?) This would
> need to be removed (see patch after the tested patch below).
I like that gimplify_one_sizepos change much more (I guess we need a
non-lambda testcase).
Lambdas were broken even before GCC7, while we might not ICE, we certainly
didn't generate correct code.
Jakub