reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
; RUN: llc < %s -O3 -mtriple=arm64-unknown-unknown -mcpu=cyclone -pre-RA-sched=list-hybrid | FileCheck %s
; <rdar://problem/11635990> [arm64] [lsr] Inefficient EA/loop-exit calc in bzero_phys
;
; LSR on loop %while.cond should reassociate non-address mode
; expressions at use %cmp16 to avoid sinking computation into %while.body18.
;
; Remove the -pre-RA-sched=list-hybrid option after fixing:
; <rdar://problem/12702735> [ARM64][coalescer] need better register
; coalescing for simple unit tests.

; CHECK: @memset
; CHECK: %while.body18{{$}}
; CHECK: str x{{[0-9]+}}, [x{{[0-9]+}}], #8
; First set the IVREG variable, then use it
; CHECK-NEXT: sub [[IVREG:x[0-9]+]],
; CHECK: [[IVREG]], #8
; CHECK-NEXT: cmp  [[IVREG]], #7
; CHECK-NEXT: b.hi
define i8* @memset(i8* %dest, i32 %val, i64 %len) nounwind ssp noimplicitfloat {
entry:
  %cmp = icmp eq i64 %len, 0
  br i1 %cmp, label %done, label %while.cond.preheader

while.cond.preheader:                             ; preds = %entry
  %conv = trunc i32 %val to i8
  br label %while.cond

while.cond:                                       ; preds = %while.body, %while.cond.preheader
  %ptr.0 = phi i8* [ %incdec.ptr, %while.body ], [ %dest, %while.cond.preheader ]
  %len.addr.0 = phi i64 [ %dec, %while.body ], [ %len, %while.cond.preheader ]
  %cond = icmp eq i64 %len.addr.0, 0
  br i1 %cond, label %done, label %land.rhs

land.rhs:                                         ; preds = %while.cond
  %0 = ptrtoint i8* %ptr.0 to i64
  %and = and i64 %0, 7
  %cmp5 = icmp eq i64 %and, 0
  br i1 %cmp5, label %if.end9, label %while.body

while.body:                                       ; preds = %land.rhs
  %incdec.ptr = getelementptr inbounds i8, i8* %ptr.0, i64 1
  store i8 %conv, i8* %ptr.0, align 1, !tbaa !0
  %dec = add i64 %len.addr.0, -1
  br label %while.cond

if.end9:                                          ; preds = %land.rhs
  %conv.mask = and i32 %val, 255
  %1 = zext i32 %conv.mask to i64
  %2 = shl nuw nsw i64 %1, 8
  %ins18 = or i64 %2, %1
  %3 = shl nuw nsw i64 %1, 16
  %ins15 = or i64 %ins18, %3
  %4 = shl nuw nsw i64 %1, 24
  %5 = shl nuw nsw i64 %1, 32
  %mask8 = or i64 %ins15, %4
  %6 = shl nuw nsw i64 %1, 40
  %mask5 = or i64 %mask8, %5
  %7 = shl nuw nsw i64 %1, 48
  %8 = shl nuw i64 %1, 56
  %mask2.masked = or i64 %mask5, %6
  %mask = or i64 %mask2.masked, %7
  %ins = or i64 %mask, %8
  %9 = bitcast i8* %ptr.0 to i64*
  %cmp1636 = icmp ugt i64 %len.addr.0, 7
  br i1 %cmp1636, label %while.body18, label %while.body29.lr.ph

while.body18:                                     ; preds = %if.end9, %while.body18
  %wideptr.038 = phi i64* [ %incdec.ptr19, %while.body18 ], [ %9, %if.end9 ]
  %len.addr.137 = phi i64 [ %sub, %while.body18 ], [ %len.addr.0, %if.end9 ]
  %incdec.ptr19 = getelementptr inbounds i64, i64* %wideptr.038, i64 1
  store i64 %ins, i64* %wideptr.038, align 8, !tbaa !2
  %sub = add i64 %len.addr.137, -8
  %cmp16 = icmp ugt i64 %sub, 7
  br i1 %cmp16, label %while.body18, label %while.end20

while.end20:                                      ; preds = %while.body18
  %cmp21 = icmp eq i64 %sub, 0
  br i1 %cmp21, label %done, label %while.body29.lr.ph

while.body29.lr.ph:                               ; preds = %while.end20, %if.end9
  %len.addr.1.lcssa49 = phi i64 [ %sub, %while.end20 ], [ %len.addr.0, %if.end9 ]
  %wideptr.0.lcssa48 = phi i64* [ %incdec.ptr19, %while.end20 ], [ %9, %if.end9 ]
  %10 = bitcast i64* %wideptr.0.lcssa48 to i8*
  br label %while.body29

while.body29:                                     ; preds = %while.body29, %while.body29.lr.ph
  %len.addr.235 = phi i64 [ %len.addr.1.lcssa49, %while.body29.lr.ph ], [ %dec26, %while.body29 ]
  %ptr.134 = phi i8* [ %10, %while.body29.lr.ph ], [ %incdec.ptr31, %while.body29 ]
  %dec26 = add i64 %len.addr.235, -1
  %incdec.ptr31 = getelementptr inbounds i8, i8* %ptr.134, i64 1
  store i8 %conv, i8* %ptr.134, align 1, !tbaa !0
  %cmp27 = icmp eq i64 %dec26, 0
  br i1 %cmp27, label %done, label %while.body29

done:                                             ; preds = %while.cond, %while.body29, %while.end20, %entry
  ret i8* %dest
}

!0 = !{!"omnipotent char", !1}
!1 = !{!"Simple C/C++ TBAA"}
!2 = !{!"long long", !0}