70 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			LLVM
		
	
	
	
; RUN: opt -S -loop-simplify -disable-output -verify-loop-info -verify-dom-info < %s
 | 
						|
; PR5235
 | 
						|
 | 
						|
; When loopsimplify inserts a preheader for this loop, it should add the new
 | 
						|
; block to the enclosing loop and not get confused by the unreachable
 | 
						|
; bogus loop entry.
 | 
						|
 | 
						|
define void @is_extract_cab() nounwind {
 | 
						|
entry:
 | 
						|
  br label %header
 | 
						|
 | 
						|
header:                                       ; preds = %if.end206, %cond.end66, %if.end23
 | 
						|
  br label %while.body115
 | 
						|
 | 
						|
while.body115:                                    ; preds = %9, %if.end192, %if.end101
 | 
						|
  br i1 undef, label %header, label %while.body115
 | 
						|
 | 
						|
foo:
 | 
						|
  br label %while.body115
 | 
						|
}
 | 
						|
 | 
						|
; When loopsimplify generates dedicated exit block for blocks that are landing
 | 
						|
; pads (i.e. innerLoopExit in this test), we should not get confused with the
 | 
						|
; unreachable pred (unreachableB) to innerLoopExit.
 | 
						|
define align 8 void @baz(i32 %trip) personality i32* ()* @wobble {
 | 
						|
entry:
 | 
						|
  br label %outerHeader
 | 
						|
 | 
						|
outerHeader:
 | 
						|
  invoke void @foo() 
 | 
						|
          to label %innerPreheader unwind label %innerLoopExit
 | 
						|
 | 
						|
innerPreheader:
 | 
						|
  br label %innerH
 | 
						|
 | 
						|
innerH:
 | 
						|
  %tmp50 = invoke i8 * undef()
 | 
						|
          to label %innerLatch unwind label %innerLoopExit
 | 
						|
 | 
						|
innerLatch:
 | 
						|
  %cmp = icmp slt i32 %trip, 42
 | 
						|
  br i1 %cmp, label %innerH, label %retblock
 | 
						|
 | 
						|
unreachableB:                                             ; No predecessors!
 | 
						|
  %tmp62 = invoke i8 * undef()
 | 
						|
          to label %retblock unwind label %innerLoopExit
 | 
						|
 | 
						|
; undedicated exit block (preds from inner and outer loop)
 | 
						|
; Also has unreachableB as pred.
 | 
						|
innerLoopExit:
 | 
						|
  %tmp65 = landingpad { i8*, i32 }
 | 
						|
          cleanup
 | 
						|
  invoke void @foo() 
 | 
						|
          to label %outerHeader unwind label %unwindblock
 | 
						|
 | 
						|
unwindblock:
 | 
						|
  %tmp67 = landingpad { i8*, i32 }
 | 
						|
          cleanup
 | 
						|
  ret void
 | 
						|
 | 
						|
retblock:
 | 
						|
  ret void
 | 
						|
}
 | 
						|
 | 
						|
; Function Attrs: nounwind
 | 
						|
declare i32* @wobble()
 | 
						|
 | 
						|
; Function Attrs: uwtable
 | 
						|
declare void @foo()
 |