On Thu, Jul 5, 2012 at 8:45 PM, Tom de Vries <tom_devr...@mentor.com> wrote: > On 05/07/12 15:30, Michael Matz wrote: >> Hi, >> >> On Thu, 5 Jul 2012, Tom de Vries wrote: >> >>> The asserts allow the return result to be optimized, but not the cfg >>> conditions. >>> >>> AFAIU, we can insert the asserts earlier. F.i., we can insert >>> aD.1711_6 = ASSERT_EXPR <aD.1711_1(D), aD.1711_1(D) > 0> >>> before the GIMPLE_COND in bb2. >> >> Nope. That would require some more checks, in particular that the BB >> containing builtin_unreachable doesn't contain any other side-effects. >> Given this: >> >> if (i < 0) >> { do_something_interesting(); >> __builtin_unreachable(); >> } >> >> moving the assert before the if would remove the if condition, hence >> the call to do_something_interesting. You need to retain side-effects if >> there are any. >> > > Michael, > > Thanks for pointing that out. > > I tried a first stab at your suggestion of implementing the optimization in > pass_fold_builtins, it works for the test-case.
+static bool +optimize_unreachable (gimple_stmt_iterator i) +{ + gimple stmt; + basic_block bb; + edge_iterator ei; + edge e; + + for (gsi_prev (&i); !gsi_end_p (i); gsi_prev (&i)) + { + stmt = gsi_stmt (i); + if (gimple_has_side_effects (stmt)) + return false; + } I think we should rely on DCE to remove stmts without side-effects before __builtin_unreachable. Thus I'd make this basic_block bb = gsi_bb (i); for (gsi = gsi_start (bb); !gsi_end_p (i); gsi_next (&gsi)) { if (is_gimple_debug ()) continue; if (gimple_code () == GIMPLE_LABEL) /* Verify we do not need to preserve the label. */; if (gsi_stmt () != gsi_stmt (i)) return false; } ... thus simply require the builtin be the first statement in the block. As for the label I'm concerned about void foo (int b, int c) { void *x = &&lab; if (b) { lab: __builtin_unreachable (); } lab2: if (c) x = &&lab2; goto *x; } non-sensical, of course, but "valid". Richard. > Thanks, > - Tom > >> >> Ciao, >> Michael. >> > >