| ; 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 |
| } |