39 lines
		
	
	
		
			848 B
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			39 lines
		
	
	
		
			848 B
		
	
	
	
		
			LLVM
		
	
	
	
; RUN: opt < %s -analyze -scalar-evolution | FileCheck %s
 | 
						|
 | 
						|
; Check that we convert
 | 
						|
;   zext((a * b)<nuw>)
 | 
						|
; to
 | 
						|
;   (zext(a) * zext(b))<nuw>
 | 
						|
 | 
						|
declare i32 @get_int();
 | 
						|
 | 
						|
; Transform doesn't apply here, because %a lacks range metadata.
 | 
						|
; CHECK-LABEL: @no_range
 | 
						|
define void @no_range() {
 | 
						|
  %a = call i32 @get_int()
 | 
						|
  %b = mul i32 %a, 4
 | 
						|
  %c = zext i32 %b to i64
 | 
						|
  ; CHECK: %c
 | 
						|
  ; CHECK-NEXT: --> (zext i32 (4 * %a) to i64)
 | 
						|
  ret void
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @range
 | 
						|
define void @range() {
 | 
						|
  %a = call i32 @get_int(), !range !{i32 0, i32 100}
 | 
						|
  %b = mul i32 %a, 4
 | 
						|
  %c = zext i32 %b to i64
 | 
						|
  ; CHECK: %c
 | 
						|
  ; CHECK-NEXT: --> (4 * (zext i32 %a to i64))<nuw><nsw>
 | 
						|
  ret void
 | 
						|
}
 | 
						|
 | 
						|
; CHECK-LABEL: @no_nuw
 | 
						|
define void @no_nuw() {
 | 
						|
  %a = call i32 @get_int(), !range !{i32 0, i32 3}
 | 
						|
  %b = mul i32 %a, -100
 | 
						|
  ; CHECK: %b
 | 
						|
  ; CHECK-NEXT: -->  (-100 * %a)<nsw>
 | 
						|
  ret void
 | 
						|
}
 |