49 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			49 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			LLVM
		
	
	
	
; RUN: opt -loop-unswitch-memoryssa-threshold=0 -memssa-check-limit=1 -passes='loop-mssa(simple-loop-unswitch<nontrivial>),verify<loops>' -S < %s | FileCheck --check-prefix=THRESHOLD-0 %s
 | 
						|
; RUN: opt -memssa-check-limit=1 -passes='loop-mssa(simple-loop-unswitch<nontrivial>),verify<loops>' -S < %s | FileCheck --check-prefix=THRESHOLD-DEFAULT %s
 | 
						|
 | 
						|
; Make sure -loop-unswitch-memoryssa-threshold works. The test uses
 | 
						|
; -memssa-check-limit=1 to effectively disable any MemorySSA optimizations
 | 
						|
; on construction, so the test can be kept simple.
 | 
						|
 | 
						|
declare void @clobber()
 | 
						|
 | 
						|
; Partial unswitching is possible, because the store in %noclobber does not
 | 
						|
; alias the load of the condition.
 | 
						|
define i32 @partial_unswitch_true_successor_noclobber(i32* noalias %ptr.1, i32* noalias %ptr.2, i32 %N) {
 | 
						|
; THRESHOLD-0-LABEL: @partial_unswitch_true_successor
 | 
						|
; THRESHOLD-0: entry:
 | 
						|
; THRESHOLD-0: br label %loop.header
 | 
						|
;
 | 
						|
; THRESHOLD-DEFAULT-LABEL: @partial_unswitch_true_successor
 | 
						|
; THRESHOLD-DEFAULT-NEXT:  entry:
 | 
						|
; THRESHOLD-DEFAULT-NEXT:   [[LV:%[0-9]+]] = load i32, i32* %ptr.1, align 4
 | 
						|
; THRESHOLD-DEFAULT-NEXT:   [[C:%[0-9]+]] = icmp eq i32 [[LV]], 100
 | 
						|
; THRESHOLD-DEFAULT-NEXT:   br i1 [[C]]
 | 
						|
;
 | 
						|
entry:
 | 
						|
  br label %loop.header
 | 
						|
 | 
						|
loop.header:
 | 
						|
  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]
 | 
						|
  %lv = load i32, i32* %ptr.1
 | 
						|
  %sc = icmp eq i32 %lv, 100
 | 
						|
  br i1 %sc, label %noclobber, label %clobber
 | 
						|
 | 
						|
noclobber:
 | 
						|
  %gep.1 = getelementptr i32, i32* %ptr.2, i32 %iv
 | 
						|
  store i32 %lv, i32* %gep.1
 | 
						|
  br label %loop.latch
 | 
						|
 | 
						|
clobber:
 | 
						|
  call void @clobber()
 | 
						|
  br label %loop.latch
 | 
						|
 | 
						|
loop.latch:
 | 
						|
  %c = icmp ult i32 %iv, %N
 | 
						|
  %iv.next = add i32 %iv, 1
 | 
						|
  br i1 %c, label %loop.header, label %exit
 | 
						|
 | 
						|
exit:
 | 
						|
  ret i32 10
 | 
						|
}
 |