llvm-project/llvm/test/Transforms/InstCombine/insert-trunc.ll

561 lines
21 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt < %s -passes=instcombine -S -data-layout="E" | FileCheck %s --check-prefixes=ALL,BE
; RUN: opt < %s -passes=instcombine -S -data-layout="e" | FileCheck %s --check-prefixes=ALL,LE
declare void @use(i8)
declare void @use64(i64)
define <4 x i16> @low_index_same_length_poison_basevec(i64 %x) {
; BE-LABEL: @low_index_same_length_poison_basevec(
; BE-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i16
; BE-NEXT: [[R:%.*]] = insertelement <4 x i16> poison, i16 [[T]], i64 0
; BE-NEXT: ret <4 x i16> [[R]]
;
; LE-LABEL: @low_index_same_length_poison_basevec(
; LE-NEXT: [[VEC_X:%.*]] = bitcast i64 [[X:%.*]] to <4 x i16>
; LE-NEXT: [[R:%.*]] = shufflevector <4 x i16> [[VEC_X]], <4 x i16> poison, <4 x i32> <i32 0, i32 undef, i32 undef, i32 undef>
; LE-NEXT: ret <4 x i16> [[R]]
;
%t = trunc i64 %x to i16
%r = insertelement <4 x i16> poison, i16 %t, i64 0
ret <4 x i16> %r
}
define <4 x i16> @high_index_same_length_poison_basevec(i64 %x) {
; BE-LABEL: @high_index_same_length_poison_basevec(
; BE-NEXT: [[VEC_X:%.*]] = bitcast i64 [[X:%.*]] to <4 x i16>
; BE-NEXT: [[R:%.*]] = shufflevector <4 x i16> [[VEC_X]], <4 x i16> poison, <4 x i32> <i32 undef, i32 undef, i32 undef, i32 3>
; BE-NEXT: ret <4 x i16> [[R]]
;
; LE-LABEL: @high_index_same_length_poison_basevec(
; LE-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i16
; LE-NEXT: [[R:%.*]] = insertelement <4 x i16> poison, i16 [[T]], i64 3
; LE-NEXT: ret <4 x i16> [[R]]
;
%t = trunc i64 %x to i16
%r = insertelement <4 x i16> poison, i16 %t, i64 3
ret <4 x i16> %r
}
define <4 x i16> @wrong_index_same_length_poison_basevec(i64 %x) {
; ALL-LABEL: @wrong_index_same_length_poison_basevec(
; ALL-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i16
; ALL-NEXT: [[R:%.*]] = insertelement <4 x i16> poison, i16 [[T]], i64 1
; ALL-NEXT: ret <4 x i16> [[R]]
;
%t = trunc i64 %x to i16
%r = insertelement <4 x i16> poison, i16 %t, i64 1
ret <4 x i16> %r
}
define <8 x i16> @low_index_longer_length_poison_basevec(i64 %x) {
; BE-LABEL: @low_index_longer_length_poison_basevec(
; BE-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i16
; BE-NEXT: [[R:%.*]] = insertelement <8 x i16> poison, i16 [[T]], i64 0
; BE-NEXT: ret <8 x i16> [[R]]
;
; LE-LABEL: @low_index_longer_length_poison_basevec(
; LE-NEXT: [[VEC_X:%.*]] = bitcast i64 [[X:%.*]] to <4 x i16>
; LE-NEXT: [[R:%.*]] = shufflevector <4 x i16> [[VEC_X]], <4 x i16> poison, <8 x i32> <i32 0, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
; LE-NEXT: ret <8 x i16> [[R]]
;
%t = trunc i64 %x to i16
%r = insertelement <8 x i16> poison, i16 %t, i64 0
ret <8 x i16> %r
}
define <8 x i16> @high_index_longer_length_poison_basevec(i64 %x) {
; BE-LABEL: @high_index_longer_length_poison_basevec(
; BE-NEXT: [[VEC_X:%.*]] = bitcast i64 [[X:%.*]] to <4 x i16>
; BE-NEXT: [[R:%.*]] = shufflevector <4 x i16> [[VEC_X]], <4 x i16> poison, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 3, i32 undef, i32 undef, i32 undef, i32 undef>
; BE-NEXT: ret <8 x i16> [[R]]
;
; LE-LABEL: @high_index_longer_length_poison_basevec(
; LE-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i16
; LE-NEXT: [[R:%.*]] = insertelement <8 x i16> poison, i16 [[T]], i64 3
; LE-NEXT: ret <8 x i16> [[R]]
;
%t = trunc i64 %x to i16
%r = insertelement <8 x i16> poison, i16 %t, i64 3
ret <8 x i16> %r
}
define <8 x i16> @wrong_index_longer_length_poison_basevec(i64 %x) {
; ALL-LABEL: @wrong_index_longer_length_poison_basevec(
; ALL-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i16
; ALL-NEXT: [[R:%.*]] = insertelement <8 x i16> poison, i16 [[T]], i64 7
; ALL-NEXT: ret <8 x i16> [[R]]
;
%t = trunc i64 %x to i16
%r = insertelement <8 x i16> poison, i16 %t, i64 7
ret <8 x i16> %r
}
define <2 x i16> @low_index_shorter_length_poison_basevec(i64 %x) {
; BE-LABEL: @low_index_shorter_length_poison_basevec(
; BE-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i16
; BE-NEXT: [[R:%.*]] = insertelement <2 x i16> poison, i16 [[T]], i64 0
; BE-NEXT: ret <2 x i16> [[R]]
;
; LE-LABEL: @low_index_shorter_length_poison_basevec(
; LE-NEXT: [[VEC_X:%.*]] = bitcast i64 [[X:%.*]] to <4 x i16>
; LE-NEXT: [[R:%.*]] = shufflevector <4 x i16> [[VEC_X]], <4 x i16> poison, <2 x i32> <i32 0, i32 undef>
; LE-NEXT: ret <2 x i16> [[R]]
;
%t = trunc i64 %x to i16
%r = insertelement <2 x i16> poison, i16 %t, i64 0
ret <2 x i16> %r
}
define <4 x i8> @wrong_index_shorter_length_poison_basevec(i64 %x) {
; ALL-LABEL: @wrong_index_shorter_length_poison_basevec(
; ALL-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i8
; ALL-NEXT: [[R:%.*]] = insertelement <4 x i8> poison, i8 [[T]], i64 3
; ALL-NEXT: ret <4 x i8> [[R]]
;
%t = trunc i64 %x to i8
%r = insertelement <4 x i8> poison, i8 %t, i64 3
ret <4 x i8> %r
}
define <4 x i8> @wrong_width_low_index_shorter_length_poison_basevec(i65 %x) {
; ALL-LABEL: @wrong_width_low_index_shorter_length_poison_basevec(
; ALL-NEXT: [[T:%.*]] = trunc i65 [[X:%.*]] to i8
; ALL-NEXT: [[R:%.*]] = insertelement <4 x i8> poison, i8 [[T]], i64 0
; ALL-NEXT: ret <4 x i8> [[R]]
;
%t = trunc i65 %x to i8
%r = insertelement <4 x i8> poison, i8 %t, i64 0
ret <4 x i8> %r
}
define <4 x i8> @low_index_shorter_length_poison_basevec_extra_use(i64 %x) {
; ALL-LABEL: @low_index_shorter_length_poison_basevec_extra_use(
; ALL-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i8
; ALL-NEXT: call void @use(i8 [[T]])
; ALL-NEXT: [[R:%.*]] = insertelement <4 x i8> poison, i8 [[T]], i64 0
; ALL-NEXT: ret <4 x i8> [[R]]
;
%t = trunc i64 %x to i8
call void @use(i8 %t)
%r = insertelement <4 x i8> poison, i8 %t, i64 0
ret <4 x i8> %r
}
define <4 x i16> @lshr_same_length_poison_basevec_le(i64 %x) {
; BE-LABEL: @lshr_same_length_poison_basevec_le(
; BE-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 32
; BE-NEXT: [[T:%.*]] = trunc i64 [[S]] to i16
; BE-NEXT: [[R:%.*]] = insertelement <4 x i16> poison, i16 [[T]], i64 2
; BE-NEXT: ret <4 x i16> [[R]]
;
; LE-LABEL: @lshr_same_length_poison_basevec_le(
; LE-NEXT: [[VEC_X:%.*]] = bitcast i64 [[X:%.*]] to <4 x i16>
; LE-NEXT: [[R:%.*]] = shufflevector <4 x i16> [[VEC_X]], <4 x i16> poison, <4 x i32> <i32 undef, i32 undef, i32 2, i32 undef>
; LE-NEXT: ret <4 x i16> [[R]]
;
%s = lshr i64 %x, 32
%t = trunc i64 %s to i16
%r = insertelement <4 x i16> poison, i16 %t, i64 2
ret <4 x i16> %r
}
define <4 x i16> @lshr_same_length_poison_basevec_be(i64 %x) {
; BE-LABEL: @lshr_same_length_poison_basevec_be(
; BE-NEXT: [[VEC_X:%.*]] = bitcast i64 [[X:%.*]] to <4 x i16>
; BE-NEXT: [[R:%.*]] = shufflevector <4 x i16> [[VEC_X]], <4 x i16> poison, <4 x i32> <i32 undef, i32 1, i32 undef, i32 undef>
; BE-NEXT: ret <4 x i16> [[R]]
;
; LE-LABEL: @lshr_same_length_poison_basevec_be(
; LE-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 32
; LE-NEXT: [[T:%.*]] = trunc i64 [[S]] to i16
; LE-NEXT: [[R:%.*]] = insertelement <4 x i16> poison, i16 [[T]], i64 1
; LE-NEXT: ret <4 x i16> [[R]]
;
%s = lshr i64 %x, 32
%t = trunc i64 %s to i16
%r = insertelement <4 x i16> poison, i16 %t, i64 1
ret <4 x i16> %r
}
define <4 x i16> @lshr_same_length_poison_basevec_both_endian(i64 %x) {
; BE-LABEL: @lshr_same_length_poison_basevec_both_endian(
; BE-NEXT: [[VEC_X:%.*]] = bitcast i64 [[X:%.*]] to <4 x i16>
; BE-NEXT: [[R:%.*]] = shufflevector <4 x i16> [[VEC_X]], <4 x i16> poison, <4 x i32> <i32 0, i32 undef, i32 undef, i32 undef>
; BE-NEXT: ret <4 x i16> [[R]]
;
; LE-LABEL: @lshr_same_length_poison_basevec_both_endian(
; LE-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 48
; LE-NEXT: [[VEC_S:%.*]] = bitcast i64 [[S]] to <4 x i16>
; LE-NEXT: [[R:%.*]] = shufflevector <4 x i16> [[VEC_S]], <4 x i16> poison, <4 x i32> <i32 0, i32 undef, i32 undef, i32 undef>
; LE-NEXT: ret <4 x i16> [[R]]
;
%s = lshr i64 %x, 48
%t = trunc i64 %s to i16
%r = insertelement <4 x i16> poison, i16 %t, i64 0
ret <4 x i16> %r
}
define <4 x i16> @lshr_wrong_index_same_length_poison_basevec(i64 %x) {
; ALL-LABEL: @lshr_wrong_index_same_length_poison_basevec(
; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 48
; ALL-NEXT: [[T:%.*]] = trunc i64 [[S]] to i16
; ALL-NEXT: [[R:%.*]] = insertelement <4 x i16> poison, i16 [[T]], i64 1
; ALL-NEXT: ret <4 x i16> [[R]]
;
%s = lshr i64 %x, 48
%t = trunc i64 %s to i16
%r = insertelement <4 x i16> poison, i16 %t, i64 1
ret <4 x i16> %r
}
define <8 x i16> @lshr_longer_length_poison_basevec_le(i64 %x) {
; BE-LABEL: @lshr_longer_length_poison_basevec_le(
; BE-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 48
; BE-NEXT: [[VEC_S:%.*]] = bitcast i64 [[S]] to <4 x i16>
; BE-NEXT: [[R:%.*]] = shufflevector <4 x i16> [[VEC_S]], <4 x i16> poison, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 3, i32 undef, i32 undef, i32 undef, i32 undef>
; BE-NEXT: ret <8 x i16> [[R]]
;
; LE-LABEL: @lshr_longer_length_poison_basevec_le(
; LE-NEXT: [[VEC_X:%.*]] = bitcast i64 [[X:%.*]] to <4 x i16>
; LE-NEXT: [[R:%.*]] = shufflevector <4 x i16> [[VEC_X]], <4 x i16> poison, <8 x i32> <i32 undef, i32 undef, i32 undef, i32 3, i32 undef, i32 undef, i32 undef, i32 undef>
; LE-NEXT: ret <8 x i16> [[R]]
;
%s = lshr i64 %x, 48
%t = trunc i64 %s to i16
%r = insertelement <8 x i16> poison, i16 %t, i64 3
ret <8 x i16> %r
}
define <8 x i16> @lshr_longer_length_poison_basevec_be(i64 %x) {
; BE-LABEL: @lshr_longer_length_poison_basevec_be(
; BE-NEXT: [[VEC_X:%.*]] = bitcast i64 [[X:%.*]] to <4 x i16>
; BE-NEXT: [[R:%.*]] = shufflevector <4 x i16> [[VEC_X]], <4 x i16> poison, <8 x i32> <i32 undef, i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
; BE-NEXT: ret <8 x i16> [[R]]
;
; LE-LABEL: @lshr_longer_length_poison_basevec_be(
; LE-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 32
; LE-NEXT: [[T:%.*]] = trunc i64 [[S]] to i16
; LE-NEXT: [[R:%.*]] = insertelement <8 x i16> poison, i16 [[T]], i64 1
; LE-NEXT: ret <8 x i16> [[R]]
;
%s = lshr i64 %x, 32
%t = trunc i64 %s to i16
%r = insertelement <8 x i16> poison, i16 %t, i64 1
ret <8 x i16> %r
}
define <8 x i16> @lshr_wrong_index_longer_length_poison_basevec(i64 %x) {
; ALL-LABEL: @lshr_wrong_index_longer_length_poison_basevec(
; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 16
; ALL-NEXT: [[T:%.*]] = trunc i64 [[S]] to i16
; ALL-NEXT: [[R:%.*]] = insertelement <8 x i16> poison, i16 [[T]], i64 6
; ALL-NEXT: ret <8 x i16> [[R]]
;
%s = lshr i64 %x, 16
%t = trunc i64 %s to i16
%r = insertelement <8 x i16> poison, i16 %t, i64 6
ret <8 x i16> %r
}
define <2 x i16> @lshr_shorter_length_poison_basevec_le(i64 %x) {
; BE-LABEL: @lshr_shorter_length_poison_basevec_le(
; BE-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 16
; BE-NEXT: [[T:%.*]] = trunc i64 [[S]] to i16
; BE-NEXT: [[R:%.*]] = insertelement <2 x i16> poison, i16 [[T]], i64 1
; BE-NEXT: ret <2 x i16> [[R]]
;
; LE-LABEL: @lshr_shorter_length_poison_basevec_le(
; LE-NEXT: [[VEC_X:%.*]] = bitcast i64 [[X:%.*]] to <4 x i16>
; LE-NEXT: [[R:%.*]] = shufflevector <4 x i16> [[VEC_X]], <4 x i16> poison, <2 x i32> <i32 undef, i32 1>
; LE-NEXT: ret <2 x i16> [[R]]
;
%s = lshr i64 %x, 16
%t = trunc i64 %s to i16
%r = insertelement <2 x i16> poison, i16 %t, i64 1
ret <2 x i16> %r
}
define <4 x i8> @lshr_shorter_length_poison_basevec_be(i64 %x) {
; BE-LABEL: @lshr_shorter_length_poison_basevec_be(
; BE-NEXT: [[VEC_X:%.*]] = bitcast i64 [[X:%.*]] to <8 x i8>
; BE-NEXT: [[R:%.*]] = shufflevector <8 x i8> [[VEC_X]], <8 x i8> poison, <4 x i32> <i32 undef, i32 undef, i32 2, i32 undef>
; BE-NEXT: ret <4 x i8> [[R]]
;
; LE-LABEL: @lshr_shorter_length_poison_basevec_be(
; LE-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 40
; LE-NEXT: [[T:%.*]] = trunc i64 [[S]] to i8
; LE-NEXT: [[R:%.*]] = insertelement <4 x i8> poison, i8 [[T]], i64 2
; LE-NEXT: ret <4 x i8> [[R]]
;
%s = lshr i64 %x, 40
%t = trunc i64 %s to i8
%r = insertelement <4 x i8> poison, i8 %t, i64 2
ret <4 x i8> %r
}
define <4 x i8> @lshr_wrong_index_shorter_length_poison_basevec(i64 %x) {
; ALL-LABEL: @lshr_wrong_index_shorter_length_poison_basevec(
; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 40
; ALL-NEXT: [[T:%.*]] = trunc i64 [[S]] to i8
; ALL-NEXT: [[R:%.*]] = insertelement <4 x i8> poison, i8 [[T]], i64 3
; ALL-NEXT: ret <4 x i8> [[R]]
;
%s = lshr i64 %x, 40
%t = trunc i64 %s to i8
%r = insertelement <4 x i8> poison, i8 %t, i64 3
ret <4 x i8> %r
}
define <4 x i8> @lshr_wrong_shift_shorter_length_poison_basevec(i64 %x) {
; BE-LABEL: @lshr_wrong_shift_shorter_length_poison_basevec(
; BE-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 57
; BE-NEXT: [[T:%.*]] = trunc i64 [[S]] to i8
; BE-NEXT: [[R:%.*]] = insertelement <4 x i8> poison, i8 [[T]], i64 0
; BE-NEXT: ret <4 x i8> [[R]]
;
; LE-LABEL: @lshr_wrong_shift_shorter_length_poison_basevec(
; LE-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 57
; LE-NEXT: [[VEC_S:%.*]] = bitcast i64 [[S]] to <8 x i8>
; LE-NEXT: [[R:%.*]] = shufflevector <8 x i8> [[VEC_S]], <8 x i8> poison, <4 x i32> <i32 0, i32 undef, i32 undef, i32 undef>
; LE-NEXT: ret <4 x i8> [[R]]
;
%s = lshr i64 %x, 57
%t = trunc i64 %s to i8
%r = insertelement <4 x i8> poison, i8 %t, i64 0
ret <4 x i8> %r
}
define <4 x i8> @lshr_shorter_length_poison_basevec_be_extra_use(i64 %x) {
; ALL-LABEL: @lshr_shorter_length_poison_basevec_be_extra_use(
; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 40
; ALL-NEXT: call void @use64(i64 [[S]])
; ALL-NEXT: [[T:%.*]] = trunc i64 [[S]] to i8
; ALL-NEXT: [[R:%.*]] = insertelement <4 x i8> poison, i8 [[T]], i64 2
; ALL-NEXT: ret <4 x i8> [[R]]
;
%s = lshr i64 %x, 40
call void @use64(i64 %s)
%t = trunc i64 %s to i8
%r = insertelement <4 x i8> poison, i8 %t, i64 2
ret <4 x i8> %r
}
define <4 x i16> @low_index_same_length_basevec(i64 %x, <4 x i16> %v) {
; ALL-LABEL: @low_index_same_length_basevec(
; ALL-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i16
; ALL-NEXT: [[R:%.*]] = insertelement <4 x i16> [[V:%.*]], i16 [[T]], i64 0
; ALL-NEXT: ret <4 x i16> [[R]]
;
%t = trunc i64 %x to i16
%r = insertelement <4 x i16> %v, i16 %t, i64 0
ret <4 x i16> %r
}
define <4 x i16> @high_index_same_length_basevec(i64 %x, <4 x i16> %v) {
; ALL-LABEL: @high_index_same_length_basevec(
; ALL-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i16
; ALL-NEXT: [[R:%.*]] = insertelement <4 x i16> [[V:%.*]], i16 [[T]], i64 3
; ALL-NEXT: ret <4 x i16> [[R]]
;
%t = trunc i64 %x to i16
%r = insertelement <4 x i16> %v, i16 %t, i64 3
ret <4 x i16> %r
}
define <4 x i16> @wrong_index_same_length_basevec(i64 %x, <4 x i16> %v) {
; ALL-LABEL: @wrong_index_same_length_basevec(
; ALL-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i16
; ALL-NEXT: [[R:%.*]] = insertelement <4 x i16> [[V:%.*]], i16 [[T]], i64 1
; ALL-NEXT: ret <4 x i16> [[R]]
;
%t = trunc i64 %x to i16
%r = insertelement <4 x i16> %v, i16 %t, i64 1
ret <4 x i16> %r
}
define <8 x i16> @low_index_longer_length_basevec(i64 %x, <8 x i16> %v) {
; ALL-LABEL: @low_index_longer_length_basevec(
; ALL-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i16
; ALL-NEXT: [[R:%.*]] = insertelement <8 x i16> [[V:%.*]], i16 [[T]], i64 0
; ALL-NEXT: ret <8 x i16> [[R]]
;
%t = trunc i64 %x to i16
%r = insertelement <8 x i16> %v, i16 %t, i64 0
ret <8 x i16> %r
}
define <8 x i16> @high_index_longer_length_basevec(i64 %x, <8 x i16> %v) {
; ALL-LABEL: @high_index_longer_length_basevec(
; ALL-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i16
; ALL-NEXT: [[R:%.*]] = insertelement <8 x i16> [[V:%.*]], i16 [[T]], i64 3
; ALL-NEXT: ret <8 x i16> [[R]]
;
%t = trunc i64 %x to i16
%r = insertelement <8 x i16> %v, i16 %t, i64 3
ret <8 x i16> %r
}
define <8 x i16> @wrong_index_longer_length_basevec(i64 %x, <8 x i16> %v) {
; ALL-LABEL: @wrong_index_longer_length_basevec(
; ALL-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i16
; ALL-NEXT: [[R:%.*]] = insertelement <8 x i16> [[V:%.*]], i16 [[T]], i64 7
; ALL-NEXT: ret <8 x i16> [[R]]
;
%t = trunc i64 %x to i16
%r = insertelement <8 x i16> %v, i16 %t, i64 7
ret <8 x i16> %r
}
define <2 x i16> @low_index_shorter_length_basevec(i64 %x, <2 x i16> %v) {
; ALL-LABEL: @low_index_shorter_length_basevec(
; ALL-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i16
; ALL-NEXT: [[R:%.*]] = insertelement <2 x i16> [[V:%.*]], i16 [[T]], i64 0
; ALL-NEXT: ret <2 x i16> [[R]]
;
%t = trunc i64 %x to i16
%r = insertelement <2 x i16> %v, i16 %t, i64 0
ret <2 x i16> %r
}
define <4 x i8> @wrong_index_shorter_length_basevec(i64 %x, <4 x i8> %v) {
; ALL-LABEL: @wrong_index_shorter_length_basevec(
; ALL-NEXT: [[T:%.*]] = trunc i64 [[X:%.*]] to i8
; ALL-NEXT: [[R:%.*]] = insertelement <4 x i8> [[V:%.*]], i8 [[T]], i64 3
; ALL-NEXT: ret <4 x i8> [[R]]
;
%t = trunc i64 %x to i8
%r = insertelement <4 x i8> %v, i8 %t, i64 3
ret <4 x i8> %r
}
define <4 x i16> @lshr_same_length_basevec_le(i64 %x, <4 x i16> %v) {
; ALL-LABEL: @lshr_same_length_basevec_le(
; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 32
; ALL-NEXT: [[T:%.*]] = trunc i64 [[S]] to i16
; ALL-NEXT: [[R:%.*]] = insertelement <4 x i16> [[V:%.*]], i16 [[T]], i64 2
; ALL-NEXT: ret <4 x i16> [[R]]
;
%s = lshr i64 %x, 32
%t = trunc i64 %s to i16
%r = insertelement <4 x i16> %v, i16 %t, i64 2
ret <4 x i16> %r
}
define <4 x i16> @lshr_same_length_basevec_be(i64 %x, <4 x i16> %v) {
; ALL-LABEL: @lshr_same_length_basevec_be(
; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 32
; ALL-NEXT: [[T:%.*]] = trunc i64 [[S]] to i16
; ALL-NEXT: [[R:%.*]] = insertelement <4 x i16> [[V:%.*]], i16 [[T]], i64 1
; ALL-NEXT: ret <4 x i16> [[R]]
;
%s = lshr i64 %x, 32
%t = trunc i64 %s to i16
%r = insertelement <4 x i16> %v, i16 %t, i64 1
ret <4 x i16> %r
}
define <4 x i16> @lshr_same_length_basevec_both_endian(i64 %x, <4 x i16> %v) {
; ALL-LABEL: @lshr_same_length_basevec_both_endian(
; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 48
; ALL-NEXT: [[T:%.*]] = trunc i64 [[S]] to i16
; ALL-NEXT: [[R:%.*]] = insertelement <4 x i16> [[V:%.*]], i16 [[T]], i64 3
; ALL-NEXT: ret <4 x i16> [[R]]
;
%s = lshr i64 %x, 48
%t = trunc i64 %s to i16
%r = insertelement <4 x i16> %v, i16 %t, i64 3
ret <4 x i16> %r
}
define <4 x i16> @lshr_wrong_index_same_length_basevec(i64 %x, <4 x i16> %v) {
; ALL-LABEL: @lshr_wrong_index_same_length_basevec(
; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 48
; ALL-NEXT: [[T:%.*]] = trunc i64 [[S]] to i16
; ALL-NEXT: [[R:%.*]] = insertelement <4 x i16> [[V:%.*]], i16 [[T]], i64 1
; ALL-NEXT: ret <4 x i16> [[R]]
;
%s = lshr i64 %x, 48
%t = trunc i64 %s to i16
%r = insertelement <4 x i16> %v, i16 %t, i64 1
ret <4 x i16> %r
}
define <8 x i16> @lshr_longer_length_basevec_le(i64 %x, <8 x i16> %v) {
; ALL-LABEL: @lshr_longer_length_basevec_le(
; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 48
; ALL-NEXT: [[T:%.*]] = trunc i64 [[S]] to i16
; ALL-NEXT: [[R:%.*]] = insertelement <8 x i16> [[V:%.*]], i16 [[T]], i64 3
; ALL-NEXT: ret <8 x i16> [[R]]
;
%s = lshr i64 %x, 48
%t = trunc i64 %s to i16
%r = insertelement <8 x i16> %v, i16 %t, i64 3
ret <8 x i16> %r
}
define <8 x i16> @lshr_longer_length_basevec_be(i64 %x, <8 x i16> %v) {
; ALL-LABEL: @lshr_longer_length_basevec_be(
; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 32
; ALL-NEXT: [[T:%.*]] = trunc i64 [[S]] to i16
; ALL-NEXT: [[R:%.*]] = insertelement <8 x i16> [[V:%.*]], i16 [[T]], i64 1
; ALL-NEXT: ret <8 x i16> [[R]]
;
%s = lshr i64 %x, 32
%t = trunc i64 %s to i16
%r = insertelement <8 x i16> %v, i16 %t, i64 1
ret <8 x i16> %r
}
define <8 x i16> @lshr_wrong_index_longer_length_basevec(i64 %x, <8 x i16> %v) {
; ALL-LABEL: @lshr_wrong_index_longer_length_basevec(
; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 16
; ALL-NEXT: [[T:%.*]] = trunc i64 [[S]] to i16
; ALL-NEXT: [[R:%.*]] = insertelement <8 x i16> [[V:%.*]], i16 [[T]], i64 6
; ALL-NEXT: ret <8 x i16> [[R]]
;
%s = lshr i64 %x, 16
%t = trunc i64 %s to i16
%r = insertelement <8 x i16> %v, i16 %t, i64 6
ret <8 x i16> %r
}
define <2 x i16> @lshr_shorter_length_basevec_le(i64 %x, <2 x i16> %v) {
; ALL-LABEL: @lshr_shorter_length_basevec_le(
; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 16
; ALL-NEXT: [[T:%.*]] = trunc i64 [[S]] to i16
; ALL-NEXT: [[R:%.*]] = insertelement <2 x i16> [[V:%.*]], i16 [[T]], i64 1
; ALL-NEXT: ret <2 x i16> [[R]]
;
%s = lshr i64 %x, 16
%t = trunc i64 %s to i16
%r = insertelement <2 x i16> %v, i16 %t, i64 1
ret <2 x i16> %r
}
define <4 x i8> @lshr_shorter_length_basevec_be(i64 %x, <4 x i8> %v) {
; ALL-LABEL: @lshr_shorter_length_basevec_be(
; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 48
; ALL-NEXT: [[T:%.*]] = trunc i64 [[S]] to i8
; ALL-NEXT: [[R:%.*]] = insertelement <4 x i8> [[V:%.*]], i8 [[T]], i64 1
; ALL-NEXT: ret <4 x i8> [[R]]
;
%s = lshr i64 %x, 48
%t = trunc i64 %s to i8
%r = insertelement <4 x i8> %v, i8 %t, i64 1
ret <4 x i8> %r
}
define <4 x i8> @lshr_wrong_index_shorter_length_basevec(i64 %x, <4 x i8> %v) {
; ALL-LABEL: @lshr_wrong_index_shorter_length_basevec(
; ALL-NEXT: [[S:%.*]] = lshr i64 [[X:%.*]], 40
; ALL-NEXT: [[T:%.*]] = trunc i64 [[S]] to i8
; ALL-NEXT: [[R:%.*]] = insertelement <4 x i8> [[V:%.*]], i8 [[T]], i64 3
; ALL-NEXT: ret <4 x i8> [[R]]
;
%s = lshr i64 %x, 40
%t = trunc i64 %s to i8
%r = insertelement <4 x i8> %v, i8 %t, i64 3
ret <4 x i8> %r
}