On Tue, Jul 12, 2011 at 11:42 AM, Andrew Pinski <pins...@gmail.com> wrote: > Hi, > The problem here is the code reads: > /* Check for more than one successor. */ > if (! EDGE_COUNT (bb->succs) > 1) > But that expression is always false as ! has a higher precedence than >> does. So the obvious thing is to rewrite this statement as: > if (EDGE_COUNT (bb->succs) <= 1) > And that fixes the problem. The only case where this case matters is > with __builtin_unreachable as fis_get_condition will return null for > all other cases where there are only one successor edge and we check > that result. > > Committed as obvious after a bootstrap/test on x86_64-linux-gnu. > > Thanks, > Andrew Pinski > > ChangeLog:
* cprop.c (find_implicit_sets): Correct the condition.
Index: testsuite/gcc.c-torture/compile/pr49474.c =================================================================== --- testsuite/gcc.c-torture/compile/pr49474.c (revision 0) +++ testsuite/gcc.c-torture/compile/pr49474.c (revision 0) @@ -0,0 +1,16 @@ +typedef struct gfc_formal_arglist +{ + int next; +} +gfc_actual_arglist; +update_arglist_pass (gfc_actual_arglist* lst, int po, unsigned argpos, + const char *name) +{ + ((void)(__builtin_expect(!(argpos > 0), 0) ? __builtin_unreachable(), 0 : 0)); + if (argpos == 1) + return 0; + if (lst) + lst->next = update_arglist_pass (lst->next, po, argpos - 1, name); + else + lst = update_arglist_pass (((void *)0), po, argpos - 1, name); +} Index: cprop.c =================================================================== --- cprop.c (revision 176187) +++ cprop.c (working copy) @@ -1332,7 +1332,7 @@ find_implicit_sets (void) FOR_EACH_BB (bb) { /* Check for more than one successor. */ - if (! EDGE_COUNT (bb->succs) > 1) + if (EDGE_COUNT (bb->succs) <= 1) continue; cond = fis_get_condition (BB_END (bb));