brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.9 KiB · c23e4e1 Raw
111 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=aarch64-linux-gnuabi -mattr=+fullfp16 -O3 | FileCheck %s3 4define void @fma_dup_f16(ptr noalias nocapture noundef readonly %A, half noundef %B, ptr noalias nocapture noundef %C, i32 noundef %n) {5; CHECK-LABEL: fma_dup_f16:6; CHECK:       // %bb.0: // %entry7; CHECK-NEXT:    // kill: def $h0 killed $h0 def $q08; CHECK-NEXT:    cbz w2, .LBB0_89; CHECK-NEXT:  // %bb.1: // %for.body.preheader10; CHECK-NEXT:    cmp w2, #1511; CHECK-NEXT:    mov w8, w212; CHECK-NEXT:    b.hi .LBB0_313; CHECK-NEXT:  // %bb.2:14; CHECK-NEXT:    mov x9, xzr15; CHECK-NEXT:    b .LBB0_616; CHECK-NEXT:  .LBB0_3: // %vector.ph17; CHECK-NEXT:    and x9, x8, #0xfffffff018; CHECK-NEXT:    add x10, x1, #1619; CHECK-NEXT:    add x11, x0, #1620; CHECK-NEXT:    and x12, x8, #0xfffffff021; CHECK-NEXT:  .LBB0_4: // %vector.body22; CHECK-NEXT:    // =>This Inner Loop Header: Depth=123; CHECK-NEXT:    ldp q1, q4, [x10, #-16]24; CHECK-NEXT:    subs x12, x12, #1625; CHECK-NEXT:    ldp q2, q3, [x11, #-16]26; CHECK-NEXT:    add x11, x11, #3227; CHECK-NEXT:    fmla v1.8h, v2.8h, v0.h[0]28; CHECK-NEXT:    fmla v4.8h, v3.8h, v0.h[0]29; CHECK-NEXT:    stp q1, q4, [x10, #-16]30; CHECK-NEXT:    add x10, x10, #3231; CHECK-NEXT:    b.ne .LBB0_432; CHECK-NEXT:  // %bb.5: // %middle.block33; CHECK-NEXT:    cmp x9, x834; CHECK-NEXT:    b.eq .LBB0_835; CHECK-NEXT:  .LBB0_6: // %for.body.preheader136; CHECK-NEXT:    lsl x10, x9, #137; CHECK-NEXT:    sub x8, x8, x938; CHECK-NEXT:    add x9, x1, x1039; CHECK-NEXT:    add x10, x0, x1040; CHECK-NEXT:  .LBB0_7: // %for.body41; CHECK-NEXT:    // =>This Inner Loop Header: Depth=142; CHECK-NEXT:    ldr h1, [x10], #243; CHECK-NEXT:    ldr h2, [x9]44; CHECK-NEXT:    subs x8, x8, #145; CHECK-NEXT:    fmadd h1, h1, h0, h246; CHECK-NEXT:    str h1, [x9], #247; CHECK-NEXT:    b.ne .LBB0_748; CHECK-NEXT:  .LBB0_8: // %for.cond.cleanup49; CHECK-NEXT:    ret50entry:51  %cmp6.not = icmp eq i32 %n, 052  br i1 %cmp6.not, label %for.cond.cleanup, label %for.body.preheader53 54for.body.preheader:                               ; preds = %entry55  %wide.trip.count = zext i32 %n to i6456  %min.iters.check = icmp ult i32 %n, 1657  br i1 %min.iters.check, label %for.body.preheader14, label %vector.ph58 59vector.ph:                                        ; preds = %for.body.preheader60  %n.vec = and i64 %wide.trip.count, 429496728061  %broadcast.splatinsert = insertelement <8 x half> poison, half %B, i64 062  %broadcast.splat = shufflevector <8 x half> %broadcast.splatinsert, <8 x half> poison, <8 x i32> zeroinitializer63  %broadcast.splatinsert10 = insertelement <8 x half> poison, half %B, i64 064  %broadcast.splat11 = shufflevector <8 x half> %broadcast.splatinsert10, <8 x half> poison, <8 x i32> zeroinitializer65  br label %vector.body66 67vector.body:                                      ; preds = %vector.body, %vector.ph68  %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]69  %0 = getelementptr inbounds half, ptr %A, i64 %index70  %wide.load = load <8 x half>, ptr %0, align 271  %1 = getelementptr inbounds half, ptr %0, i64 872  %wide.load9 = load <8 x half>, ptr %1, align 273  %2 = fmul fast <8 x half> %wide.load, %broadcast.splat74  %3 = fmul fast <8 x half> %wide.load9, %broadcast.splat1175  %4 = getelementptr inbounds half, ptr %C, i64 %index76  %wide.load12 = load <8 x half>, ptr %4, align 277  %5 = getelementptr inbounds half, ptr %4, i64 878  %wide.load13 = load <8 x half>, ptr %5, align 279  %6 = fadd fast <8 x half> %wide.load12, %280  %7 = fadd fast <8 x half> %wide.load13, %381  store <8 x half> %6, ptr %4, align 282  store <8 x half> %7, ptr %5, align 283  %index.next = add nuw i64 %index, 1684  %8 = icmp eq i64 %index.next, %n.vec85  br i1 %8, label %middle.block, label %vector.body86 87middle.block:                                     ; preds = %vector.body88  %cmp.n = icmp eq i64 %n.vec, %wide.trip.count89  br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader1490 91for.body.preheader14:                             ; preds = %for.body.preheader, %middle.block92  %indvars.iv.ph = phi i64 [ 0, %for.body.preheader ], [ %n.vec, %middle.block ]93  br label %for.body94 95for.cond.cleanup:                                 ; preds = %for.body, %middle.block, %entry96  ret void97 98for.body:                                         ; preds = %for.body.preheader14, %for.body99  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ %indvars.iv.ph, %for.body.preheader14 ]100  %arrayidx = getelementptr inbounds half, ptr %A, i64 %indvars.iv101  %9 = load half, ptr %arrayidx, align 2102  %mul = fmul fast half %9, %B103  %arrayidx2 = getelementptr inbounds half, ptr %C, i64 %indvars.iv104  %10 = load half, ptr %arrayidx2, align 2105  %add = fadd fast half %10, %mul106  store half %add, ptr %arrayidx2, align 2107  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1108  %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count109  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body110}111