------- Comment #7 from bonzini at gcc dot gnu dot org 2005-11-09 08:20 ------- Reduced testcase
/* { dg-do run } */ /* { dg-options "-O -fdump-tree-dom3" } */ int Link[] = { -1 }; int W[] = { 2 }; extern void abort (void); int f (int k, int p) { int pdest, j, D1361; j = 0; pdest = 0; for (;;) { if (pdest > 2) do j--, pdest++; while (j > 2); if (j == 1) break; while (pdest > p) if (j == p) pdest++; do { D1361 = W[k]; do if (D1361 != 0) pdest = 1, W[k] = D1361 = 0; while (p < 1); } while (k > 0); do { p = 0; k = Link[k]; while (p < j) if (k != -1) pdest++, p++; } while (k != -1); j = 1; } /* The correct return value should be pdest (1 in the call from main). DOM3 is mistaken and propagates a 0 here. */ return pdest; } int main () { if (!f (0, 2)) abort (); return 0; } /* { dg-final { scan-tree-dump-times "return 0" 1 "dom3" } } */ /* { dg-final { cleanup-tree-dump "dom3" } } */ -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24716