; 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( %0, i1 %1, %2) { ; CHECK-LABEL: define double @test( ; CHECK-SAME: [[TMP0:%.*]], i1 [[TMP1:%.*]], [[TMP2:%.*]]) #[[ATTR0:[0-9]+]] { ; CHECK-NEXT: [[_PREHEADER159:.*:]] ; CHECK-NEXT: [[TMP3:%.*]] = call @llvm.vector.interleave2.nxv4f64( zeroinitializer, zeroinitializer) ; CHECK-NEXT: br label %[[VECTOR_BODY:.*]] ; CHECK: [[VECTOR_BODY]]: ; CHECK-NEXT: [[ACTIVE_LANE_MASK:%.*]] = phi [ zeroinitializer, [[DOTPREHEADER159:%.*]] ], [ [[TMP0]], %[[VECTOR_BODY]] ] ; CHECK-NEXT: [[TMP4:%.*]] = phi [ [[TMP3]], [[DOTPREHEADER159]] ], [ [[TMP26:%.*]], %[[VECTOR_BODY]] ] ; CHECK-NEXT: [[TMP5:%.*]] = call @llvm.vector.extract.nxv2f64.nxv4f64( zeroinitializer, i64 0) ; CHECK-NEXT: [[TMP6:%.*]] = call @llvm.vector.extract.nxv2f64.nxv4f64( zeroinitializer, i64 0) ; CHECK-NEXT: [[TMP7:%.*]] = call @llvm.vector.extract.nxv2f64.nxv4f64( zeroinitializer, i64 2) ; CHECK-NEXT: [[TMP8:%.*]] = call @llvm.vector.extract.nxv2f64.nxv4f64( zeroinitializer, i64 2) ; CHECK-NEXT: [[TMP9:%.*]] = call @llvm.vector.extract.nxv2f64.nxv4f64( [[TMP4]], i64 0) ; CHECK-NEXT: [[TMP10:%.*]] = call @llvm.vector.extract.nxv2f64.nxv4f64( [[TMP4]], i64 2) ; CHECK-NEXT: [[TMP11:%.*]] = call @llvm.aarch64.sve.fcmla.nxv2f64( splat (i1 true), [[TMP9]], [[TMP5]], [[TMP6]], i32 0) ; CHECK-NEXT: [[TMP12:%.*]] = call @llvm.aarch64.sve.fcmla.nxv2f64( splat (i1 true), [[TMP10]], [[TMP7]], [[TMP8]], i32 0) ; CHECK-NEXT: [[TMP13:%.*]] = call @llvm.vector.insert.nxv4f64.nxv2f64( poison, [[TMP11]], i64 0) ; CHECK-NEXT: [[TMP14:%.*]] = call @llvm.vector.insert.nxv4f64.nxv2f64( [[TMP13]], [[TMP12]], i64 2) ; CHECK-NEXT: [[TMP15:%.*]] = call @llvm.vector.extract.nxv2f64.nxv4f64( zeroinitializer, i64 0) ; CHECK-NEXT: [[TMP16:%.*]] = call @llvm.vector.extract.nxv2f64.nxv4f64( zeroinitializer, i64 0) ; CHECK-NEXT: [[TMP17:%.*]] = call @llvm.vector.extract.nxv2f64.nxv4f64( zeroinitializer, i64 2) ; CHECK-NEXT: [[TMP18:%.*]] = call @llvm.vector.extract.nxv2f64.nxv4f64( zeroinitializer, i64 2) ; CHECK-NEXT: [[TMP19:%.*]] = call @llvm.vector.extract.nxv2f64.nxv4f64( [[TMP14]], i64 0) ; CHECK-NEXT: [[TMP20:%.*]] = call @llvm.vector.extract.nxv2f64.nxv4f64( [[TMP14]], i64 2) ; CHECK-NEXT: [[TMP21:%.*]] = call @llvm.aarch64.sve.fcmla.nxv2f64( splat (i1 true), [[TMP19]], [[TMP15]], [[TMP16]], i32 90) ; CHECK-NEXT: [[TMP22:%.*]] = call @llvm.aarch64.sve.fcmla.nxv2f64( splat (i1 true), [[TMP20]], [[TMP17]], [[TMP18]], i32 90) ; CHECK-NEXT: [[TMP23:%.*]] = call @llvm.vector.insert.nxv4f64.nxv2f64( poison, [[TMP21]], i64 0) ; CHECK-NEXT: [[TMP24:%.*]] = call @llvm.vector.insert.nxv4f64.nxv2f64( [[TMP23]], [[TMP22]], i64 2) ; CHECK-NEXT: [[TMP25:%.*]] = call @llvm.vector.interleave2.nxv4i1( [[ACTIVE_LANE_MASK]], [[ACTIVE_LANE_MASK]]) ; CHECK-NEXT: [[TMP26]] = select [[TMP25]], [[TMP24]], [[TMP4]] ; CHECK-NEXT: br i1 [[TMP1]], label %[[VECTOR_BODY]], label %[[MIDDLE_BLOCK:.*]] ; CHECK: [[MIDDLE_BLOCK]]: ; CHECK-NEXT: [[TMP27:%.*]] = call { , } @llvm.vector.deinterleave2.nxv4f64( [[TMP26]]) ; CHECK-NEXT: [[TMP28:%.*]] = extractvalue { , } [[TMP27]], 0 ; CHECK-NEXT: [[TMP29:%.*]] = extractvalue { , } [[TMP27]], 1 ; CHECK-NEXT: [[TMP30:%.*]] = tail call double @llvm.vector.reduce.fadd.nxv2f64(double 0.000000e+00, [[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, [[TMP28]]) ; CHECK-NEXT: ret double [[TMP31]] ; .preheader159: br label %vector.body vector.body: ; preds = %vector.body, %.preheader159 %active.lane.mask = phi [ zeroinitializer, %.preheader159 ], [ %0, %vector.body ] %vec.phi247 = phi [ zeroinitializer, %.preheader159 ], [ %11, %vector.body ] %vec.phi248 = phi [ zeroinitializer, %.preheader159 ], [ %16, %vector.body ] %strided.vec251 = tail call { , } @llvm.vector.deinterleave2.nxv4f64( zeroinitializer) %3 = extractvalue { , } %strided.vec251, 0 %strided.vec = tail call { , } @llvm.vector.deinterleave2.nxv4f64( zeroinitializer) %4 = extractvalue { , } %strided.vec, 1 %5 = fmul fast %3, %4 %6 = fadd fast %5, %vec.phi247 %7 = extractvalue { , } %strided.vec251, 1 %8 = extractvalue { , } %strided.vec, 0 %9 = fmul fast %7, %8 %10 = fadd fast %6, %9 %11 = select %active.lane.mask, %10, %vec.phi247 %12 = fmul fast %3, %8 %13 = fadd fast %12, %vec.phi248 %14 = fmul fast %4, %7 %15 = fsub fast %13, %14 %16 = select %active.lane.mask, %15, %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, %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, %16) ret double %18 }