/* PR tree-optimization/34244 */ /* { dg-do run } */ /* { dg-options "-O2 " } */ int __attribute__((noinline)) GetParent(void) { static int count = 0; count++; switch (count) { case 1: case 3: case 4: return 1; default: return 0; } } int __attribute__((noinline)) FindCommonAncestor(int aNode1, int aNode2) { if (aNode1 && aNode2) { int offset = 0; int anc1 = aNode1; for (;;) { ++offset; int parent = GetParent(); if (!parent) break; anc1 = parent; } int anc2 = aNode2; for (;;) { --offset; int parent = GetParent(); if (!parent) break; anc2 = parent; } if (anc1 == anc2) { anc1 = aNode1; anc2 = aNode2; while (offset > 0) { anc1 = GetParent(); --offset; } while (offset < 0) { anc2 = GetParent(); ++offset; } while (anc1 != anc2) { anc1 = GetParent(); anc2 = GetParent(); } return anc1; } } return 0; } extern void abort (void); int main() { if (FindCommonAncestor (1, 1) != 0) abort (); return 0; }