| // 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) |
| |
| |