; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 ; RUN: opt -p instcombine -mtriple=riscv32 -mattr=+v -S %s | FileCheck %s --check-prefixes=CHECK,RV32 ; RUN: opt -p instcombine -mtriple=riscv64 -mattr=+v -S %s | FileCheck %s --check-prefixes=CHECK,RV64 ; RUN: opt -p instcombine -mtriple=riscv32 -mattr=+zve32x -S %s | FileCheck %s --check-prefixes=CHECK,ZVE32X ; RUN: opt -p instcombine -mtriple=riscv64 -mattr=+zve32x -S %s | FileCheck %s --check-prefixes=CHECK,ZVE32X define @target_vl_one() { ; CHECK-LABEL: define @target_vl_one( ; CHECK-SAME: ) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: [[TMP1:%.*]] = call @llvm.riscv.vmv.v.x.nxv2i32.i64( poison, i32 1431655765, i64 1) ; CHECK-NEXT: ret [[TMP1]] ; %a = call @llvm.riscv.vmv.v.x.nxv8i8( poison, i8 85, i64 4) %b = bitcast %a to ret %b } define @target_vl_two() { ; CHECK-LABEL: define @target_vl_two( ; CHECK-SAME: ) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call @llvm.riscv.vmv.v.x.nxv4i16.i64( poison, i16 21845, i64 2) ; CHECK-NEXT: ret [[TMP1]] ; %a = call @llvm.riscv.vmv.v.x.nxv8i8( poison, i8 85, i64 4) %b = bitcast %a to ret %b } define @target_vl_32() { ; CHECK-LABEL: define @target_vl_32( ; CHECK-SAME: ) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call @llvm.riscv.vmv.v.x.nxv2i32.i64( poison, i32 1431655765, i64 32) ; CHECK-NEXT: ret [[TMP1]] ; %a = call @llvm.riscv.vmv.v.x.nxv8i8( poison, i8 85, i64 128) %b = bitcast %a to ret %b } define @small_scalar() { ; CHECK-LABEL: define @small_scalar( ; CHECK-SAME: ) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call @llvm.riscv.vmv.v.x.nxv2i32.i64( poison, i32 50529027, i64 1) ; CHECK-NEXT: ret [[TMP1]] ; %a = call @llvm.riscv.vmv.v.x.nxv8i8( poison, i8 3, i64 4) %b = bitcast %a to ret %b } define @negative_scalar() { ; CHECK-LABEL: define @negative_scalar( ; CHECK-SAME: ) #[[ATTR0]] { ; CHECK-NEXT: [[TMP1:%.*]] = call @llvm.riscv.vmv.v.x.nxv2i32.i64( poison, i32 -50529028, i64 1) ; CHECK-NEXT: ret [[TMP1]] ; %a = call @llvm.riscv.vmv.v.x.nxv8i8( poison, i8 -4, i64 4) %b = bitcast %a to ret %b } define @no_bitcast() { ; CHECK-LABEL: define @no_bitcast( ; CHECK-SAME: ) #[[ATTR0]] { ; CHECK-NEXT: [[A:%.*]] = call @llvm.riscv.vmv.v.x.nxv8i8.i64( poison, i8 85, i64 4) ; CHECK-NEXT: ret [[A]] ; %a = call @llvm.riscv.vmv.v.x.nxv8i8( poison, i8 85, i64 4) ret %a } declare void @use.nxv2i32() declare void @use.nxv1i64() define void @bitcast_users_type_mismatch() { ; CHECK-LABEL: define void @bitcast_users_type_mismatch( ; CHECK-SAME: ) #[[ATTR0]] { ; CHECK-NEXT: [[VMV:%.*]] = call @llvm.riscv.vmv.v.x.nxv8i8.i64( poison, i8 85, i64 4) ; CHECK-NEXT: [[CAST_1:%.*]] = bitcast [[VMV]] to ; CHECK-NEXT: [[CAST_2:%.*]] = bitcast [[VMV]] to ; CHECK-NEXT: call void @use.nxv2i32( [[CAST_1]]) ; CHECK-NEXT: call void @use.nxv1i64( [[CAST_2]]) ; CHECK-NEXT: ret void ; %vmv = call @llvm.riscv.vmv.v.x.nxv8i8( poison, i8 85, i64 4) %cast.1 = bitcast %vmv to %cast.2 = bitcast %vmv to call void @use.nxv2i32( %cast.1) call void @use.nxv1i64( %cast.2) ret void } define @bitcast_target_elt_type_too_large() { ; CHECK-LABEL: define @bitcast_target_elt_type_too_large( ; CHECK-SAME: ) #[[ATTR0]] { ; CHECK-NEXT: [[A:%.*]] = call @llvm.riscv.vmv.v.x.nxv8i8.i64( poison, i8 85, i64 4) ; CHECK-NEXT: [[B:%.*]] = bitcast [[A]] to ; CHECK-NEXT: ret [[B]] ; %a = call @llvm.riscv.vmv.v.x.nxv8i8( poison, i8 85, i64 4) %b = bitcast %a to ret %b } define @bitcast_target_elt_type_too_small() { ; CHECK-LABEL: define @bitcast_target_elt_type_too_small( ; CHECK-SAME: ) #[[ATTR0]] { ; CHECK-NEXT: [[A:%.*]] = call @llvm.riscv.vmv.v.x.nxv8i8.i64( poison, i8 85, i64 4) ; CHECK-NEXT: [[B:%.*]] = bitcast [[A]] to ; CHECK-NEXT: ret [[B]] ; %a = call @llvm.riscv.vmv.v.x.nxv8i8( poison, i8 85, i64 4) %b = bitcast %a to ret %b } define @passthru_non_poison( %x) { ; CHECK-LABEL: define @passthru_non_poison( ; CHECK-SAME: [[X:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[A:%.*]] = call @llvm.riscv.vmv.v.x.nxv8i8.i64( [[X]], i8 85, i64 4) ; CHECK-NEXT: [[B:%.*]] = bitcast [[A]] to ; CHECK-NEXT: ret [[B]] ; %a = call @llvm.riscv.vmv.v.x.nxv8i8( %x, i8 85, i64 4) %b = bitcast %a to ret %b } define @scalar_non_constant(i8 %scalar) { ; CHECK-LABEL: define @scalar_non_constant( ; CHECK-SAME: i8 [[SCALAR:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[A:%.*]] = call @llvm.riscv.vmv.v.x.nxv8i8.i64( poison, i8 [[SCALAR]], i64 4) ; CHECK-NEXT: [[B:%.*]] = bitcast [[A]] to ; CHECK-NEXT: ret [[B]] ; %a = call @llvm.riscv.vmv.v.x.nxv8i8( poison, i8 %scalar, i64 4) %b = bitcast %a to ret %b } define @vl_non_constant(i64 %vl) { ; CHECK-LABEL: define @vl_non_constant( ; CHECK-SAME: i64 [[VL:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: [[A:%.*]] = call @llvm.riscv.vmv.v.x.nxv8i8.i64( poison, i8 85, i64 [[VL]]) ; CHECK-NEXT: [[B:%.*]] = bitcast [[A]] to ; CHECK-NEXT: ret [[B]] ; %a = call @llvm.riscv.vmv.v.x.nxv8i8( poison, i8 85, i64 %vl) %b = bitcast %a to ret %b } define @vl_not_divisible() { ; CHECK-LABEL: define @vl_not_divisible( ; CHECK-SAME: ) #[[ATTR0]] { ; CHECK-NEXT: [[A:%.*]] = call @llvm.riscv.vmv.v.x.nxv4i8.i64( poison, i8 85, i64 7) ; CHECK-NEXT: [[B:%.*]] = bitcast [[A]] to ; CHECK-NEXT: ret [[B]] ; %a = call @llvm.riscv.vmv.v.x.nxv8i8( poison, i8 85, i64 7) %b = bitcast %a to ret %b } define @vector_elt_type_legality() { ; RV32-LABEL: define @vector_elt_type_legality( ; RV32-SAME: ) #[[ATTR0]] { ; RV32-NEXT: [[A:%.*]] = call @llvm.riscv.vmv.v.x.nxv8i8.i64( poison, i8 85, i64 8) ; RV32-NEXT: [[B:%.*]] = bitcast [[A]] to ; RV32-NEXT: ret [[B]] ; ; RV64-LABEL: define @vector_elt_type_legality( ; RV64-SAME: ) #[[ATTR0]] { ; RV64-NEXT: [[TMP1:%.*]] = call @llvm.riscv.vmv.v.x.nxv1i64.i64( poison, i64 6148914691236517205, i64 1) ; RV64-NEXT: ret [[TMP1]] ; ; ZVE32X-LABEL: define @vector_elt_type_legality( ; ZVE32X-SAME: ) #[[ATTR0]] { ; ZVE32X-NEXT: [[A:%.*]] = call @llvm.riscv.vmv.v.x.nxv8i8.i64( poison, i8 85, i64 8) ; ZVE32X-NEXT: [[B:%.*]] = bitcast [[A]] to ; ZVE32X-NEXT: ret [[B]] ; %a = call @llvm.riscv.vmv.v.x.nxv8i8( poison, i8 85, i64 8) %b = bitcast %a to ret %b } define @eq_num_elts() { ; CHECK-LABEL: define @eq_num_elts( ; CHECK-SAME: ) #[[ATTR0]] { ; CHECK-NEXT: [[A:%.*]] = call @llvm.riscv.vmv.v.x.nxv4i32.i64( poison, i32 -1615569626, i64 2) ; CHECK-NEXT: [[B:%.*]] = bitcast [[A]] to ; CHECK-NEXT: ret [[B]] ; %a = call @llvm.riscv.vmv.v.x.nxv4i32.i64( poison, i32 -1615569626, i64 2) %b = bitcast %a to ret %b }