// RUN: rm -f %t // RUN: %clang_cc1 -analyze -analyzer-checker=debug.DumpDominators %s > %t 2>&1 // RUN: FileCheck --input-file=%t %s // Test the DominatorsTree implementation with various control flows int test1() { int x = 6; int y = x/2; int z; while(y > 0) { if(y < x) { x = x/y; y = y-1; }else{ z = x - y; } x = x - 1; x = x - 1; } z = x+y; z = 3; return 0; } // CHECK: Immediate dominance tree (Node#,IDom#): // CHECK: (0,1) // CHECK: (1,7) // CHECK: (2,3) // CHECK: (3,6) // CHECK: (4,6) // CHECK: (5,6) // CHECK: (6,7) // CHECK: (7,8) // CHECK: (8,9) // CHECK: (9,9) int test2() { int x,y,z; x = 10; y = 100; if(x > 0){ y = 1; }else{ while(x<=0){ x++; y++; } } z = y; return 0; } // CHECK: Immediate dominance tree (Node#,IDom#): // CHECK: (0,1) // CHECK: (1,6) // CHECK: (2,3) // CHECK: (3,4) // CHECK: (4,6) // CHECK: (5,6) // CHECK: (6,7) // CHECK: (7,7) int test3() { int x,y,z; x = y = z = 1; if(x>0) { while(x>=0){ while(y>=x) { x = x-1; y = y/2; } } } z = y; return 0; } // CHECK: Immediate dominance tree (Node#,IDom#): // CHECK: (0,1) // CHECK: (1,7) // CHECK: (2,5) // CHECK: (3,4) // CHECK: (4,5) // CHECK: (5,6) // CHECK: (6,7) // CHECK: (7,8) // CHECK: (8,8) int test4() { int y = 3; while(y > 0) { if(y < 3) { while(y>0) y ++; }else{ while(y<10) y ++; } } return 0; } // CHECK: Immediate dominance tree (Node#,IDom#): // CHECK: (0,1) // CHECK: (1,10) // CHECK: (2,9) // CHECK: (3,4) // CHECK: (4,5) // CHECK: (5,9) // CHECK: (6,7) // CHECK: (7,8) // CHECK: (8,9) // CHECK: (9,10) // CHECK: (10,11) // CHECK: (11,12) // CHECK: (12,12) int test5() { int x,y,z,a,b,c; x = 1; y = 2; z = 3; a = 4; b = 5; c = 6; if ( x < 10 ) { if ( y < 10 ) { if ( z < 10 ) { x = 4; } else { x = 5; } a = 10; } else { x = 6; } b = 10; } else { x = 7; } c = 11; return 0; } // CHECK: Immediate dominance tree (Node#,IDom#): // CHECK: (0,1) // CHECK: (1,10) // CHECK: (2,10) // CHECK: (3,9) // CHECK: (4,9) // CHECK: (5,8) // CHECK: (6,8) // CHECK: (7,8) // CHECK: (8,9) // CHECK: (9,10) // CHECK: (10,11) // CHECK: (11,11)