|  | // RUN: rm -f %t | 
|  | // RUN: %clang_analyze_cc1 -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) | 
|  |  | 
|  |  |