143 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			143 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			LLVM
		
	
	
	
; RUN: opt < %s -passes='print<phi-values>' -disable-output 2>&1 | FileCheck %s
 | 
						|
 | 
						|
; This test uses a long chain of phis that take themselves as an operand, which causes
 | 
						|
; phi values analysis to segfault if it's not careful about that kind of thing.
 | 
						|
 | 
						|
; CHECK-LABEL: PHI Values for function: fn
 | 
						|
define void @fn(i32* %arg) {
 | 
						|
entry:
 | 
						|
  br label %while1.cond
 | 
						|
 | 
						|
while1.cond:
 | 
						|
; CHECK: PHI %phi1 has values:
 | 
						|
; CHECK: i32* %arg
 | 
						|
  %phi1 = phi i32* [ %arg, %entry ], [ %phi2, %while1.then ]
 | 
						|
  br i1 undef, label %while1.end, label %while1.body
 | 
						|
 | 
						|
while1.body:
 | 
						|
  br i1 undef, label %while1.then, label %while1.if
 | 
						|
 | 
						|
while1.if:
 | 
						|
  br label %while1.then
 | 
						|
 | 
						|
while1.then:
 | 
						|
; CHECK: PHI %phi2 has values:
 | 
						|
; CHECK: i32* %arg
 | 
						|
  %phi2 = phi i32* [ %arg, %while1.if ], [ %phi1, %while1.body ]
 | 
						|
  br label %while1.cond
 | 
						|
 | 
						|
while1.end:
 | 
						|
  br label %while2.cond1
 | 
						|
 | 
						|
while2.cond1:
 | 
						|
; CHECK: PHI %phi3 has values:
 | 
						|
; CHECK: i32* %arg
 | 
						|
  %phi3 = phi i32* [ %phi1, %while1.end ], [ %phi5, %while2.then ]
 | 
						|
  br i1 undef, label %while2.end, label %while2.body1
 | 
						|
 | 
						|
while2.body1:
 | 
						|
  br i1 undef, label %while2.cond2, label %while2.then
 | 
						|
 | 
						|
while2.cond2:
 | 
						|
; CHECK: PHI %phi4 has values:
 | 
						|
; CHECK: i32* %arg
 | 
						|
  %phi4 = phi i32* [ %phi3, %while2.body1 ], [ %phi4, %while2.if ]
 | 
						|
  br i1 undef, label %while2.then, label %while2.if
 | 
						|
 | 
						|
while2.if:
 | 
						|
  br label %while2.cond2
 | 
						|
 | 
						|
while2.then:
 | 
						|
; CHECK: PHI %phi5 has values:
 | 
						|
; CHECK: i32* %arg
 | 
						|
  %phi5 = phi i32* [ %phi3, %while2.body1 ], [ %phi4, %while2.cond2 ]
 | 
						|
  br label %while2.cond1
 | 
						|
 | 
						|
while2.end:
 | 
						|
  br label %while3.cond1
 | 
						|
 | 
						|
while3.cond1:
 | 
						|
; CHECK: PHI %phi6 has values:
 | 
						|
; CHECK: i32* %arg
 | 
						|
  %phi6 = phi i32* [ %phi3, %while2.end ], [ %phi7, %while3.cond2 ]
 | 
						|
  br i1 undef, label %while3.end, label %while3.cond2
 | 
						|
 | 
						|
while3.cond2:
 | 
						|
; CHECK: PHI %phi7 has values:
 | 
						|
; CHECK: i32* %arg
 | 
						|
  %phi7 = phi i32* [ %phi6, %while3.cond1 ], [ %phi7, %while3.body ]
 | 
						|
  br i1 undef, label %while3.cond1, label %while3.body
 | 
						|
 | 
						|
while3.body:
 | 
						|
  br label %while3.cond2
 | 
						|
 | 
						|
while3.end:
 | 
						|
  br label %while4.cond1
 | 
						|
 | 
						|
while4.cond1:
 | 
						|
; CHECK: PHI %phi8 has values:
 | 
						|
; CHECK: i32* %arg
 | 
						|
  %phi8 = phi i32* [ %phi6, %while3.end ], [ %phi10, %while4.then ]
 | 
						|
  br i1 undef, label %while4.end, label %while4.if
 | 
						|
 | 
						|
while4.if:
 | 
						|
  br i1 undef, label %while4.cond2, label %while4.then
 | 
						|
 | 
						|
while4.cond2:
 | 
						|
; CHECK: PHI %phi9 has values:
 | 
						|
; CHECK: i32* %arg
 | 
						|
  %phi9 = phi i32* [ %phi8, %while4.if ], [ %phi9, %while4.body ]
 | 
						|
  br i1 undef, label %while4.then, label %while4.body
 | 
						|
 | 
						|
while4.body:
 | 
						|
  br label %while4.cond2
 | 
						|
 | 
						|
while4.then:
 | 
						|
; CHECK: PHI %phi10 has values:
 | 
						|
; CHECK: i32* %arg
 | 
						|
  %phi10 = phi i32* [ %phi8, %while4.if ], [ %phi9, %while4.cond2 ]
 | 
						|
  br label %while4.cond1
 | 
						|
 | 
						|
while4.end:
 | 
						|
  br label %while5.cond
 | 
						|
 | 
						|
while5.cond:
 | 
						|
; CHECK: PHI %phi11 has values:
 | 
						|
; CHECK: i32* %arg
 | 
						|
  %phi11 = phi i32* [ %phi8, %while4.end ], [ %phi13, %while5.then ]
 | 
						|
  br i1 undef, label %while5.end, label %while5.body1
 | 
						|
 | 
						|
while5.body1:
 | 
						|
  br i1 undef, label %while5.if, label %while5.then
 | 
						|
 | 
						|
while5.if:
 | 
						|
; CHECK: PHI %phi12 has values:
 | 
						|
; CHECK: i32* %arg
 | 
						|
  %phi12 = phi i32* [ %phi11, %while5.body1 ], [ %phi12, %while5.body2 ]
 | 
						|
  br i1 undef, label %while5.then, label %while5.body2
 | 
						|
 | 
						|
while5.body2:
 | 
						|
  br label %while5.if
 | 
						|
 | 
						|
while5.then:
 | 
						|
; CHECK: PHI %phi13 has values:
 | 
						|
; CHECK: i32* %arg
 | 
						|
  %phi13 = phi i32* [ %phi11, %while5.body1 ], [ %phi12, %while5.if ]
 | 
						|
  br label %while5.cond
 | 
						|
 | 
						|
while5.end:
 | 
						|
  br label %while6.cond1
 | 
						|
 | 
						|
while6.cond1:
 | 
						|
; CHECK: PHI %phi14 has values:
 | 
						|
; CHECK: i32* %arg
 | 
						|
  %phi14 = phi i32* [ %phi11, %while5.end ], [ %phi14, %while6.cond1 ]
 | 
						|
  br i1 undef, label %while6.cond2, label %while6.cond1
 | 
						|
 | 
						|
while6.cond2:
 | 
						|
; CHECK: PHI %phi15 has values:
 | 
						|
; CHECK: i32* %arg
 | 
						|
  %phi15 = phi i32* [ %phi14, %while6.cond1 ], [ %phi15, %while6.cond2 ]
 | 
						|
  br label %while6.cond2
 | 
						|
}
 |