blob: e15ccb10ed97cb5c5467ecca97deb2f8dad59f90 [file]
; 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
}