genmatch was fooled by singelton expression leafs so it omitted the required TREE_SIDE_EFFECTS check and building a COMPOUND_EXPR for the side-effects.
Bootstrapped on x86_64-unknown-linux-gnu, testing in progress. Richard. 2018-02-28 Richard Biener <rguent...@suse.de> PR middle-end/84607 * genmatch.c (capture_info::walk_match): Do not mark captured expressions without operands as expr_p given they act more like predicates and should be subject to "lost tail" side-effect preserving. * gcc.dg/pr84607.c: New testcase. Index: gcc/genmatch.c =================================================================== --- gcc/genmatch.c (revision 258056) +++ gcc/genmatch.c (working copy) @@ -2104,7 +2104,11 @@ capture_info::walk_match (operand *o, un if (c->what && (e = dyn_cast <expr *> (c->what))) { - info[where].expr_p = true; + /* Zero-operand expression captures like ADDR_EXPR@0 are + similar as predicates -- if they are not mentioned in + the result we have to force them to have no side-effects. */ + if (e->ops.length () != 0) + info[where].expr_p = true; info[where].force_single_use |= e->force_single_use; } } Index: gcc/testsuite/gcc.dg/pr84607.c =================================================================== --- gcc/testsuite/gcc.dg/pr84607.c (nonexistent) +++ gcc/testsuite/gcc.dg/pr84607.c (working copy) @@ -0,0 +1,16 @@ +/* { dg-do run } */ + +extern void exit(int); +extern void abort(void); +int a[10]; +int foo() +{ + exit (0); + return 0; +} +int main() +{ + if (&a[foo()]) + abort (); + return 0; +}