1; RUN: opt < %s -disable-output "-passes=print<scalar-evolution>" 2>&1 | FileCheck %s 2 3; Check that we convert 4; zext((a * b)<nuw>) 5; to 6; (zext(a) * zext(b))<nuw> 7 8declare i32 @get_int(); 9 10; Transform doesn't apply here, because %a lacks range metadata. 11; CHECK-LABEL: @no_range 12define 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 22define 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 32define 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