/* { dg-do compile } */ /* { dg-options "-O2 -fdump-tree-threadfull1-stats" } */ struct S; struct S { struct S *next; }; int foo (struct S *chain, _Bool is_ctor, _Bool is_dtor) { int num_args = 0; if (chain) /* A */ { do { num_args++; chain = chain->next; if (!chain) break; } while (1); } if (is_ctor) num_args++; /* B */ if (is_dtor) num_args++; else { if (num_args > 2) /* C */ __builtin_puts ("x"); } return num_args; } /* We want to thread both paths from A with NULL chain to C, the one through B and one around it. ??? Ideally we'd thread one "path" containing the half-diamond with B. */ /* { dg-final { scan-tree-dump "Jumps threaded: 2" "threadfull1" } } */