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