| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
| ; RUN: opt < %s -passes=slp-vectorizer -mtriple=riscv64 -mattr=+m,+v,+zvl128b -slp-threshold=-100 -S | FileCheck %s --check-prefixes=DEFAULT |
| |
| define void @test_fmuladd(ptr %dest, ptr %p) { |
| ; DEFAULT-LABEL: @test_fmuladd( |
| ; DEFAULT-NEXT: e: |
| ; DEFAULT-NEXT: [[TMP0:%.*]] = load <8 x i16>, ptr [[P:%.*]], align 4 |
| ; DEFAULT-NEXT: [[TMP1:%.*]] = uitofp <8 x i16> [[TMP0]] to <8 x double> |
| ; DEFAULT-NEXT: [[TMP2:%.*]] = call <8 x double> @llvm.fmuladd.v8f64(<8 x double> [[TMP1]], <8 x double> [[TMP1]], <8 x double> [[TMP1]]) |
| ; DEFAULT-NEXT: br label [[R:%.*]] |
| ; DEFAULT: r: |
| ; DEFAULT-NEXT: [[TMP3:%.*]] = phi <8 x double> [ [[TMP2]], [[E:%.*]] ] |
| ; DEFAULT-NEXT: ret void |
| ; |
| e: |
| %incl1 = getelementptr inbounds i16, ptr %p, i64 1 |
| %incl2 = getelementptr inbounds i16, ptr %p, i64 2 |
| %incl3 = getelementptr inbounds i16, ptr %p, i64 3 |
| %incl4 = getelementptr inbounds i16, ptr %p, i64 4 |
| %incl5 = getelementptr inbounds i16, ptr %p, i64 5 |
| %incl6 = getelementptr inbounds i16, ptr %p, i64 6 |
| %incl7 = getelementptr inbounds i16, ptr %p, i64 7 |
| %e0 = load i16, ptr %p, align 4 |
| %e1 = load i16, ptr %incl1, align 2 |
| %e2 = load i16, ptr %incl2, align 2 |
| %e3 = load i16, ptr %incl3, align 2 |
| %e4 = load i16, ptr %incl4, align 2 |
| %e5 = load i16, ptr %incl5, align 2 |
| %e6 = load i16, ptr %incl6, align 2 |
| %e7 = load i16, ptr %incl7, align 2 |
| |
| %u0 = uitofp i16 %e0 to double |
| %u1 = uitofp i16 %e1 to double |
| %u2 = uitofp i16 %e2 to double |
| %u3 = uitofp i16 %e3 to double |
| %u4 = uitofp i16 %e4 to double |
| %u5 = uitofp i16 %e5 to double |
| %u6 = uitofp i16 %e6 to double |
| %u7 = uitofp i16 %e7 to double |
| |
| %a0 = call double @llvm.fmuladd.f64(double %u0, double %u0, double %u0) |
| %a1 = call double @llvm.fmuladd.f64(double %u1, double %u1, double %u1) |
| %a2 = call double @llvm.fmuladd.f64(double %u2, double %u2, double %u2) |
| %a3 = call double @llvm.fmuladd.f64(double %u3, double %u3, double %u3) |
| %a4 = call double @llvm.fmuladd.f64(double %u4, double %u4, double %u4) |
| %a5 = call double @llvm.fmuladd.f64(double %u5, double %u5, double %u5) |
| %a6 = call double @llvm.fmuladd.f64(double %u6, double %u6, double %u6) |
| %a7 = call double @llvm.fmuladd.f64(double %u7, double %u7, double %u7) |
| br label %r |
| r: |
| %d0 = phi double [ %a0, %e ] |
| %d1 = phi double [ %a1, %e ] |
| %d2 = phi double [ %a2, %e ] |
| %d3 = phi double [ %a3, %e ] |
| %d4 = phi double [ %a4, %e ] |
| %d5 = phi double [ %a5, %e ] |
| %d6 = phi double [ %a6, %e ] |
| %d7 = phi double [ %a7, %e ] |
| ret void |
| } |
| |
| declare double @llvm.fabs.f64(double) |
| |
| define void @test_fabs(ptr %dest, ptr %p) { |
| ; DEFAULT-LABEL: @test_fabs( |
| ; DEFAULT-NEXT: e: |
| ; DEFAULT-NEXT: [[TMP0:%.*]] = load <8 x i16>, ptr [[P:%.*]], align 4 |
| ; DEFAULT-NEXT: [[TMP1:%.*]] = uitofp <8 x i16> [[TMP0]] to <8 x double> |
| ; DEFAULT-NEXT: [[TMP2:%.*]] = call <8 x double> @llvm.fabs.v8f64(<8 x double> [[TMP1]]) |
| ; DEFAULT-NEXT: br label [[R:%.*]] |
| ; DEFAULT: r: |
| ; DEFAULT-NEXT: [[TMP3:%.*]] = phi <8 x double> [ [[TMP2]], [[E:%.*]] ] |
| ; DEFAULT-NEXT: ret void |
| ; |
| e: |
| %p1 = getelementptr inbounds i16, ptr %p, i64 1 |
| %p2 = getelementptr inbounds i16, ptr %p, i64 2 |
| %p3 = getelementptr inbounds i16, ptr %p, i64 3 |
| %p4 = getelementptr inbounds i16, ptr %p, i64 4 |
| %p5 = getelementptr inbounds i16, ptr %p, i64 5 |
| %p6 = getelementptr inbounds i16, ptr %p, i64 6 |
| %p7 = getelementptr inbounds i16, ptr %p, i64 7 |
| |
| %e0 = load i16, ptr %p, align 4 |
| %e1 = load i16, ptr %p1, align 2 |
| %e2 = load i16, ptr %p2, align 2 |
| %e3 = load i16, ptr %p3, align 2 |
| %e4 = load i16, ptr %p4, align 2 |
| %e5 = load i16, ptr %p5, align 2 |
| %e6 = load i16, ptr %p6, align 2 |
| %e7 = load i16, ptr %p7, align 2 |
| |
| %u0 = uitofp i16 %e0 to double |
| %u1 = uitofp i16 %e1 to double |
| %u2 = uitofp i16 %e2 to double |
| %u3 = uitofp i16 %e3 to double |
| %u4 = uitofp i16 %e4 to double |
| %u5 = uitofp i16 %e5 to double |
| %u6 = uitofp i16 %e6 to double |
| %u7 = uitofp i16 %e7 to double |
| |
| %a0 = call double @llvm.fabs.f64(double %u0) |
| %a1 = call double @llvm.fabs.f64(double %u1) |
| %a2 = call double @llvm.fabs.f64(double %u2) |
| %a3 = call double @llvm.fabs.f64(double %u3) |
| %a4 = call double @llvm.fabs.f64(double %u4) |
| %a5 = call double @llvm.fabs.f64(double %u5) |
| %a6 = call double @llvm.fabs.f64(double %u6) |
| %a7 = call double @llvm.fabs.f64(double %u7) |
| br label %r |
| r: |
| %d0 = phi double [ %a0, %e ] |
| %d1 = phi double [ %a1, %e ] |
| %d2 = phi double [ %a2, %e ] |
| %d3 = phi double [ %a3, %e ] |
| %d4 = phi double [ %a4, %e ] |
| %d5 = phi double [ %a5, %e ] |
| %d6 = phi double [ %a6, %e ] |
| %d7 = phi double [ %a7, %e ] |
| ret void |
| } |
| |
| declare i32 @llvm.abs.i32(i32, i1 immarg) |
| |
| define void @test_abs(ptr %dest, ptr %p) { |
| ; DEFAULT-LABEL: @test_abs( |
| ; DEFAULT-NEXT: e: |
| ; DEFAULT-NEXT: [[TMP0:%.*]] = load <8 x i16>, ptr [[P:%.*]], align 4 |
| ; DEFAULT-NEXT: [[TMP1:%.*]] = zext <8 x i16> [[TMP0]] to <8 x i64> |
| ; DEFAULT-NEXT: [[TMP2:%.*]] = call <8 x i64> @llvm.abs.v8i64(<8 x i64> [[TMP1]], i1 false) |
| ; DEFAULT-NEXT: br label [[R:%.*]] |
| ; DEFAULT: r: |
| ; DEFAULT-NEXT: [[TMP3:%.*]] = phi <8 x i64> [ [[TMP2]], [[E:%.*]] ] |
| ; DEFAULT-NEXT: ret void |
| ; |
| e: |
| %p1 = getelementptr inbounds i16, ptr %p, i64 1 |
| %p2 = getelementptr inbounds i16, ptr %p, i64 2 |
| %p3 = getelementptr inbounds i16, ptr %p, i64 3 |
| %p4 = getelementptr inbounds i16, ptr %p, i64 4 |
| %p5 = getelementptr inbounds i16, ptr %p, i64 5 |
| %p6 = getelementptr inbounds i16, ptr %p, i64 6 |
| %p7 = getelementptr inbounds i16, ptr %p, i64 7 |
| |
| %e0 = load i16, ptr %p, align 4 |
| %e1 = load i16, ptr %p1, align 2 |
| %e2 = load i16, ptr %p2, align 2 |
| %e3 = load i16, ptr %p3, align 2 |
| %e4 = load i16, ptr %p4, align 2 |
| %e5 = load i16, ptr %p5, align 2 |
| %e6 = load i16, ptr %p6, align 2 |
| %e7 = load i16, ptr %p7, align 2 |
| |
| %z0 = zext i16 %e0 to i64 |
| %z1 = zext i16 %e1 to i64 |
| %z2 = zext i16 %e2 to i64 |
| %z3 = zext i16 %e3 to i64 |
| %z4 = zext i16 %e4 to i64 |
| %z5 = zext i16 %e5 to i64 |
| %z6 = zext i16 %e6 to i64 |
| %z7 = zext i16 %e7 to i64 |
| |
| %a0 = call i64 @llvm.abs.i64(i64 %z0, i1 false) |
| %a1 = call i64 @llvm.abs.i64(i64 %z1, i1 false) |
| %a2 = call i64 @llvm.abs.i64(i64 %z2, i1 false) |
| %a3 = call i64 @llvm.abs.i64(i64 %z3, i1 false) |
| %a4 = call i64 @llvm.abs.i64(i64 %z4, i1 false) |
| %a5 = call i64 @llvm.abs.i64(i64 %z5, i1 false) |
| %a6 = call i64 @llvm.abs.i64(i64 %z6, i1 false) |
| %a7 = call i64 @llvm.abs.i64(i64 %z7, i1 false) |
| br label %r |
| r: |
| %d0 = phi i64 [ %a0, %e ] |
| %d1 = phi i64 [ %a1, %e ] |
| %d2 = phi i64 [ %a2, %e ] |
| %d3 = phi i64 [ %a3, %e ] |
| %d4 = phi i64 [ %a4, %e ] |
| %d5 = phi i64 [ %a5, %e ] |
| %d6 = phi i64 [ %a6, %e ] |
| %d7 = phi i64 [ %a7, %e ] |
| ret void |
| } |
| |
| declare double @llvm.fma.f64(double, double, double) |
| |
| define void @test_fma(ptr %dest, ptr %p) { |
| ; DEFAULT-LABEL: @test_fma( |
| ; DEFAULT-NEXT: e: |
| ; DEFAULT-NEXT: [[TMP0:%.*]] = load <8 x i16>, ptr [[P:%.*]], align 4 |
| ; DEFAULT-NEXT: [[TMP1:%.*]] = uitofp <8 x i16> [[TMP0]] to <8 x double> |
| ; DEFAULT-NEXT: [[TMP2:%.*]] = call <8 x double> @llvm.fma.v8f64(<8 x double> [[TMP1]], <8 x double> [[TMP1]], <8 x double> [[TMP1]]) |
| ; DEFAULT-NEXT: br label [[R:%.*]] |
| ; DEFAULT: r: |
| ; DEFAULT-NEXT: [[TMP3:%.*]] = phi <8 x double> [ [[TMP2]], [[E:%.*]] ] |
| ; DEFAULT-NEXT: ret void |
| ; |
| e: |
| %p1 = getelementptr inbounds i16, ptr %p, i64 1 |
| %p2 = getelementptr inbounds i16, ptr %p, i64 2 |
| %p3 = getelementptr inbounds i16, ptr %p, i64 3 |
| %p4 = getelementptr inbounds i16, ptr %p, i64 4 |
| %p5 = getelementptr inbounds i16, ptr %p, i64 5 |
| %p6 = getelementptr inbounds i16, ptr %p, i64 6 |
| %p7 = getelementptr inbounds i16, ptr %p, i64 7 |
| |
| %e0 = load i16, ptr %p, align 4 |
| %e1 = load i16, ptr %p1, align 2 |
| %e2 = load i16, ptr %p2, align 2 |
| %e3 = load i16, ptr %p3, align 2 |
| %e4 = load i16, ptr %p4, align 2 |
| %e5 = load i16, ptr %p5, align 2 |
| %e6 = load i16, ptr %p6, align 2 |
| %e7 = load i16, ptr %p7, align 2 |
| |
| %u0 = uitofp i16 %e0 to double |
| %u1 = uitofp i16 %e1 to double |
| %u2 = uitofp i16 %e2 to double |
| %u3 = uitofp i16 %e3 to double |
| %u4 = uitofp i16 %e4 to double |
| %u5 = uitofp i16 %e5 to double |
| %u6 = uitofp i16 %e6 to double |
| %u7 = uitofp i16 %e7 to double |
| |
| %a0 = call double @llvm.fma.f64(double %u0, double %u0, double %u0) |
| %a1 = call double @llvm.fma.f64(double %u1, double %u1, double %u1) |
| %a2 = call double @llvm.fma.f64(double %u2, double %u2, double %u2) |
| %a3 = call double @llvm.fma.f64(double %u3, double %u3, double %u3) |
| %a4 = call double @llvm.fma.f64(double %u4, double %u4, double %u4) |
| %a5 = call double @llvm.fma.f64(double %u5, double %u5, double %u5) |
| %a6 = call double @llvm.fma.f64(double %u6, double %u6, double %u6) |
| %a7 = call double @llvm.fma.f64(double %u7, double %u7, double %u7) |
| br label %r |
| r: |
| %d0 = phi double [ %a0, %e ] |
| %d1 = phi double [ %a1, %e ] |
| %d2 = phi double [ %a2, %e ] |
| %d3 = phi double [ %a3, %e ] |
| %d4 = phi double [ %a4, %e ] |
| %d5 = phi double [ %a5, %e ] |
| %d6 = phi double [ %a6, %e ] |
| %d7 = phi double [ %a7, %e ] |
| ret void |
| } |