blob: af1d4f0bb8c1073114a146ff5e93cb1a03eb3cae [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
; RUN: opt -S -passes=slp-vectorizer -mtriple=riscv64 -mattr=+m,+v,+zvl128b \
; RUN: -riscv-v-register-bit-width-lmul=1 -slp-threshold=-100 < %s | FileCheck %s
%pair = type { i64, i64 }
%quad = type { i32, i32, i32, i32 }
define %pair @insertvalue_elt_size_i64x2(ptr %a, ptr %b) {
; CHECK-LABEL: define %pair @insertvalue_elt_size_i64x2(
; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]]) #[[ATTR0:[0-9]+]] {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: [[VEC2STRUCT_SLOT:%.*]] = alloca [[PAIR:%.*]], align 16
; CHECK-NEXT: [[TMP0:%.*]] = load <2 x i64>, ptr [[A]], align 8
; CHECK-NEXT: [[TMP1:%.*]] = load <2 x i64>, ptr [[B]], align 8
; CHECK-NEXT: [[TMP2:%.*]] = add <2 x i64> [[TMP0]], [[TMP1]]
; CHECK-NEXT: store <2 x i64> [[TMP2]], ptr [[VEC2STRUCT_SLOT]], align 16
; CHECK-NEXT: [[VEC2STRUCT:%.*]] = load [[PAIR]], ptr [[VEC2STRUCT_SLOT]], align 16
; CHECK-NEXT: ret [[PAIR]] [[VEC2STRUCT]]
;
entry:
%a0 = load i64, ptr %a, align 8
%a.gep1 = getelementptr inbounds i64, ptr %a, i64 1
%a1 = load i64, ptr %a.gep1, align 8
%b0 = load i64, ptr %b, align 8
%b.gep1 = getelementptr inbounds i64, ptr %b, i64 1
%b1 = load i64, ptr %b.gep1, align 8
%s0 = add i64 %a0, %b0
%s1 = add i64 %a1, %b1
%iv0 = insertvalue %pair poison, i64 %s0, 0
%iv1 = insertvalue %pair %iv0, i64 %s1, 1
ret %pair %iv1
}
define %quad @insertvalue_elt_size_i32x4(ptr %a, ptr %b) {
; CHECK-LABEL: define %quad @insertvalue_elt_size_i32x4(
; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]]) #[[ATTR0]] {
; CHECK-NEXT: [[ENTRY:.*:]]
; CHECK-NEXT: [[VEC2STRUCT_SLOT:%.*]] = alloca [[QUAD:%.*]], align 16
; CHECK-NEXT: [[TMP0:%.*]] = load <4 x i32>, ptr [[A]], align 4
; CHECK-NEXT: [[TMP1:%.*]] = load <4 x i32>, ptr [[B]], align 4
; CHECK-NEXT: [[TMP2:%.*]] = add <4 x i32> [[TMP0]], [[TMP1]]
; CHECK-NEXT: store <4 x i32> [[TMP2]], ptr [[VEC2STRUCT_SLOT]], align 16
; CHECK-NEXT: [[VEC2STRUCT:%.*]] = load [[QUAD]], ptr [[VEC2STRUCT_SLOT]], align 16
; CHECK-NEXT: ret [[QUAD]] [[VEC2STRUCT]]
;
entry:
%a0 = load i32, ptr %a, align 4
%a.gep1 = getelementptr inbounds i32, ptr %a, i64 1
%a1 = load i32, ptr %a.gep1, align 4
%a.gep2 = getelementptr inbounds i32, ptr %a, i64 2
%a2 = load i32, ptr %a.gep2, align 4
%a.gep3 = getelementptr inbounds i32, ptr %a, i64 3
%a3 = load i32, ptr %a.gep3, align 4
%b0 = load i32, ptr %b, align 4
%b.gep1 = getelementptr inbounds i32, ptr %b, i64 1
%b1 = load i32, ptr %b.gep1, align 4
%b.gep2 = getelementptr inbounds i32, ptr %b, i64 2
%b2 = load i32, ptr %b.gep2, align 4
%b.gep3 = getelementptr inbounds i32, ptr %b, i64 3
%b3 = load i32, ptr %b.gep3, align 4
%s0 = add i32 %a0, %b0
%s1 = add i32 %a1, %b1
%s2 = add i32 %a2, %b2
%s3 = add i32 %a3, %b3
%iv0 = insertvalue %quad poison, i32 %s0, 0
%iv1 = insertvalue %quad %iv0, i32 %s1, 1
%iv2 = insertvalue %quad %iv1, i32 %s2, 2
%iv3 = insertvalue %quad %iv2, i32 %s3, 3
ret %quad %iv3
}