blob: a70c673aaff051914c2e43fb99601b559467c292 [file]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
; RUN: opt -S --passes=slp-vectorizer -mtriple=riscv64-unknown-linux-gnu -mattr="+v" < %s | FileCheck %s
target triple = "riscv64-unknown-linux-gnu"
define void @test1(ptr %arrayidx.i60, ptr %24, ptr %arrayidx44.i61, double %.pre117.i70, double %.pre116.i68, double %.pre115.i67, double %.pre114.i65, double %.pre113.i64, double %.pre.i62) {
; CHECK-LABEL: define void @test1(
; CHECK-SAME: ptr [[ARRAYIDX_I60:%.*]], ptr [[TMP0:%.*]], ptr [[ARRAYIDX44_I61:%.*]], double [[DOTPRE117_I70:%.*]], double [[DOTPRE116_I68:%.*]], double [[DOTPRE115_I67:%.*]], double [[DOTPRE114_I65:%.*]], double [[DOTPRE113_I64:%.*]], double [[DOTPRE_I62:%.*]]) #[[ATTR0:[0-9]+]] {
; CHECK-NEXT: [[FOR_COND_PREHEADER:.*]]:
; CHECK-NEXT: br label %[[FOR_BODY:.*]]
; CHECK: [[FOR_BODY]]:
; CHECK-NEXT: [[TMP1:%.*]] = phi double [ [[DOTPRE117_I70]], %[[FOR_COND_PREHEADER]] ], [ [[TMP9:%.*]], %[[FOR_BODY]] ]
; CHECK-NEXT: [[TMP2:%.*]] = phi double [ [[DOTPRE116_I68]], %[[FOR_COND_PREHEADER]] ], [ [[TMP1]], %[[FOR_BODY]] ]
; CHECK-NEXT: [[TMP3:%.*]] = phi double [ [[DOTPRE115_I67]], %[[FOR_COND_PREHEADER]] ], [ [[TMP8:%.*]], %[[FOR_BODY]] ]
; CHECK-NEXT: [[TMP4:%.*]] = phi double [ [[DOTPRE114_I65]], %[[FOR_COND_PREHEADER]] ], [ [[DIV_I86:%.*]], %[[FOR_BODY]] ]
; CHECK-NEXT: [[TMP5:%.*]] = phi double [ [[DOTPRE113_I64]], %[[FOR_COND_PREHEADER]] ], [ [[TMP7:%.*]], %[[FOR_BODY]] ]
; CHECK-NEXT: [[TMP6:%.*]] = phi double [ [[DOTPRE_I62]], %[[FOR_COND_PREHEADER]] ], [ [[TMP5]], %[[FOR_BODY]] ]
; CHECK-NEXT: [[INDVARS_IV_I72:%.*]] = phi i64 [ 1, %[[FOR_COND_PREHEADER]] ], [ [[INDVARS_IV_NEXT_I74:%.*]], %[[FOR_BODY]] ]
; CHECK-NEXT: [[ADD_I73:%.*]] = fadd double [[TMP5]], [[TMP6]]
; CHECK-NEXT: [[INDVARS_IV_NEXT_I74]] = add nuw nsw i64 [[INDVARS_IV_I72]], 1
; CHECK-NEXT: [[ARRAYIDX23_I75:%.*]] = getelementptr inbounds nuw [8 x i8], ptr [[ARRAYIDX_I60]], i64 [[INDVARS_IV_NEXT_I74]]
; CHECK-NEXT: [[TMP7]] = load double, ptr [[ARRAYIDX23_I75]], align 8
; CHECK-NEXT: [[ADD24_I76:%.*]] = fadd double [[ADD_I73]], [[TMP7]]
; CHECK-NEXT: [[ADD30_I77:%.*]] = fadd double [[TMP4]], [[ADD24_I76]]
; CHECK-NEXT: [[ARRAYIDX34_I78:%.*]] = getelementptr inbounds nuw [8 x i8], ptr [[TMP0]], i64 [[INDVARS_IV_I72]]
; CHECK-NEXT: [[ADD35_I79:%.*]] = fadd double [[TMP3]], [[ADD30_I77]]
; CHECK-NEXT: [[ARRAYIDX40_I80:%.*]] = getelementptr inbounds nuw [8 x i8], ptr [[TMP0]], i64 [[INDVARS_IV_NEXT_I74]]
; CHECK-NEXT: [[TMP8]] = load double, ptr [[ARRAYIDX40_I80]], align 8
; CHECK-NEXT: [[ADD41_I81:%.*]] = fadd double [[TMP8]], [[ADD35_I79]]
; CHECK-NEXT: [[ADD48_I82:%.*]] = fadd double [[TMP2]], [[ADD41_I81]]
; CHECK-NEXT: [[ADD54_I83:%.*]] = fadd double [[TMP1]], [[ADD48_I82]]
; CHECK-NEXT: [[ARRAYIDX60_I84:%.*]] = getelementptr inbounds nuw [8 x i8], ptr [[ARRAYIDX44_I61]], i64 [[INDVARS_IV_NEXT_I74]]
; CHECK-NEXT: [[TMP9]] = load double, ptr [[ARRAYIDX60_I84]], align 8
; CHECK-NEXT: [[TMP18:%.*]] = fadd double [[TMP9]], [[ADD54_I83]]
; CHECK-NEXT: [[DIV_I86]] = fdiv double [[TMP18]], 9.000000e+00
; CHECK-NEXT: store double [[DIV_I86]], ptr [[ARRAYIDX34_I78]], align 8
; CHECK-NEXT: [[EXITCOND_NOT_I87:%.*]] = icmp eq i64 [[INDVARS_IV_NEXT_I74]], 1999
; CHECK-NEXT: br i1 [[EXITCOND_NOT_I87]], label %[[FOR_END:.*]], label %[[FOR_BODY]]
; CHECK: [[FOR_END]]:
; CHECK-NEXT: ret void
;
for.cond.preheader:
br label %for.body
for.body:
%25 = phi double [ %.pre117.i70, %for.cond.preheader ], [ %33, %for.body ]
%26 = phi double [ %.pre116.i68, %for.cond.preheader ], [ %25, %for.body ]
%27 = phi double [ %.pre115.i67, %for.cond.preheader ], [ %32, %for.body ]
%28 = phi double [ %.pre114.i65, %for.cond.preheader ], [ %div.i86, %for.body ]
%29 = phi double [ %.pre113.i64, %for.cond.preheader ], [ %31, %for.body ]
%30 = phi double [ %.pre.i62, %for.cond.preheader ], [ %29, %for.body ]
%indvars.iv.i72 = phi i64 [ 1, %for.cond.preheader ], [ %indvars.iv.next.i74, %for.body ]
%add.i73 = fadd double %29, %30
%indvars.iv.next.i74 = add nuw nsw i64 %indvars.iv.i72, 1
%arrayidx23.i75 = getelementptr inbounds nuw [8 x i8], ptr %arrayidx.i60, i64 %indvars.iv.next.i74
%31 = load double, ptr %arrayidx23.i75, align 8
%add24.i76 = fadd double %add.i73, %31
%add30.i77 = fadd double %28, %add24.i76
%arrayidx34.i78 = getelementptr inbounds nuw [8 x i8], ptr %24, i64 %indvars.iv.i72
%add35.i79 = fadd double %27, %add30.i77
%arrayidx40.i80 = getelementptr inbounds nuw [8 x i8], ptr %24, i64 %indvars.iv.next.i74
%32 = load double, ptr %arrayidx40.i80, align 8
%add41.i81 = fadd double %32, %add35.i79
%add48.i82 = fadd double %26, %add41.i81
%add54.i83 = fadd double %25, %add48.i82
%arrayidx60.i84 = getelementptr inbounds nuw [8 x i8], ptr %arrayidx44.i61, i64 %indvars.iv.next.i74
%33 = load double, ptr %arrayidx60.i84, align 8
%add61.i85 = fadd double %33, %add54.i83
%div.i86 = fdiv double %add61.i85, 9.000000e+00
store double %div.i86, ptr %arrayidx34.i78, align 8
%exitcond.not.i87 = icmp eq i64 %indvars.iv.next.i74, 1999
br i1 %exitcond.not.i87, label %for.end, label %for.body
for.end:
ret void
}
define void @ordered_rdx_non_pow2_fallback(ptr %p, double %x) {
; CHECK-LABEL: define void @ordered_rdx_non_pow2_fallback(
; CHECK-SAME: ptr [[P:%.*]], double [[X:%.*]]) #[[ATTR0]] {
; CHECK-NEXT: [[ENTRY:.*]]:
; CHECK-NEXT: [[TMP0:%.*]] = insertelement <4 x double> poison, double [[X]], i64 0
; CHECK-NEXT: [[TMP1:%.*]] = shufflevector <4 x double> [[TMP0]], <4 x double> poison, <4 x i32> <i32 poison, i32 poison, i32 0, i32 0>
; CHECK-NEXT: br label %[[LOOP:.*]]
; CHECK: [[LOOP]]:
; CHECK-NEXT: [[ACC:%.*]] = phi double [ 0.000000e+00, %[[ENTRY]] ], [ [[SUM5:%.*]], %[[LOOP]] ]
; CHECK-NEXT: [[TMP2:%.*]] = load <2 x double>, ptr [[P]], align 8
; CHECK-NEXT: [[TMP3:%.*]] = shufflevector <2 x double> [[TMP2]], <2 x double> poison, <4 x i32> <i32 0, i32 1, i32 poison, i32 poison>
; CHECK-NEXT: [[TMP4:%.*]] = shufflevector <4 x double> [[TMP1]], <4 x double> [[TMP3]], <4 x i32> <i32 4, i32 5, i32 2, i32 3>
; CHECK-NEXT: [[TMP5:%.*]] = fadd <4 x double> [[TMP4]], splat (double 1.000000e+00)
; CHECK-NEXT: [[TMP6:%.*]] = call <4 x double> @llvm.fmuladd.v4f64(<4 x double> [[TMP5]], <4 x double> splat (double 2.000000e+00), <4 x double> splat (double 3.000000e+00))
; CHECK-NEXT: [[TMP7:%.*]] = fadd <4 x double> [[TMP6]], splat (double 1.000000e+00)
; CHECK-NEXT: [[TMP8:%.*]] = call <4 x double> @llvm.fmuladd.v4f64(<4 x double> [[TMP7]], <4 x double> splat (double 2.000000e+00), <4 x double> splat (double 3.000000e+00))
; CHECK-NEXT: [[TMP9:%.*]] = fadd <4 x double> [[TMP8]], splat (double 1.000000e+00)
; CHECK-NEXT: [[TMP10:%.*]] = call <4 x double> @llvm.fmuladd.v4f64(<4 x double> [[TMP9]], <4 x double> splat (double 2.000000e+00), <4 x double> splat (double 3.000000e+00))
; CHECK-NEXT: [[R4:%.*]] = call double @llvm.fmuladd.f64(double [[X]], double 2.000000e+00, double 3.000000e+00)
; CHECK-NEXT: [[R5:%.*]] = call double @llvm.fmuladd.f64(double [[X]], double 2.000000e+00, double 3.000000e+00)
; CHECK-NEXT: [[TMP11:%.*]] = extractelement <4 x double> [[TMP10]], i64 0
; CHECK-NEXT: [[SUM0:%.*]] = fadd double [[ACC]], [[TMP11]]
; CHECK-NEXT: [[TMP12:%.*]] = extractelement <4 x double> [[TMP10]], i64 1
; CHECK-NEXT: [[SUM1:%.*]] = fadd double [[SUM0]], [[TMP12]]
; CHECK-NEXT: [[TMP13:%.*]] = extractelement <4 x double> [[TMP10]], i64 2
; CHECK-NEXT: [[SUM2:%.*]] = fadd double [[SUM1]], [[TMP13]]
; CHECK-NEXT: [[TMP14:%.*]] = extractelement <4 x double> [[TMP10]], i64 3
; CHECK-NEXT: [[SUM3:%.*]] = fadd double [[SUM2]], [[TMP14]]
; CHECK-NEXT: [[SUM4:%.*]] = fadd double [[SUM3]], [[R4]]
; CHECK-NEXT: [[SUM5]] = fadd double [[SUM4]], [[R5]]
; CHECK-NEXT: br label %[[LOOP]]
;
entry:
br label %loop
loop:
%acc = phi double [ 0.000000e+00, %entry ], [ %sum5, %loop ]
%l0 = load double, ptr %p, align 8
%a0 = fadd double %l0, 1.000000e+00
%m0 = call double @llvm.fmuladd.f64(double %a0, double 2.000000e+00, double 3.000000e+00)
%b0 = fadd double %m0, 1.000000e+00
%n0 = call double @llvm.fmuladd.f64(double %b0, double 2.000000e+00, double 3.000000e+00)
%c0 = fadd double %n0, 1.000000e+00
%r0 = call double @llvm.fmuladd.f64(double %c0, double 2.000000e+00, double 3.000000e+00)
%gep1 = getelementptr i8, ptr %p, i64 8
%l1 = load double, ptr %gep1, align 8
%a1 = fadd double %l1, 1.000000e+00
%m1 = call double @llvm.fmuladd.f64(double %a1, double 2.000000e+00, double 3.000000e+00)
%b1 = fadd double %m1, 1.000000e+00
%n1 = call double @llvm.fmuladd.f64(double %b1, double 2.000000e+00, double 3.000000e+00)
%c1 = fadd double %n1, 1.000000e+00
%r1 = call double @llvm.fmuladd.f64(double %c1, double 2.000000e+00, double 3.000000e+00)
%a2 = fadd double %x, 1.000000e+00
%m2 = call double @llvm.fmuladd.f64(double %a2, double 2.000000e+00, double 3.000000e+00)
%b2 = fadd double %m2, 1.000000e+00
%n2 = call double @llvm.fmuladd.f64(double %b2, double 2.000000e+00, double 3.000000e+00)
%c2 = fadd double %n2, 1.000000e+00
%r2 = call double @llvm.fmuladd.f64(double %c2, double 2.000000e+00, double 3.000000e+00)
%a3 = fadd double %x, 1.000000e+00
%m3 = call double @llvm.fmuladd.f64(double %a3, double 2.000000e+00, double 3.000000e+00)
%b3 = fadd double %m3, 1.000000e+00
%n3 = call double @llvm.fmuladd.f64(double %b3, double 2.000000e+00, double 3.000000e+00)
%c3 = fadd double %n3, 1.000000e+00
%r3 = call double @llvm.fmuladd.f64(double %c3, double 2.000000e+00, double 3.000000e+00)
%r4 = call double @llvm.fmuladd.f64(double %x, double 2.000000e+00, double 3.000000e+00)
%r5 = call double @llvm.fmuladd.f64(double %x, double 2.000000e+00, double 3.000000e+00)
%sum0 = fadd double %acc, %r0
%sum1 = fadd double %sum0, %r1
%sum2 = fadd double %sum1, %r2
%sum3 = fadd double %sum2, %r3
%sum4 = fadd double %sum3, %r4
%sum5 = fadd double %sum4, %r5
br label %loop
}
declare double @llvm.fmuladd.f64(double, double, double)