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