blob: 1863de244204dde95ab8d8aa53ec9524bc7eec86 [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=+v -S | FileCheck %s --check-prefixes=DEFAULT
define void @external(ptr %dest, ptr %dest2, ptr %src) {
; DEFAULT-LABEL: define void @external(
; DEFAULT-SAME: ptr [[DEST:%.*]], ptr [[DEST2:%.*]], ptr [[SRC:%.*]]) #[[ATTR0:[0-9]+]] {
; DEFAULT-NEXT: [[ENTRY:.*:]]
; DEFAULT-NEXT: [[INC7:%.*]] = getelementptr inbounds float, ptr [[SRC]], i64 7
; DEFAULT-NEXT: [[TMP3:%.*]] = load float, ptr [[INC7]], align 2
; DEFAULT-NEXT: [[TMP0:%.*]] = load <8 x float>, ptr [[SRC]], align 4
; DEFAULT-NEXT: [[D4:%.*]] = getelementptr inbounds float, ptr [[DEST2]], i64 4
; DEFAULT-NEXT: [[D5:%.*]] = getelementptr inbounds float, ptr [[DEST2]], i64 5
; DEFAULT-NEXT: [[D6:%.*]] = getelementptr inbounds float, ptr [[DEST2]], i64 6
; DEFAULT-NEXT: [[D7:%.*]] = getelementptr inbounds float, ptr [[DEST2]], i64 7
; DEFAULT-NEXT: [[TMP1:%.*]] = load <4 x float>, ptr [[SRC]], align 4
; DEFAULT-NEXT: store <8 x float> [[TMP0]], ptr [[DEST]], align 4
; DEFAULT-NEXT: store <4 x float> [[TMP1]], ptr [[DEST2]], align 4
; DEFAULT-NEXT: store float [[TMP3]], ptr [[D7]], align 2
; DEFAULT-NEXT: ret void
;
entry:
%inc1 = getelementptr inbounds float, ptr %src, i64 1
%inc2 = getelementptr inbounds float, ptr %src, i64 2
%inc3 = getelementptr inbounds float, ptr %src, i64 3
%inc4 = getelementptr inbounds float, ptr %src, i64 4
%inc5 = getelementptr inbounds float, ptr %src, i64 5
%inc6 = getelementptr inbounds float, ptr %src, i64 6
%inc7 = getelementptr inbounds float, ptr %src, i64 7
%l0 = load float, ptr %src, align 4
%l1 = load float, ptr %inc1, align 2
%l2 = load float, ptr %inc2, align 2
%l3 = load float, ptr %inc3, align 2
%l4 = load float, ptr %inc4, align 2
%l5 = load float, ptr %inc5, align 2
%l6 = load float, ptr %inc6, align 2
%l7 = load float, ptr %inc7, align 2
%i1 = getelementptr inbounds float, ptr %dest, i64 1
%i2 = getelementptr inbounds float, ptr %dest, i64 2
%i3 = getelementptr inbounds float, ptr %dest, i64 3
%i4 = getelementptr inbounds float, ptr %dest, i64 4
%i5 = getelementptr inbounds float, ptr %dest, i64 5
%i6 = getelementptr inbounds float, ptr %dest, i64 6
%i7 = getelementptr inbounds float, ptr %dest, i64 7
store float %l0, ptr %dest, align 4
store float %l1, ptr %i1, align 2
store float %l2, ptr %i2, align 2
store float %l3, ptr %i3, align 2
store float %l4, ptr %i4, align 2
store float %l5, ptr %i5, align 2
store float %l6, ptr %i6, align 2
store float %l7, ptr %i7, align 2
%d1 = getelementptr inbounds float, ptr %dest2, i64 1
%d2 = getelementptr inbounds float, ptr %dest2, i64 2
%d3 = getelementptr inbounds float, ptr %dest2, i64 3
%d4 = getelementptr inbounds float, ptr %dest2, i64 4
%d5 = getelementptr inbounds float, ptr %dest2, i64 5
%d6 = getelementptr inbounds float, ptr %dest2, i64 6
%d7 = getelementptr inbounds float, ptr %dest2, i64 7
store float %l0, ptr %dest2, align 4
store float %l1, ptr %d1, align 2
store float %l2, ptr %d2, align 2
store float %l3, ptr %d3, align 2
; store float %l4, ptr %d4, align 2
; store float %l5, ptr %d5, align 2
; store float %l6, ptr %d6, align 2
store float %l7, ptr %d7, align 2
ret void
}
define void @external_schedule(ptr %dest, ptr %dest2, ptr %dest3, ptr %src, ptr %src1) {
; DEFAULT-LABEL: define void @external_schedule(
; DEFAULT-SAME: ptr [[DEST:%.*]], ptr [[DEST2:%.*]], ptr [[DEST3:%.*]], ptr [[SRC:%.*]], ptr [[SRC1:%.*]]) #[[ATTR0]] {
; DEFAULT-NEXT: [[ENTRY:.*:]]
; DEFAULT-NEXT: [[INC7:%.*]] = getelementptr inbounds float, ptr [[SRC]], i64 7
; DEFAULT-NEXT: [[D4:%.*]] = getelementptr inbounds float, ptr [[DEST2]], i64 4
; DEFAULT-NEXT: [[D5:%.*]] = getelementptr inbounds float, ptr [[DEST2]], i64 5
; DEFAULT-NEXT: [[D6:%.*]] = getelementptr inbounds float, ptr [[DEST2]], i64 6
; DEFAULT-NEXT: [[D7:%.*]] = getelementptr inbounds float, ptr [[DEST2]], i64 7
; DEFAULT-NEXT: [[TMP0:%.*]] = load <4 x float>, ptr [[SRC1]], align 4
; DEFAULT-NEXT: store i8 0, ptr [[DEST3]], align 4
; DEFAULT-NEXT: [[TMP7:%.*]] = load float, ptr [[INC7]], align 2
; DEFAULT-NEXT: [[TMP1:%.*]] = load <8 x float>, ptr [[SRC]], align 4
; DEFAULT-NEXT: [[TMP5:%.*]] = load <4 x float>, ptr [[SRC]], align 4
; DEFAULT-NEXT: store <8 x float> [[TMP1]], ptr [[DEST]], align 4
; DEFAULT-NEXT: [[TMP6:%.*]] = fadd <4 x float> [[TMP5]], [[TMP0]]
; DEFAULT-NEXT: store <4 x float> [[TMP6]], ptr [[DEST2]], align 4
; DEFAULT-NEXT: store float [[TMP7]], ptr [[D7]], align 2
; DEFAULT-NEXT: ret void
;
entry:
%inc11 = getelementptr inbounds float, ptr %src1, i64 1
%inc12 = getelementptr inbounds float, ptr %src1, i64 2
%inc13 = getelementptr inbounds float, ptr %src1, i64 3
%l10 = load float, ptr %src1, align 4
%l11 = load float, ptr %inc11, align 2
%l12 = load float, ptr %inc12, align 2
%l13 = load float, ptr %inc13, align 2
store i8 0, ptr %dest3, align 4
%inc1 = getelementptr inbounds float, ptr %src, i64 1
%inc2 = getelementptr inbounds float, ptr %src, i64 2
%inc3 = getelementptr inbounds float, ptr %src, i64 3
%inc4 = getelementptr inbounds float, ptr %src, i64 4
%inc5 = getelementptr inbounds float, ptr %src, i64 5
%inc6 = getelementptr inbounds float, ptr %src, i64 6
%inc7 = getelementptr inbounds float, ptr %src, i64 7
%l0 = load float, ptr %src, align 4
%l1 = load float, ptr %inc1, align 2
%l2 = load float, ptr %inc2, align 2
%l3 = load float, ptr %inc3, align 2
%l4 = load float, ptr %inc4, align 2
%l5 = load float, ptr %inc5, align 2
%l6 = load float, ptr %inc6, align 2
%l7 = load float, ptr %inc7, align 2
%i1 = getelementptr inbounds float, ptr %dest, i64 1
%i2 = getelementptr inbounds float, ptr %dest, i64 2
%i3 = getelementptr inbounds float, ptr %dest, i64 3
%i4 = getelementptr inbounds float, ptr %dest, i64 4
%i5 = getelementptr inbounds float, ptr %dest, i64 5
%i6 = getelementptr inbounds float, ptr %dest, i64 6
%i7 = getelementptr inbounds float, ptr %dest, i64 7
store float %l0, ptr %dest, align 4
store float %l1, ptr %i1, align 2
store float %l2, ptr %i2, align 2
store float %l3, ptr %i3, align 2
store float %l4, ptr %i4, align 2
store float %l5, ptr %i5, align 2
store float %l6, ptr %i6, align 2
store float %l7, ptr %i7, align 2
%la0 = fadd float %l0, %l10
%la1 = fadd float %l1, %l11
%la2 = fadd float %l2, %l12
%la3 = fadd float %l3, %l13
%d1 = getelementptr inbounds float, ptr %dest2, i64 1
%d2 = getelementptr inbounds float, ptr %dest2, i64 2
%d3 = getelementptr inbounds float, ptr %dest2, i64 3
%d4 = getelementptr inbounds float, ptr %dest2, i64 4
%d5 = getelementptr inbounds float, ptr %dest2, i64 5
%d6 = getelementptr inbounds float, ptr %dest2, i64 6
%d7 = getelementptr inbounds float, ptr %dest2, i64 7
store float %la0, ptr %dest2, align 4
store float %la1, ptr %d1, align 2
store float %la2, ptr %d2, align 2
store float %la3, ptr %d3, align 2
; store float %l4, ptr %d4, align 2
; store float %l5, ptr %d5, align 2
; store float %l6, ptr %d6, align 2
store float %l7, ptr %d7, align 2
ret void
}