| ; 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 @simple_copy(ptr %dest, ptr %p, ptr %dest2, ptr %dest3) { |
| ;, float %l0, float %l1, float %l2, float %l3, float %l4, float %l5, float %l6, float %l7) { |
| ; DEFAULT-LABEL: define void @simple_copy( |
| ; DEFAULT-SAME: ptr [[DEST:%.*]], ptr [[P:%.*]], ptr [[DEST2:%.*]], ptr [[DEST3:%.*]]) #[[ATTR0:[0-9]+]] { |
| ; DEFAULT-NEXT: [[ENTRY:.*:]] |
| ; DEFAULT-NEXT: [[TMP0:%.*]] = load <8 x float>, ptr [[P]], align 4 |
| ; DEFAULT-NEXT: [[L0:%.*]] = load float, ptr [[P]], align 4 |
| ; DEFAULT-NEXT: store <8 x float> [[TMP0]], ptr [[DEST]], align 4 |
| ; DEFAULT-NEXT: [[D1:%.*]] = getelementptr inbounds float, ptr [[DEST2]], i64 1 |
| ; DEFAULT-NEXT: [[D3:%.*]] = getelementptr inbounds float, ptr [[DEST2]], i64 3 |
| ; 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: store float [[L0]], ptr [[DEST2]], align 4 |
| ; DEFAULT-NEXT: [[TMP1:%.*]] = shufflevector <8 x float> [[TMP0]], <8 x float> poison, <2 x i32> <i32 1, i32 2> |
| ; DEFAULT-NEXT: store <2 x float> [[TMP1]], ptr [[D1]], align 2 |
| ; DEFAULT-NEXT: [[TMP2:%.*]] = extractelement <8 x float> [[TMP0]], i64 3 |
| ; DEFAULT-NEXT: store float [[TMP2]], ptr [[D3]], align 2 |
| ; DEFAULT-NEXT: [[TMP3:%.*]] = extractelement <8 x float> [[TMP0]], i64 7 |
| ; DEFAULT-NEXT: store float [[TMP3]], ptr [[D7]], align 2 |
| ; DEFAULT-NEXT: ret void |
| ; |
| entry: |
| %inc1 = getelementptr inbounds float, ptr %p, i64 1 |
| %inc2 = getelementptr inbounds float, ptr %p, i64 2 |
| %inc3 = getelementptr inbounds float, ptr %p, i64 3 |
| %inc4 = getelementptr inbounds float, ptr %p, i64 4 |
| %inc5 = getelementptr inbounds float, ptr %p, i64 5 |
| %inc6 = getelementptr inbounds float, ptr %p, i64 6 |
| %inc7 = getelementptr inbounds float, ptr %p, i64 7 |
| %l0 = load float, ptr %p, 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 |
| |
| ; %e0 = fadd float %l0, %l0 |
| ; %e1 = fadd float %l1, %l1 |
| ; %e2 = fadd float %l2, %l2 |
| ; %e3 = fadd float %l3, %l3 |
| ; %e4 = fadd float %l4, %l4 |
| ; %e5 = fadd float %l5, %l5 |
| ; %e6 = fadd float %l6, %l6 |
| ; %e7 = fadd float %l7, %l7 |
| |
| ; %red0 = fadd float %e0, %e1 |
| ; %red1 = fadd float %red0, %e2 |
| ; %red2 = fadd float %red1, %e3 |
| ; %red3 = fadd float %red2, %e4 |
| ; %red4 = fadd float %red3, %e5 |
| ; %red5 = fadd float %red4, %e6 |
| ; %red6 = fadd float %red5, %e7 |
| %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 |
| |
| ; %r0 = fadd float %e0, %e1 |
| ; %r1 = fadd float %r0, %e2 |
| ; %r2 = fadd float %r1, %e3 |
| ; %r3 = fadd float %r2, %e4 |
| ; %r4 = fadd float %r3, %e5 |
| ; %r5 = fadd float %r4, %e6 |
| ; %r6 = fadd float %r5, %e7 |
| ; store float %r2, ptr %dest2, align 4 |
| |
| ; store float %e7, ptr %dest3, align 4 |
| ret void |
| } |