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