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