; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -O=3 -mtriple=avr-none -mcpu=attiny85 -verify-machineinstrs | FileCheck %s

declare dso_local void @foo(i16 noundef) addrspace(1)
@ci = dso_local global [30 x i16] zeroinitializer, align 1
define void @loopreduce() {
; CHECK-LABEL: loopreduce:
; CHECK:       ; %bb.0: ; %entry
; CHECK-NEXT:    push r14
; CHECK-NEXT:    push r15
; CHECK-NEXT:    push r16
; CHECK-NEXT:    push r17
; CHECK-NEXT:    ldi r26, lo8(ci)
; CHECK-NEXT:    ldi r27, hi8(ci)
; CHECK-NEXT:    ldi r16, lo8(ci+60)
; CHECK-NEXT:    ldi r17, hi8(ci+60)
; CHECK-NEXT:  .LBB0_1: ; %for.body
; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=1
; CHECK-NEXT:    ld r24, X+
; CHECK-NEXT:    ld r25, X+
; CHECK-NEXT:    movw r14, r26
; CHECK-NEXT:    rcall foo
; CHECK-NEXT:    movw r26, r14
; CHECK-NEXT:    cp r26, r16
; CHECK-NEXT:    cpc r27, r17
; CHECK-NEXT:    brne .LBB0_1
; CHECK-NEXT:  ; %bb.2: ; %for.cond.cleanup
; CHECK-NEXT:    pop r17
; CHECK-NEXT:    pop r16
; CHECK-NEXT:    pop r15
; CHECK-NEXT:    pop r14
; CHECK-NEXT:    ret
entry:
  br label %for.body
for.body:                                         ; preds = %entry, %for.body
  %i.03 = phi i16 [ 0, %entry ], [ %inc, %for.body ]
  %arrayidx = getelementptr inbounds nuw [30 x i16], ptr @ci, i16 0, i16 %i.03
  %0 = load i16, ptr %arrayidx, align 1
  tail call addrspace(1) void @foo(i16 noundef %0)
  %inc = add nuw nsw i16 %i.03, 1
  %exitcond.not = icmp eq i16 %inc, 30
  br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
; Exit blocks
for.cond.cleanup:                                 ; preds = %for.body
  ret void
}

define void @indvar() {
; CHECK-LABEL: indvar:
; CHECK:       ; %bb.0: ; %entry
; CHECK-NEXT:    push r12
; CHECK-NEXT:    push r13
; CHECK-NEXT:    push r14
; CHECK-NEXT:    push r15
; CHECK-NEXT:    push r17
; CHECK-NEXT:    ldi r24, 8
; CHECK-NEXT:    ldi r25, 0
; CHECK-NEXT:    movw r14, r24
; CHECK-NEXT:    ldi r24, 1
; CHECK-NEXT:    ldi r25, 0
; CHECK-NEXT:    movw r12, r24
; CHECK-NEXT:    ldi r17, 3
; CHECK-NEXT:  .LBB1_1: ; %for.body
; CHECK-NEXT:    ; =>This Inner Loop Header: Depth=1
; CHECK-NEXT:    movw r24, r12
; CHECK-NEXT:    rcall foo
; CHECK-NEXT:    movw r22, r14
; CHECK-NEXT:    movw r24, r22
; CHECK-NEXT:    rcall __mulhi3
; CHECK-NEXT:    movw r30, r14
; CHECK-NEXT:    adiw r30, 1
; CHECK-NEXT:    movw r14, r30
; CHECK-NEXT:    cpi r24, -24
; CHECK-NEXT:    cpc r25, r17
; CHECK-NEXT:    brlo .LBB1_1
; CHECK-NEXT:  ; %bb.2: ; %for.cond.cleanup
; CHECK-NEXT:    pop r17
; CHECK-NEXT:    pop r15
; CHECK-NEXT:    pop r14
; CHECK-NEXT:    pop r13
; CHECK-NEXT:    pop r12
; CHECK-NEXT:    ret
entry:
  br label %for.body
for.body:                                         ; preds = %entry, %for.body
  %i.03 = phi i16 [ 7, %entry ], [ %inc, %for.body ]
  tail call addrspace(1) void @foo(i16 noundef 1)
  %inc = add nuw nsw i16 %i.03, 1
  %mul = mul nuw nsw i16 %inc, %inc
  %cmp = icmp samesign ult i16 %mul, 1000
  br i1 %cmp, label %for.body, label %for.cond.cleanup
for.cond.cleanup:                                 ; preds = %for.body
  ret void
}

