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