blob: 14ab6ac2177baffb18f939671898d342cd745d09 [file]
; 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: [[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: [[TMP3:%.*]] = extractelement <2 x i64> [[TMP2]], i64 0
; CHECK-NEXT: [[IV0:%.*]] = insertvalue [[PAIR:%.*]] poison, i64 [[TMP3]], 0
; CHECK-NEXT: [[TMP4:%.*]] = extractelement <2 x i64> [[TMP2]], i64 1
; CHECK-NEXT: [[IV1:%.*]] = insertvalue [[PAIR]] [[IV0]], i64 [[TMP4]], 1
; CHECK-NEXT: ret [[PAIR]] [[IV1]]
;
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: [[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: [[TMP3:%.*]] = extractelement <4 x i32> [[TMP2]], i64 0
; CHECK-NEXT: [[IV0:%.*]] = insertvalue [[QUAD:%.*]] poison, i32 [[TMP3]], 0
; CHECK-NEXT: [[TMP4:%.*]] = extractelement <4 x i32> [[TMP2]], i64 1
; CHECK-NEXT: [[IV1:%.*]] = insertvalue [[QUAD]] [[IV0]], i32 [[TMP4]], 1
; CHECK-NEXT: [[TMP5:%.*]] = extractelement <4 x i32> [[TMP2]], i64 2
; CHECK-NEXT: [[IV2:%.*]] = insertvalue [[QUAD]] [[IV1]], i32 [[TMP5]], 2
; CHECK-NEXT: [[TMP6:%.*]] = extractelement <4 x i32> [[TMP2]], i64 3
; CHECK-NEXT: [[IV3:%.*]] = insertvalue [[QUAD]] [[IV2]], i32 [[TMP6]], 3
; CHECK-NEXT: ret [[QUAD]] [[IV3]]
;
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
}