| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
| ; RUN: opt < %s -instcombine -S | FileCheck %s |
| |
| ; |
| ; Sign-extend |
| ; |
| |
| define i32 @vscale_SExt_i8toi32() vscale_range(0, 127) { |
| ; CHECK-LABEL: @vscale_SExt_i8toi32( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.vscale.i32() |
| ; CHECK-NEXT: ret i32 [[TMP0]] |
| ; |
| entry: |
| %0 = call i8 @llvm.vscale.i8() |
| %1 = sext i8 %0 to i32 |
| ret i32 %1 |
| } |
| |
| define i32 @vscale_SExt_i8toi32_poison() vscale_range(0, 128) { |
| ; CHECK-LABEL: @vscale_SExt_i8toi32_poison( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: [[TMP0:%.*]] = call i8 @llvm.vscale.i8() |
| ; CHECK-NEXT: [[TMP1:%.*]] = sext i8 [[TMP0]] to i32 |
| ; CHECK-NEXT: ret i32 [[TMP1]] |
| ; |
| entry: |
| %0 = call i8 @llvm.vscale.i8() |
| %1 = sext i8 %0 to i32 |
| ret i32 %1 |
| } |
| |
| ; |
| ; Zero-extend |
| ; |
| |
| define i32 @vscale_ZExt_i8toi32() vscale_range(0, 128) { |
| ; CHECK-LABEL: @vscale_ZExt_i8toi32( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.vscale.i32() |
| ; CHECK-NEXT: ret i32 [[TMP0]] |
| ; |
| entry: |
| %0 = call i8 @llvm.vscale.i8() |
| %1 = zext i8 %0 to i32 |
| ret i32 %1 |
| } |
| |
| define i32 @vscale_ZExt_i8toi32_poison() vscale_range(0, 256) { |
| ; CHECK-LABEL: @vscale_ZExt_i8toi32_poison( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: [[TMP0:%.*]] = call i8 @llvm.vscale.i8() |
| ; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[TMP0]] to i32 |
| ; CHECK-NEXT: ret i32 [[TMP1]] |
| ; |
| entry: |
| %0 = call i8 @llvm.vscale.i8() |
| %1 = zext i8 %0 to i32 |
| ret i32 %1 |
| } |
| |
| ; |
| ; No vscale_range attribute |
| ; |
| |
| define i32 @vscale_ZExt_i8toi32_unknown() { |
| ; CHECK-LABEL: @vscale_ZExt_i8toi32_unknown( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: [[TMP0:%.*]] = call i8 @llvm.vscale.i8() |
| ; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[TMP0]] to i32 |
| ; CHECK-NEXT: ret i32 [[TMP1]] |
| ; |
| entry: |
| %0 = call i8 @llvm.vscale.i8() |
| %1 = zext i8 %0 to i32 |
| ret i32 %1 |
| } |
| |
| ; |
| ; unbounded vscale_range maximum (0) |
| ; |
| |
| define i32 @vscale_SExt_i8toi32_unbounded() vscale_range(0, 0) { |
| ; CHECK-LABEL: @vscale_SExt_i8toi32_unbounded( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: [[TMP0:%.*]] = call i8 @llvm.vscale.i8() |
| ; CHECK-NEXT: [[TMP1:%.*]] = sext i8 [[TMP0]] to i32 |
| ; CHECK-NEXT: ret i32 [[TMP1]] |
| ; |
| entry: |
| %0 = call i8 @llvm.vscale.i8() |
| %1 = sext i8 %0 to i32 |
| ret i32 %1 |
| } |
| |
| define i32 @vscale_ZExt_i8toi32_unbounded() vscale_range(0, 0) { |
| ; CHECK-LABEL: @vscale_ZExt_i8toi32_unbounded( |
| ; CHECK-NEXT: entry: |
| ; CHECK-NEXT: [[TMP0:%.*]] = call i8 @llvm.vscale.i8() |
| ; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[TMP0]] to i32 |
| ; CHECK-NEXT: ret i32 [[TMP1]] |
| ; |
| entry: |
| %0 = call i8 @llvm.vscale.i8() |
| %1 = zext i8 %0 to i32 |
| ret i32 %1 |
| } |
| |
| declare i8 @llvm.vscale.i8() |