; 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 }