; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6 ; RUN: opt < %s -p instsimplify -S | FileCheck %s define <2 x i32> @left_undef_offset(<2 x i32> %a, <2 x i32> %b) { ; CHECK-LABEL: define <2 x i32> @left_undef_offset( ; CHECK-SAME: <2 x i32> [[A:%.*]], <2 x i32> [[B:%.*]]) { ; CHECK-NEXT: ret <2 x i32> poison ; %res = call <2 x i32> @llvm.vector.splice.left(<2 x i32> %a, <2 x i32> %b, i32 undef) ret <2 x i32> %res } define <2 x i32> @right_undef_offset(<2 x i32> %a, <2 x i32> %b) { ; CHECK-LABEL: define <2 x i32> @right_undef_offset( ; CHECK-SAME: <2 x i32> [[A:%.*]], <2 x i32> [[B:%.*]]) { ; CHECK-NEXT: ret <2 x i32> poison ; %res = call <2 x i32> @llvm.vector.splice.right(<2 x i32> %a, <2 x i32> %b, i32 undef) ret <2 x i32> %res } define <2 x i32> @left_out_of_bounds(<2 x i32> %a, <2 x i32> %b) { ; CHECK-LABEL: define <2 x i32> @left_out_of_bounds( ; CHECK-SAME: <2 x i32> [[A:%.*]], <2 x i32> [[B:%.*]]) { ; CHECK-NEXT: ret <2 x i32> poison ; %res = call <2 x i32> @llvm.vector.splice.left(<2 x i32> %a, <2 x i32> %b, i32 3) ret <2 x i32> %res } define <2 x i32> @right_out_of_bounds(<2 x i32> %a, <2 x i32> %b) { ; CHECK-LABEL: define <2 x i32> @right_out_of_bounds( ; CHECK-SAME: <2 x i32> [[A:%.*]], <2 x i32> [[B:%.*]]) { ; CHECK-NEXT: ret <2 x i32> poison ; %res = call <2 x i32> @llvm.vector.splice.right(<2 x i32> %a, <2 x i32> %b, i32 3) ret <2 x i32> %res } define @left_out_of_bounds_scalable( %a, %b) vscale_range(1, 1) { ; CHECK-LABEL: define @left_out_of_bounds_scalable( ; CHECK-SAME: [[A:%.*]], [[B:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: ret poison ; %res = call @llvm.vector.splice.left( %a, %b, i32 3) ret %res } define @left_not_out_of_bounds_scalable( %a, %b) { ; CHECK-LABEL: define @left_not_out_of_bounds_scalable( ; CHECK-SAME: [[A:%.*]], [[B:%.*]]) { ; CHECK-NEXT: [[RES:%.*]] = call @llvm.vector.splice.left.nxv2i32( [[A]], [[B]], i32 3) ; CHECK-NEXT: ret [[RES]] ; %res = call @llvm.vector.splice.left( %a, %b, i32 3) ret %res } define @right_out_of_bounds_scalable( %a, %b) vscale_range(1, 1) { ; CHECK-LABEL: define @right_out_of_bounds_scalable( ; CHECK-SAME: [[A:%.*]], [[B:%.*]]) #[[ATTR0]] { ; CHECK-NEXT: ret poison ; %res = call @llvm.vector.splice.right( %a, %b, i32 3) ret %res } define @right_not_out_of_bounds_scalable( %a, %b) { ; CHECK-LABEL: define @right_not_out_of_bounds_scalable( ; CHECK-SAME: [[A:%.*]], [[B:%.*]]) { ; CHECK-NEXT: [[RES:%.*]] = call @llvm.vector.splice.right.nxv2i32( [[A]], [[B]], i32 3) ; CHECK-NEXT: ret [[RES]] ; %res = call @llvm.vector.splice.right( %a, %b, i32 3) ret %res } define <2 x i32> @left_offset_0(<2 x i32> %a, <2 x i32> %b) { ; CHECK-LABEL: define <2 x i32> @left_offset_0( ; CHECK-SAME: <2 x i32> [[A:%.*]], <2 x i32> [[B:%.*]]) { ; CHECK-NEXT: ret <2 x i32> [[A]] ; %res = call <2 x i32> @llvm.vector.splice.left(<2 x i32> %a, <2 x i32> %b, i32 0) ret <2 x i32> %res } define <2 x i32> @right_offset_0(<2 x i32> %a, <2 x i32> %b) { ; CHECK-LABEL: define <2 x i32> @right_offset_0( ; CHECK-SAME: <2 x i32> [[A:%.*]], <2 x i32> [[B:%.*]]) { ; CHECK-NEXT: ret <2 x i32> [[B]] ; %res = call <2 x i32> @llvm.vector.splice.right(<2 x i32> %a, <2 x i32> %b, i32 0) ret <2 x i32> %res }