blob: 891d8e54e86d69d2de72c777b2cc3a840edeef7d [file] [edit]
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
; Reproducer from https://github.com/llvm/llvm-project/issues/178671
; RUN: opt -S --passes=complex-deinterleaving %s --mattr=+sve2 | FileCheck %s
target triple = "aarch64-unknown-linux-gnu"
define double @test(<vscale x 2 x i1> %0, i1 %1, <vscale x 2 x i1> %2) {
; CHECK-LABEL: define double @test(
; CHECK-SAME: <vscale x 2 x i1> [[TMP0:%.*]], i1 [[TMP1:%.*]], <vscale x 2 x i1> [[TMP2:%.*]]) #[[ATTR0:[0-9]+]] {
; CHECK-NEXT: [[_PREHEADER159:.*:]]
; CHECK-NEXT: [[TMP3:%.*]] = call <vscale x 4 x double> @llvm.vector.interleave2.nxv4f64(<vscale x 2 x double> zeroinitializer, <vscale x 2 x double> zeroinitializer)
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
; CHECK: [[VECTOR_BODY]]:
; CHECK-NEXT: [[ACTIVE_LANE_MASK:%.*]] = phi <vscale x 2 x i1> [ zeroinitializer, [[DOTPREHEADER159:%.*]] ], [ [[TMP0]], %[[VECTOR_BODY]] ]
; CHECK-NEXT: [[TMP4:%.*]] = phi <vscale x 4 x double> [ [[TMP3]], [[DOTPREHEADER159]] ], [ [[TMP26:%.*]], %[[VECTOR_BODY]] ]
; CHECK-NEXT: [[TMP5:%.*]] = call <vscale x 2 x double> @llvm.vector.extract.nxv2f64.nxv4f64(<vscale x 4 x double> zeroinitializer, i64 0)
; CHECK-NEXT: [[TMP6:%.*]] = call <vscale x 2 x double> @llvm.vector.extract.nxv2f64.nxv4f64(<vscale x 4 x double> zeroinitializer, i64 0)
; CHECK-NEXT: [[TMP7:%.*]] = call <vscale x 2 x double> @llvm.vector.extract.nxv2f64.nxv4f64(<vscale x 4 x double> zeroinitializer, i64 2)
; CHECK-NEXT: [[TMP8:%.*]] = call <vscale x 2 x double> @llvm.vector.extract.nxv2f64.nxv4f64(<vscale x 4 x double> zeroinitializer, i64 2)
; CHECK-NEXT: [[TMP9:%.*]] = call <vscale x 2 x double> @llvm.vector.extract.nxv2f64.nxv4f64(<vscale x 4 x double> [[TMP4]], i64 0)
; CHECK-NEXT: [[TMP10:%.*]] = call <vscale x 2 x double> @llvm.vector.extract.nxv2f64.nxv4f64(<vscale x 4 x double> [[TMP4]], i64 2)
; CHECK-NEXT: [[TMP11:%.*]] = call <vscale x 2 x double> @llvm.aarch64.sve.fcmla.nxv2f64(<vscale x 2 x i1> splat (i1 true), <vscale x 2 x double> [[TMP9]], <vscale x 2 x double> [[TMP5]], <vscale x 2 x double> [[TMP6]], i32 0)
; CHECK-NEXT: [[TMP12:%.*]] = call <vscale x 2 x double> @llvm.aarch64.sve.fcmla.nxv2f64(<vscale x 2 x i1> splat (i1 true), <vscale x 2 x double> [[TMP10]], <vscale x 2 x double> [[TMP7]], <vscale x 2 x double> [[TMP8]], i32 0)
; CHECK-NEXT: [[TMP13:%.*]] = call <vscale x 4 x double> @llvm.vector.insert.nxv4f64.nxv2f64(<vscale x 4 x double> poison, <vscale x 2 x double> [[TMP11]], i64 0)
; CHECK-NEXT: [[TMP14:%.*]] = call <vscale x 4 x double> @llvm.vector.insert.nxv4f64.nxv2f64(<vscale x 4 x double> [[TMP13]], <vscale x 2 x double> [[TMP12]], i64 2)
; CHECK-NEXT: [[TMP15:%.*]] = call <vscale x 2 x double> @llvm.vector.extract.nxv2f64.nxv4f64(<vscale x 4 x double> zeroinitializer, i64 0)
; CHECK-NEXT: [[TMP16:%.*]] = call <vscale x 2 x double> @llvm.vector.extract.nxv2f64.nxv4f64(<vscale x 4 x double> zeroinitializer, i64 0)
; CHECK-NEXT: [[TMP17:%.*]] = call <vscale x 2 x double> @llvm.vector.extract.nxv2f64.nxv4f64(<vscale x 4 x double> zeroinitializer, i64 2)
; CHECK-NEXT: [[TMP18:%.*]] = call <vscale x 2 x double> @llvm.vector.extract.nxv2f64.nxv4f64(<vscale x 4 x double> zeroinitializer, i64 2)
; CHECK-NEXT: [[TMP19:%.*]] = call <vscale x 2 x double> @llvm.vector.extract.nxv2f64.nxv4f64(<vscale x 4 x double> [[TMP14]], i64 0)
; CHECK-NEXT: [[TMP20:%.*]] = call <vscale x 2 x double> @llvm.vector.extract.nxv2f64.nxv4f64(<vscale x 4 x double> [[TMP14]], i64 2)
; CHECK-NEXT: [[TMP21:%.*]] = call <vscale x 2 x double> @llvm.aarch64.sve.fcmla.nxv2f64(<vscale x 2 x i1> splat (i1 true), <vscale x 2 x double> [[TMP19]], <vscale x 2 x double> [[TMP15]], <vscale x 2 x double> [[TMP16]], i32 90)
; CHECK-NEXT: [[TMP22:%.*]] = call <vscale x 2 x double> @llvm.aarch64.sve.fcmla.nxv2f64(<vscale x 2 x i1> splat (i1 true), <vscale x 2 x double> [[TMP20]], <vscale x 2 x double> [[TMP17]], <vscale x 2 x double> [[TMP18]], i32 90)
; CHECK-NEXT: [[TMP23:%.*]] = call <vscale x 4 x double> @llvm.vector.insert.nxv4f64.nxv2f64(<vscale x 4 x double> poison, <vscale x 2 x double> [[TMP21]], i64 0)
; CHECK-NEXT: [[TMP24:%.*]] = call <vscale x 4 x double> @llvm.vector.insert.nxv4f64.nxv2f64(<vscale x 4 x double> [[TMP23]], <vscale x 2 x double> [[TMP22]], i64 2)
; CHECK-NEXT: [[TMP25:%.*]] = call <vscale x 4 x i1> @llvm.vector.interleave2.nxv4i1(<vscale x 2 x i1> [[ACTIVE_LANE_MASK]], <vscale x 2 x i1> [[ACTIVE_LANE_MASK]])
; CHECK-NEXT: [[TMP26]] = select <vscale x 4 x i1> [[TMP25]], <vscale x 4 x double> [[TMP24]], <vscale x 4 x double> [[TMP4]]
; CHECK-NEXT: br i1 [[TMP1]], label %[[VECTOR_BODY]], label %[[MIDDLE_BLOCK:.*]]
; CHECK: [[MIDDLE_BLOCK]]:
; CHECK-NEXT: [[TMP27:%.*]] = call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.vector.deinterleave2.nxv4f64(<vscale x 4 x double> [[TMP26]])
; CHECK-NEXT: [[TMP28:%.*]] = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } [[TMP27]], 0
; CHECK-NEXT: [[TMP29:%.*]] = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } [[TMP27]], 1
; CHECK-NEXT: [[TMP30:%.*]] = tail call double @llvm.vector.reduce.fadd.nxv2f64(double 0.000000e+00, <vscale x 2 x double> [[TMP29]])
; CHECK-NEXT: br label %[[VECTOR_BODY266:.*]]
; CHECK: [[VECTOR_BODY266]]:
; CHECK-NEXT: br i1 [[TMP1]], label %[[VECTOR_BODY266]], [[DOTPREHEADER_PREHEADER:label %.*]]
; CHECK: [[_PREHEADER_PREHEADER:.*:]]
; CHECK-NEXT: [[TMP31:%.*]] = tail call double @llvm.vector.reduce.fadd.nxv2f64(double 0.000000e+00, <vscale x 2 x double> [[TMP28]])
; CHECK-NEXT: ret double [[TMP31]]
;
.preheader159:
br label %vector.body
vector.body: ; preds = %vector.body, %.preheader159
%active.lane.mask = phi <vscale x 2 x i1> [ zeroinitializer, %.preheader159 ], [ %0, %vector.body ]
%vec.phi247 = phi <vscale x 2 x double> [ zeroinitializer, %.preheader159 ], [ %11, %vector.body ]
%vec.phi248 = phi <vscale x 2 x double> [ zeroinitializer, %.preheader159 ], [ %16, %vector.body ]
%strided.vec251 = tail call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.vector.deinterleave2.nxv4f64(<vscale x 4 x double> zeroinitializer)
%3 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec251, 0
%strided.vec = tail call { <vscale x 2 x double>, <vscale x 2 x double> } @llvm.vector.deinterleave2.nxv4f64(<vscale x 4 x double> zeroinitializer)
%4 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec, 1
%5 = fmul fast <vscale x 2 x double> %3, %4
%6 = fadd fast <vscale x 2 x double> %5, %vec.phi247
%7 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec251, 1
%8 = extractvalue { <vscale x 2 x double>, <vscale x 2 x double> } %strided.vec, 0
%9 = fmul fast <vscale x 2 x double> %7, %8
%10 = fadd fast <vscale x 2 x double> %6, %9
%11 = select <vscale x 2 x i1> %active.lane.mask, <vscale x 2 x double> %10, <vscale x 2 x double> %vec.phi247
%12 = fmul fast <vscale x 2 x double> %3, %8
%13 = fadd fast <vscale x 2 x double> %12, %vec.phi248
%14 = fmul fast <vscale x 2 x double> %4, %7
%15 = fsub fast <vscale x 2 x double> %13, %14
%16 = select <vscale x 2 x i1> %active.lane.mask, <vscale x 2 x double> %15, <vscale x 2 x double> %vec.phi248
br i1 %1, label %vector.body, label %middle.block
middle.block: ; preds = %vector.body
%17 = tail call double @llvm.vector.reduce.fadd.nxv2f64(double 0.000000e+00, <vscale x 2 x double> %11)
br label %vector.body266
vector.body266: ; preds = %vector.body266, %middle.block
br i1 %1, label %vector.body266, label %.preheader.preheader
.preheader.preheader: ; preds = %vector.body266
%18 = tail call double @llvm.vector.reduce.fadd.nxv2f64(double 0.000000e+00, <vscale x 2 x double> %16)
ret double %18
}