| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 |
| ; RUN: llc < %s -mtriple=avr -mcpu=atmega328 -O1 -verify-machineinstrs | FileCheck %s |
| |
| define internal i8 @main() { |
| ; CHECK-LABEL: main: |
| ; CHECK: ; %bb.0: ; %bb0 |
| ; CHECK-NEXT: push r2 |
| ; CHECK-NEXT: push r3 |
| ; CHECK-NEXT: push r4 |
| ; CHECK-NEXT: push r5 |
| ; CHECK-NEXT: push r6 |
| ; CHECK-NEXT: push r7 |
| ; CHECK-NEXT: push r8 |
| ; CHECK-NEXT: push r9 |
| ; CHECK-NEXT: push r10 |
| ; CHECK-NEXT: push r11 |
| ; CHECK-NEXT: push r12 |
| ; CHECK-NEXT: push r13 |
| ; CHECK-NEXT: push r14 |
| ; CHECK-NEXT: push r15 |
| ; CHECK-NEXT: push r16 |
| ; CHECK-NEXT: push r17 |
| ; CHECK-NEXT: push r28 |
| ; CHECK-NEXT: push r29 |
| ; CHECK-NEXT: in r28, 61 |
| ; CHECK-NEXT: in r29, 62 |
| ; CHECK-NEXT: sbiw r28, 13 |
| ; CHECK-NEXT: in r0, 63 |
| ; CHECK-NEXT: cli |
| ; CHECK-NEXT: out 62, r29 |
| ; CHECK-NEXT: out 63, r0 |
| ; CHECK-NEXT: out 61, r28 |
| ; CHECK-NEXT: ldi r16, 0 |
| ; CHECK-NEXT: ldi r17, 0 |
| ; CHECK-NEXT: ldi r18, -1 |
| ; CHECK-NEXT: ;APP |
| ; CHECK-NEXT: ldi r24, 123 |
| ; CHECK-NEXT: ;NO_APP |
| ; CHECK-NEXT: std Y+1, r24 ; 1-byte Folded Spill |
| ; CHECK-NEXT: movw r24, r28 |
| ; CHECK-NEXT: adiw r24, 6 |
| ; CHECK-NEXT: std Y+3, r25 ; 2-byte Folded Spill |
| ; CHECK-NEXT: std Y+2, r24 ; 2-byte Folded Spill |
| ; CHECK-NEXT: movw r8, r16 |
| ; CHECK-NEXT: movw r6, r16 |
| ; CHECK-NEXT: movw r4, r16 |
| ; CHECK-NEXT: movw r2, r16 |
| ; CHECK-NEXT: rjmp .LBB0_2 |
| ; CHECK-NEXT: .LBB0_1: ; %bb1 |
| ; CHECK-NEXT: ; in Loop: Header=BB0_2 Depth=1 |
| ; CHECK-NEXT: andi r30, 1 |
| ; CHECK-NEXT: ldd r31, Y+4 ; 1-byte Folded Reload |
| ; CHECK-NEXT: dec r31 |
| ; CHECK-NEXT: cpi r30, 0 |
| ; CHECK-NEXT: movw r8, r18 |
| ; CHECK-NEXT: movw r6, r20 |
| ; CHECK-NEXT: movw r4, r22 |
| ; CHECK-NEXT: movw r2, r24 |
| ; CHECK-NEXT: mov r18, r31 |
| ; CHECK-NEXT: brne .LBB0_2 |
| ; CHECK-NEXT: rjmp .LBB0_4 |
| ; CHECK-NEXT: .LBB0_2: ; %bb1 |
| ; CHECK-NEXT: ; =>This Inner Loop Header: Depth=1 |
| ; CHECK-NEXT: std Y+4, r18 ; 1-byte Folded Spill |
| ; CHECK-NEXT: movw r18, r8 |
| ; CHECK-NEXT: movw r20, r6 |
| ; CHECK-NEXT: movw r22, r4 |
| ; CHECK-NEXT: movw r24, r2 |
| ; CHECK-NEXT: ldi r26, 10 |
| ; CHECK-NEXT: ldi r27, 0 |
| ; CHECK-NEXT: movw r10, r26 |
| ; CHECK-NEXT: movw r12, r16 |
| ; CHECK-NEXT: movw r14, r16 |
| ; CHECK-NEXT: call __udivdi3 |
| ; CHECK-NEXT: std Y+13, r25 |
| ; CHECK-NEXT: std Y+12, r24 |
| ; CHECK-NEXT: std Y+11, r23 |
| ; CHECK-NEXT: std Y+10, r22 |
| ; CHECK-NEXT: std Y+9, r21 |
| ; CHECK-NEXT: std Y+8, r20 |
| ; CHECK-NEXT: std Y+7, r19 |
| ; CHECK-NEXT: std Y+6, r18 |
| ; CHECK-NEXT: ldd r30, Y+2 ; 2-byte Folded Reload |
| ; CHECK-NEXT: ldd r31, Y+3 ; 2-byte Folded Reload |
| ; CHECK-NEXT: ;APP |
| ; CHECK-NEXT: ;NO_APP |
| ; CHECK-NEXT: ldi r30, 1 |
| ; CHECK-NEXT: cp r8, r1 |
| ; CHECK-NEXT: cpc r9, r1 |
| ; CHECK-NEXT: cpc r6, r16 |
| ; CHECK-NEXT: cpc r7, r17 |
| ; CHECK-NEXT: cpc r4, r16 |
| ; CHECK-NEXT: cpc r5, r17 |
| ; CHECK-NEXT: cpc r2, r16 |
| ; CHECK-NEXT: cpc r3, r17 |
| ; CHECK-NEXT: breq .LBB0_3 |
| ; CHECK-NEXT: rjmp .LBB0_1 |
| ; CHECK-NEXT: .LBB0_3: ; %bb1 |
| ; CHECK-NEXT: ; in Loop: Header=BB0_2 Depth=1 |
| ; CHECK-NEXT: mov r30, r1 |
| ; CHECK-NEXT: rjmp .LBB0_1 |
| ; CHECK-NEXT: .LBB0_4: ; %bb3 |
| ; CHECK-NEXT: ldd r24, Y+1 ; 1-byte Folded Reload |
| ; CHECK-NEXT: std Y+5, r24 |
| ; CHECK-NEXT: movw r24, r28 |
| ; CHECK-NEXT: adiw r24, 5 |
| ; CHECK-NEXT: ;APP |
| ; CHECK-NEXT: ;NO_APP |
| ; CHECK-NEXT: ldd r24, Y+5 |
| ; CHECK-NEXT: adiw r28, 13 |
| ; CHECK-NEXT: in r0, 63 |
| ; CHECK-NEXT: cli |
| ; CHECK-NEXT: out 62, r29 |
| ; CHECK-NEXT: out 63, r0 |
| ; CHECK-NEXT: out 61, r28 |
| ; CHECK-NEXT: pop r29 |
| ; CHECK-NEXT: pop r28 |
| ; CHECK-NEXT: pop r17 |
| ; CHECK-NEXT: pop r16 |
| ; CHECK-NEXT: pop r15 |
| ; CHECK-NEXT: pop r14 |
| ; CHECK-NEXT: pop r13 |
| ; CHECK-NEXT: pop r12 |
| ; CHECK-NEXT: pop r11 |
| ; CHECK-NEXT: pop r10 |
| ; CHECK-NEXT: pop r9 |
| ; CHECK-NEXT: pop r8 |
| ; CHECK-NEXT: pop r7 |
| ; CHECK-NEXT: pop r6 |
| ; CHECK-NEXT: pop r5 |
| ; CHECK-NEXT: pop r4 |
| ; CHECK-NEXT: pop r3 |
| ; CHECK-NEXT: pop r2 |
| ; CHECK-NEXT: ret |
| bb0: |
| %0 = alloca i64 |
| %1 = alloca i8 |
| %2 = tail call i8 asm sideeffect "ldi ${0}, 123", "=&r,~{sreg},~{memory}"() |
| |
| br label %bb1 |
| |
| bb1: |
| %3 = phi i64 [ %5, %bb1 ], [ 0, %bb0 ] |
| %4 = phi i8 [ %6, %bb1 ], [ 0, %bb0 ] |
| %5 = udiv i64 %3, 10 |
| %6 = add i8 %4, 1 |
| |
| store i64 %5, ptr %0 |
| call void asm sideeffect "", "r,~{memory}"(ptr %0) |
| |
| %7 = icmp eq i64 %3, 0 |
| %8 = icmp eq i8 %6, 0 |
| |
| br i1 %7, label %bb3, label %bb1 |
| |
| bb3: |
| store i8 %2, ptr %1 |
| call void asm sideeffect "", "r,~{memory}"(ptr %1) |
| |
| %9 = load i8, ptr %1 |
| |
| ret i8 %9 |
| } |