forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			339 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			339 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			C
		
	
	
	
// RUN: %clang_analyze_cc1 %s \
 | 
						|
// RUN:   -analyzer-checker=debug.DumpDominators \
 | 
						|
// RUN:   -analyzer-checker=debug.DumpPostDominators \
 | 
						|
// RUN:   -analyzer-checker=debug.DumpControlDependencies \
 | 
						|
// RUN:   2>&1 | FileCheck %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;
 | 
						|
}
 | 
						|
 | 
						|
// [B9 (ENTRY)] -> [B8] -> [B7] -> [B6] -> [B5] -> [B3] -> [B2]
 | 
						|
//                          |\       \              /       /
 | 
						|
//                          | \       ---> [B4] --->       /
 | 
						|
//                          |  <---------------------------
 | 
						|
//                          V
 | 
						|
//                         [B1] -> [B0 (EXIT)]
 | 
						|
 | 
						|
// CHECK:      Control dependencies (Node#,Dependency#):
 | 
						|
// CHECK-NEXT: (2,7)
 | 
						|
// CHECK-NEXT: (3,7)
 | 
						|
// CHECK-NEXT: (4,6)
 | 
						|
// CHECK-NEXT: (4,7)
 | 
						|
// CHECK-NEXT: (5,6)
 | 
						|
// CHECK-NEXT: (5,7)
 | 
						|
// CHECK-NEXT: (6,7)
 | 
						|
// CHECK-NEXT: (7,7)
 | 
						|
// CHECK-NEXT: Immediate dominance tree (Node#,IDom#):
 | 
						|
// CHECK-NEXT: (0,1)
 | 
						|
// CHECK-NEXT: (1,7)
 | 
						|
// CHECK-NEXT: (2,3)
 | 
						|
// CHECK-NEXT: (3,6)
 | 
						|
// CHECK-NEXT: (4,6)
 | 
						|
// CHECK-NEXT: (5,6)
 | 
						|
// CHECK-NEXT: (6,7)
 | 
						|
// CHECK-NEXT: (7,8)
 | 
						|
// CHECK-NEXT: (8,9)
 | 
						|
// CHECK-NEXT: (9,9)
 | 
						|
// CHECK-NEXT: Immediate post dominance tree (Node#,IDom#):
 | 
						|
// CHECK-NEXT: (0,0)
 | 
						|
// CHECK-NEXT: (1,0)
 | 
						|
// CHECK-NEXT: (2,7)
 | 
						|
// CHECK-NEXT: (3,2)
 | 
						|
// CHECK-NEXT: (4,3)
 | 
						|
// CHECK-NEXT: (5,3)
 | 
						|
// CHECK-NEXT: (6,3)
 | 
						|
// CHECK-NEXT: (7,1)
 | 
						|
// CHECK-NEXT: (8,7)
 | 
						|
// CHECK-NEXT: (9,8)
 | 
						|
 | 
						|
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;
 | 
						|
}
 | 
						|
 | 
						|
//                                    <-------------
 | 
						|
//                                   /              \
 | 
						|
//                    -----------> [B4] -> [B3] -> [B2]
 | 
						|
//                   /              |
 | 
						|
//                  /               V
 | 
						|
// [B7 (ENTRY)] -> [B6] -> [B5] -> [B1] -> [B0 (EXIT)]
 | 
						|
 | 
						|
// CHECK:      Control dependencies (Node#,Dependency#):
 | 
						|
// CHECK-NEXT: (2,4)
 | 
						|
// CHECK-NEXT: (2,6)
 | 
						|
// CHECK-NEXT: (3,4)
 | 
						|
// CHECK-NEXT: (3,6)
 | 
						|
// CHECK-NEXT: (4,6)
 | 
						|
// CHECK-NEXT: (4,4)
 | 
						|
// CHECK-NEXT: (5,6)
 | 
						|
// CHECK-NEXT: Immediate dominance tree (Node#,IDom#):
 | 
						|
// CHECK-NEXT: (0,1)
 | 
						|
// CHECK-NEXT: (1,6)
 | 
						|
// CHECK-NEXT: (2,3)
 | 
						|
// CHECK-NEXT: (3,4)
 | 
						|
// CHECK-NEXT: (4,6)
 | 
						|
// CHECK-NEXT: (5,6)
 | 
						|
// CHECK-NEXT: (6,7)
 | 
						|
// CHECK-NEXT: (7,7)
 | 
						|
// CHECK-NEXT: Immediate post dominance tree (Node#,IDom#):
 | 
						|
// CHECK-NEXT: (0,0)
 | 
						|
// CHECK-NEXT: (1,0)
 | 
						|
// CHECK-NEXT: (2,4)
 | 
						|
// CHECK-NEXT: (3,2)
 | 
						|
// CHECK-NEXT: (4,1)
 | 
						|
// CHECK-NEXT: (5,1)
 | 
						|
// CHECK-NEXT: (6,1)
 | 
						|
// CHECK-NEXT: (7,6)
 | 
						|
 | 
						|
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;
 | 
						|
}
 | 
						|
 | 
						|
//                           <- [B2] <-
 | 
						|
//                          /          \
 | 
						|
// [B8 (ENTRY)] -> [B7] -> [B6] ---> [B5] -> [B4] -> [B3]
 | 
						|
//                   \       |         \              /
 | 
						|
//                    \      |          <-------------
 | 
						|
//                     \      \
 | 
						|
//                      --------> [B1] -> [B0 (EXIT)]
 | 
						|
 | 
						|
// CHECK:      Control dependencies (Node#,Dependency#):
 | 
						|
// CHECK-NEXT: (2,6)
 | 
						|
// CHECK-NEXT: (2,7)
 | 
						|
// CHECK-NEXT: (3,5)
 | 
						|
// CHECK-NEXT: (3,6)
 | 
						|
// CHECK-NEXT: (3,7)
 | 
						|
// CHECK-NEXT: (4,5)
 | 
						|
// CHECK-NEXT: (4,6)
 | 
						|
// CHECK-NEXT: (4,7)
 | 
						|
// CHECK-NEXT: (5,6)
 | 
						|
// CHECK-NEXT: (5,5)
 | 
						|
// CHECK-NEXT: (5,7)
 | 
						|
// CHECK-NEXT: (6,7)
 | 
						|
// CHECK-NEXT: (6,6)
 | 
						|
// CHECK-NEXT: Immediate dominance tree (Node#,IDom#):
 | 
						|
// CHECK-NEXT: (0,1)
 | 
						|
// CHECK-NEXT: (1,7)
 | 
						|
// CHECK-NEXT: (2,5)
 | 
						|
// CHECK-NEXT: (3,4)
 | 
						|
// CHECK-NEXT: (4,5)
 | 
						|
// CHECK-NEXT: (5,6)
 | 
						|
// CHECK-NEXT: (6,7)
 | 
						|
// CHECK-NEXT: (7,8)
 | 
						|
// CHECK-NEXT: (8,8)
 | 
						|
// CHECK-NEXT: Immediate post dominance tree (Node#,IDom#):
 | 
						|
// CHECK-NEXT: (0,0)
 | 
						|
// CHECK-NEXT: (1,0)
 | 
						|
// CHECK-NEXT: (2,6)
 | 
						|
// CHECK-NEXT: (3,5)
 | 
						|
// CHECK-NEXT: (4,3)
 | 
						|
// CHECK-NEXT: (5,2)
 | 
						|
// CHECK-NEXT: (6,1)
 | 
						|
// CHECK-NEXT: (7,1)
 | 
						|
// CHECK-NEXT: (8,7)
 | 
						|
 | 
						|
int test4()
 | 
						|
{
 | 
						|
  int y = 3;
 | 
						|
  while(y > 0) {
 | 
						|
    if(y < 3) {
 | 
						|
      while(y>0)
 | 
						|
        y ++;
 | 
						|
    }else{
 | 
						|
      while(y<10)
 | 
						|
        y ++;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
//                               <----------------------------------
 | 
						|
//                              /              <-----------------   \
 | 
						|
//                             /              /                  \   \
 | 
						|
// [B12 (ENTRY)] -> [B11] -> [B10]-> [B9] -> [B8] ---> [B7] -> [B6]  |
 | 
						|
//                             |      \        \                     /
 | 
						|
//                             |       \        -----> [B2] --------/
 | 
						|
//                             |        \      /
 | 
						|
//                             |          -> [B5] -> [B4] -> [B3]
 | 
						|
//                             |               \              /
 | 
						|
//                             |                <------------
 | 
						|
//                              \
 | 
						|
//                               -> [B1] -> [B0 (EXIT)]
 | 
						|
 | 
						|
// CHECK:      Control dependencies (Node#,Dependency#):
 | 
						|
// CHECK-NEXT: (2,10)
 | 
						|
// CHECK-NEXT: (3,5)
 | 
						|
// CHECK-NEXT: (3,9)
 | 
						|
// CHECK-NEXT: (3,10)
 | 
						|
// CHECK-NEXT: (4,5)
 | 
						|
// CHECK-NEXT: (4,9)
 | 
						|
// CHECK-NEXT: (4,10)
 | 
						|
// CHECK-NEXT: (5,9)
 | 
						|
// CHECK-NEXT: (5,5)
 | 
						|
// CHECK-NEXT: (5,10)
 | 
						|
// CHECK-NEXT: (6,8)
 | 
						|
// CHECK-NEXT: (6,9)
 | 
						|
// CHECK-NEXT: (6,10)
 | 
						|
// CHECK-NEXT: (7,8)
 | 
						|
// CHECK-NEXT: (7,9)
 | 
						|
// CHECK-NEXT: (7,10)
 | 
						|
// CHECK-NEXT: (8,9)
 | 
						|
// CHECK-NEXT: (8,8)
 | 
						|
// CHECK-NEXT: (8,10)
 | 
						|
// CHECK-NEXT: (9,10)
 | 
						|
// CHECK-NEXT: (10,10)
 | 
						|
// CHECK-NEXT: Immediate dominance tree (Node#,IDom#):
 | 
						|
// CHECK-NEXT: (0,1)
 | 
						|
// CHECK-NEXT: (1,10)
 | 
						|
// CHECK-NEXT: (2,9)
 | 
						|
// CHECK-NEXT: (3,4)
 | 
						|
// CHECK-NEXT: (4,5)
 | 
						|
// CHECK-NEXT: (5,9)
 | 
						|
// CHECK-NEXT: (6,7)
 | 
						|
// CHECK-NEXT: (7,8)
 | 
						|
// CHECK-NEXT: (8,9)
 | 
						|
// CHECK-NEXT: (9,10)
 | 
						|
// CHECK-NEXT: (10,11)
 | 
						|
// CHECK-NEXT: (11,12)
 | 
						|
// CHECK-NEXT: (12,12)
 | 
						|
// CHECK-NEXT: Immediate post dominance tree (Node#,IDom#):
 | 
						|
// CHECK-NEXT: (0,0)
 | 
						|
// CHECK-NEXT: (1,0)
 | 
						|
// CHECK-NEXT: (2,10)
 | 
						|
// CHECK-NEXT: (3,5)
 | 
						|
// CHECK-NEXT: (4,3)
 | 
						|
// CHECK-NEXT: (5,2)
 | 
						|
// CHECK-NEXT: (6,8)
 | 
						|
// CHECK-NEXT: (7,6)
 | 
						|
// CHECK-NEXT: (8,2)
 | 
						|
// CHECK-NEXT: (9,2)
 | 
						|
// CHECK-NEXT: (10,1)
 | 
						|
// CHECK-NEXT: (11,10)
 | 
						|
// CHECK-NEXT: (12,11)
 | 
						|
 | 
						|
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;
 | 
						|
}
 | 
						|
 | 
						|
//                                                    [B0 (EXIT)] <--
 | 
						|
//                                                                   \
 | 
						|
// [B11 (ENTY)] -> [B10] -> [B9] -> [B8] -> [B7] -> [B5] -> [B3] -> [B1]
 | 
						|
//                            |       |       |      /       /       /
 | 
						|
//                            |       |       V     /       /       /
 | 
						|
//                            |       V     [B6] -->       /       /
 | 
						|
//                            V     [B4] ----------------->       /
 | 
						|
//                          [B2]--------------------------------->
 | 
						|
 | 
						|
// CHECK:      Control dependencies (Node#,Dependency#):
 | 
						|
// CHECK-NEXT: (2,10)
 | 
						|
// CHECK-NEXT: (3,10)
 | 
						|
// CHECK-NEXT: (4,9)
 | 
						|
// CHECK-NEXT: (4,10)
 | 
						|
// CHECK-NEXT: (5,9)
 | 
						|
// CHECK-NEXT: (5,10)
 | 
						|
// CHECK-NEXT: (6,8)
 | 
						|
// CHECK-NEXT: (6,9)
 | 
						|
// CHECK-NEXT: (6,10)
 | 
						|
// CHECK-NEXT: (7,8)
 | 
						|
// CHECK-NEXT: (7,9)
 | 
						|
// CHECK-NEXT: (7,10)
 | 
						|
// CHECK-NEXT: (8,9)
 | 
						|
// CHECK-NEXT: (8,10)
 | 
						|
// CHECK-NEXT: (9,10)
 | 
						|
// CHECK-NEXT: Immediate dominance tree (Node#,IDom#):
 | 
						|
// CHECK-NEXT: (0,1)
 | 
						|
// CHECK-NEXT: (1,10)
 | 
						|
// CHECK-NEXT: (2,10)
 | 
						|
// CHECK-NEXT: (3,9)
 | 
						|
// CHECK-NEXT: (4,9)
 | 
						|
// CHECK-NEXT: (5,8)
 | 
						|
// CHECK-NEXT: (6,8)
 | 
						|
// CHECK-NEXT: (7,8)
 | 
						|
// CHECK-NEXT: (8,9)
 | 
						|
// CHECK-NEXT: (9,10)
 | 
						|
// CHECK-NEXT: (10,11)
 | 
						|
// CHECK-NEXT: (11,11)
 | 
						|
// CHECK-NEXT: Immediate post dominance tree (Node#,IDom#):
 | 
						|
// CHECK-NEXT: (0,0)
 | 
						|
// CHECK-NEXT: (1,0)
 | 
						|
// CHECK-NEXT: (2,1)
 | 
						|
// CHECK-NEXT: (3,1)
 | 
						|
// CHECK-NEXT: (4,3)
 | 
						|
// CHECK-NEXT: (5,3)
 | 
						|
// CHECK-NEXT: (6,5)
 | 
						|
// CHECK-NEXT: (7,5)
 | 
						|
// CHECK-NEXT: (8,5)
 | 
						|
// CHECK-NEXT: (9,3)
 | 
						|
// CHECK-NEXT: (10,1)
 | 
						|
// CHECK-NEXT: (11,10)
 |