1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3 4; 5; Sign-extend 6; 7 8define i32 @vscale_SExt_i8toi32() vscale_range(1, 64) { 9; CHECK-LABEL: @vscale_SExt_i8toi32( 10; CHECK-NEXT: entry: 11; CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.vscale.i32() 12; CHECK-NEXT: ret i32 [[TMP0]] 13; 14entry: 15 %0 = call i8 @llvm.vscale.i8() 16 %1 = sext i8 %0 to i32 17 ret i32 %1 18} 19 20define i32 @vscale_SExt_i8toi32_poison() vscale_range(1, 128) { 21; CHECK-LABEL: @vscale_SExt_i8toi32_poison( 22; CHECK-NEXT: entry: 23; CHECK-NEXT: [[TMP0:%.*]] = call i8 @llvm.vscale.i8() 24; CHECK-NEXT: [[TMP1:%.*]] = sext i8 [[TMP0]] to i32 25; CHECK-NEXT: ret i32 [[TMP1]] 26; 27 entry: 28 %0 = call i8 @llvm.vscale.i8() 29 %1 = sext i8 %0 to i32 30 ret i32 %1 31} 32 33; 34; Zero-extend 35; 36 37define i32 @vscale_ZExt_i8toi32() vscale_range(1, 128) { 38; CHECK-LABEL: @vscale_ZExt_i8toi32( 39; CHECK-NEXT: entry: 40; CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.vscale.i32() 41; CHECK-NEXT: ret i32 [[TMP0]] 42; 43entry: 44 %0 = call i8 @llvm.vscale.i8() 45 %1 = zext i8 %0 to i32 46 ret i32 %1 47} 48 49define i32 @vscale_ZExt_i8toi32_poison() vscale_range(1, 256) { 50; CHECK-LABEL: @vscale_ZExt_i8toi32_poison( 51; CHECK-NEXT: entry: 52; CHECK-NEXT: [[TMP0:%.*]] = call i8 @llvm.vscale.i8() 53; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[TMP0]] to i32 54; CHECK-NEXT: ret i32 [[TMP1]] 55; 56 entry: 57 %0 = call i8 @llvm.vscale.i8() 58 %1 = zext i8 %0 to i32 59 ret i32 %1 60} 61 62; 63; No vscale_range attribute 64; 65 66define i32 @vscale_ZExt_i8toi32_unknown() { 67; CHECK-LABEL: @vscale_ZExt_i8toi32_unknown( 68; CHECK-NEXT: entry: 69; CHECK-NEXT: [[TMP0:%.*]] = call i8 @llvm.vscale.i8() 70; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[TMP0]] to i32 71; CHECK-NEXT: ret i32 [[TMP1]] 72; 73 entry: 74 %0 = call i8 @llvm.vscale.i8() 75 %1 = zext i8 %0 to i32 76 ret i32 %1 77} 78 79; 80; unbounded vscale_range maximum (0) 81; 82 83define i32 @vscale_SExt_i8toi32_unbounded() vscale_range(1, 0) { 84; CHECK-LABEL: @vscale_SExt_i8toi32_unbounded( 85; CHECK-NEXT: entry: 86; CHECK-NEXT: [[TMP0:%.*]] = call i8 @llvm.vscale.i8() 87; CHECK-NEXT: [[TMP1:%.*]] = sext i8 [[TMP0]] to i32 88; CHECK-NEXT: ret i32 [[TMP1]] 89; 90 entry: 91 %0 = call i8 @llvm.vscale.i8() 92 %1 = sext i8 %0 to i32 93 ret i32 %1 94} 95 96define i32 @vscale_ZExt_i8toi32_unbounded() vscale_range(1, 0) { 97; CHECK-LABEL: @vscale_ZExt_i8toi32_unbounded( 98; CHECK-NEXT: entry: 99; CHECK-NEXT: [[TMP0:%.*]] = call i8 @llvm.vscale.i8() 100; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[TMP0]] to i32 101; CHECK-NEXT: ret i32 [[TMP1]] 102; 103 entry: 104 %0 = call i8 @llvm.vscale.i8() 105 %1 = zext i8 %0 to i32 106 ret i32 %1 107} 108 109declare i8 @llvm.vscale.i8() 110