; Function Attrs: nofree norecurse nosync nounwind memory(none) define i32 @factorial(i32 %0) local_unnamed_addr #0 !dbg !2 { entry: call void @llvm.dbg.value(metadata i32 %0, metadata !8, metadata !DIExpression()), !dbg !10 %.not5 = icmp eq i32 %0, 1, !dbg !11 br i1 %.not5, label %common.ret, label %block_2.preheader, !dbg !11 block_2.preheader: ; preds = %entry %1 = add i32 %0, -1, !dbg !11 %min.iters.check = icmp ult i32 %1, 32, !dbg !11 br i1 %min.iters.check, label %block_2.preheader16, label %vector.ph, !dbg !11 vector.ph: ; preds = %block_2.preheader %n.vec = and i32 %1, -32, !dbg !11 %ind.end = sub i32 %0, %n.vec, !dbg !11 %.splatinsert = insertelement <8 x i32> poison, i32 %0, i64 0, !dbg !11 %.splat = shufflevector <8 x i32> %.splatinsert, <8 x i32> poison, <8 x i32> zeroinitializer, !dbg !11 %induction = add <8 x i32> %.splat, , !dbg !11 br label %vector.body, !dbg !11 vector.body: ; preds = %vector.body, %vector.ph %index = phi i32 [ 0, %vector.ph ], [ %index.next, %vector.body ] %vec.ind = phi <8 x i32> [ %induction, %vector.ph ], [ %vec.ind.next, %vector.body ] %vec.phi = phi <8 x i32> [ , %vector.ph ], [ %2, %vector.body ] %vec.phi11 = phi <8 x i32> [ , %vector.ph ], [ %3, %vector.body ] %vec.phi12 = phi <8 x i32> [ , %vector.ph ], [ %4, %vector.body ] %vec.phi13 = phi <8 x i32> [ , %vector.ph ], [ %5, %vector.body ] %step.add = add <8 x i32> %vec.ind, %step.add8 = add <8 x i32> %vec.ind, %step.add9 = add <8 x i32> %vec.ind, %2 = mul <8 x i32> %vec.ind, %vec.phi, !dbg !12 %3 = mul <8 x i32> %step.add, %vec.phi11, !dbg !12 %4 = mul <8 x i32> %step.add8, %vec.phi12, !dbg !12 %5 = mul <8 x i32> %step.add9, %vec.phi13, !dbg !12 %index.next = add nuw i32 %index, 32 %vec.ind.next = add <8 x i32> %vec.ind, %6 = icmp eq i32 %index.next, %n.vec br i1 %6, label %middle.block, label %vector.body, !llvm.loop !13 middle.block: ; preds = %vector.body %bin.rdx = mul <8 x i32> %3, %2, !dbg !11 %bin.rdx14 = mul <8 x i32> %4, %bin.rdx, !dbg !11 %bin.rdx15 = mul <8 x i32> %5, %bin.rdx14, !dbg !11 %7 = tail call i32 @llvm.vector.reduce.mul.v8i32(<8 x i32> %bin.rdx15), !dbg !11 %cmp.n = icmp eq i32 %1, %n.vec, !dbg !11 br i1 %cmp.n, label %common.ret, label %block_2.preheader16, !dbg !11 block_2.preheader16: ; preds = %block_2.preheader, %middle.block %.tr7.ph = phi i32 [ %0, %block_2.preheader ], [ %ind.end, %middle.block ] %accumulator.tr6.ph = phi i32 [ 1, %block_2.preheader ], [ %7, %middle.block ] br label %block_2, !dbg !11 common.ret: ; preds = %block_2, %middle.block, %entry %accumulator.tr.lcssa = phi i32 [ 1, %entry ], [ %7, %middle.block ], [ %9, %block_2 ], !dbg !12 ret i32 %accumulator.tr.lcssa, !dbg !16 block_2: ; preds = %block_2.preheader16, %block_2 %.tr7 = phi i32 [ %8, %block_2 ], [ %.tr7.ph, %block_2.preheader16 ] %accumulator.tr6 = phi i32 [ %9, %block_2 ], [ %accumulator.tr6.ph, %block_2.preheader16 ] call void @llvm.dbg.value(metadata i32 %.tr7, metadata !8, metadata !DIExpression()), !dbg !10 %8 = add i32 %.tr7, -1, !dbg !17 %9 = mul i32 %.tr7, %accumulator.tr6, !dbg !12 call void @llvm.dbg.value(metadata i32 %8, metadata !8, metadata !DIExpression()), !dbg !10 %.not = icmp eq i32 %8, 1, !dbg !11 br i1 %.not, label %common.ret, label %block_2, !dbg !11, !llvm.loop !18 }