blob: 827e5c9ec483895cb3e4511256128c75581b0756 [file] [log] [blame] [edit]
; 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 <vscale x 2 x i32> @left_out_of_bounds_scalable(<vscale x 2 x i32> %a, <vscale x 2 x i32> %b) vscale_range(1, 1) {
; CHECK-LABEL: define <vscale x 2 x i32> @left_out_of_bounds_scalable(
; CHECK-SAME: <vscale x 2 x i32> [[A:%.*]], <vscale x 2 x i32> [[B:%.*]]) #[[ATTR0:[0-9]+]] {
; CHECK-NEXT: ret <vscale x 2 x i32> poison
;
%res = call <vscale x 2 x i32> @llvm.vector.splice.left(<vscale x 2 x i32> %a, <vscale x 2 x i32> %b, i32 3)
ret <vscale x 2 x i32> %res
}
define <vscale x 2 x i32> @left_not_out_of_bounds_scalable(<vscale x 2 x i32> %a, <vscale x 2 x i32> %b) {
; CHECK-LABEL: define <vscale x 2 x i32> @left_not_out_of_bounds_scalable(
; CHECK-SAME: <vscale x 2 x i32> [[A:%.*]], <vscale x 2 x i32> [[B:%.*]]) {
; CHECK-NEXT: [[RES:%.*]] = call <vscale x 2 x i32> @llvm.vector.splice.left.nxv2i32(<vscale x 2 x i32> [[A]], <vscale x 2 x i32> [[B]], i32 3)
; CHECK-NEXT: ret <vscale x 2 x i32> [[RES]]
;
%res = call <vscale x 2 x i32> @llvm.vector.splice.left(<vscale x 2 x i32> %a, <vscale x 2 x i32> %b, i32 3)
ret <vscale x 2 x i32> %res
}
define <vscale x 2 x i32> @right_out_of_bounds_scalable(<vscale x 2 x i32> %a, <vscale x 2 x i32> %b) vscale_range(1, 1) {
; CHECK-LABEL: define <vscale x 2 x i32> @right_out_of_bounds_scalable(
; CHECK-SAME: <vscale x 2 x i32> [[A:%.*]], <vscale x 2 x i32> [[B:%.*]]) #[[ATTR0]] {
; CHECK-NEXT: ret <vscale x 2 x i32> poison
;
%res = call <vscale x 2 x i32> @llvm.vector.splice.right(<vscale x 2 x i32> %a, <vscale x 2 x i32> %b, i32 3)
ret <vscale x 2 x i32> %res
}
define <vscale x 2 x i32> @right_not_out_of_bounds_scalable(<vscale x 2 x i32> %a, <vscale x 2 x i32> %b) {
; CHECK-LABEL: define <vscale x 2 x i32> @right_not_out_of_bounds_scalable(
; CHECK-SAME: <vscale x 2 x i32> [[A:%.*]], <vscale x 2 x i32> [[B:%.*]]) {
; CHECK-NEXT: [[RES:%.*]] = call <vscale x 2 x i32> @llvm.vector.splice.right.nxv2i32(<vscale x 2 x i32> [[A]], <vscale x 2 x i32> [[B]], i32 3)
; CHECK-NEXT: ret <vscale x 2 x i32> [[RES]]
;
%res = call <vscale x 2 x i32> @llvm.vector.splice.right(<vscale x 2 x i32> %a, <vscale x 2 x i32> %b, i32 3)
ret <vscale x 2 x i32> %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
}