1 ; RUN: opt < %s -analyze -scalar-evolution | FileCheck %s 2 3 ; Check that we convert 4 ; zext((a * b)<nuw>) 5 ; to 6 ; (zext(a) * zext(b))<nuw> 7 8 declare i32 @get_int(); 9 10 ; Transform doesn't apply here, because %a lacks range metadata. 11 ; CHECK-LABEL: @no_range 12 define void @no_range() { 13 %a = call i32 @get_int() 14 %b = mul i32 %a, 4 15 %c = zext i32 %b to i64 16 ; CHECK: %c 17 ; CHECK-NEXT: --> (zext i32 (4 * %a) to i64) 18 ret void 19 } 20 21 ; CHECK-LABEL: @range 22 define void @range() { 23 %a = call i32 @get_int(), !range !{i32 0, i32 100} 24 %b = mul i32 %a, 4 25 %c = zext i32 %b to i64 26 ; CHECK: %c 27 ; CHECK-NEXT: --> (4 * (zext i32 %a to i64))<nuw><nsw> 28 ret void 29 } 30 31 ; CHECK-LABEL: @no_nuw 32 define void @no_nuw() { 33 %a = call i32 @get_int(), !range !{i32 0, i32 3} 34 %b = mul i32 %a, -100 35 ; CHECK: %b 36 ; CHECK-NEXT: --> (-100 * %a)<nsw> 37 ret void 38 } 39