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 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc < %s -mtriple=avr -mcpu=atmega328 | FileCheck %s --check-prefix=AVR51
; RUN: llc < %s -mtriple=avr -mcpu=at90s8515 | FileCheck %s --check-prefix=AVR2
; Test for bug https://github.com/llvm/llvm-project/issues/56423
define i32 @foo(i32 %x, i32 %in_min, i32 %in_max, i32 %out_min, i32 %out_max) {
; AVR51-LABEL: foo:
; AVR51: ; %bb.0: ; %entry
; AVR51-NEXT: push r6
; AVR51-NEXT: push r7
; AVR51-NEXT: push r8
; AVR51-NEXT: push r9
; AVR51-NEXT: push r14
; AVR51-NEXT: push r15
; AVR51-NEXT: push r16
; AVR51-NEXT: push r17
; AVR51-NEXT: push r28
; AVR51-NEXT: push r29
; AVR51-NEXT: in r28, 61
; AVR51-NEXT: in r29, 62
; AVR51-NEXT: movw r8, r20
; AVR51-NEXT: movw r6, r18
; AVR51-NEXT: movw r20, r24
; AVR51-NEXT: movw r18, r22
; AVR51-NEXT: ldd r22, Y+13
; AVR51-NEXT: ldd r23, Y+14
; AVR51-NEXT: ldd r24, Y+15
; AVR51-NEXT: ldd r25, Y+16
; AVR51-NEXT: sub r22, r10
; AVR51-NEXT: sbc r23, r11
; AVR51-NEXT: sbc r24, r12
; AVR51-NEXT: sbc r25, r13
; AVR51-NEXT: sub r18, r6
; AVR51-NEXT: sbc r19, r7
; AVR51-NEXT: sbc r20, r8
; AVR51-NEXT: sbc r21, r9
; AVR51-NEXT: call __mulsi3
; AVR51-NEXT: sub r14, r6
; AVR51-NEXT: sbc r15, r7
; AVR51-NEXT: sbc r16, r8
; AVR51-NEXT: sbc r17, r9
; AVR51-NEXT: movw r18, r14
; AVR51-NEXT: movw r20, r16
; AVR51-NEXT: call __divmodsi4
; AVR51-NEXT: add r18, r10
; AVR51-NEXT: adc r19, r11
; AVR51-NEXT: adc r20, r12
; AVR51-NEXT: adc r21, r13
; AVR51-NEXT: movw r22, r18
; AVR51-NEXT: movw r24, r20
; AVR51-NEXT: pop r29
; AVR51-NEXT: pop r28
; AVR51-NEXT: pop r17
; AVR51-NEXT: pop r16
; AVR51-NEXT: pop r15
; AVR51-NEXT: pop r14
; AVR51-NEXT: pop r9
; AVR51-NEXT: pop r8
; AVR51-NEXT: pop r7
; AVR51-NEXT: pop r6
; AVR51-NEXT: ret
;
; AVR2-LABEL: foo:
; AVR2: ; %bb.0: ; %entry
; AVR2-NEXT: push r6
; AVR2-NEXT: push r7
; AVR2-NEXT: push r8
; AVR2-NEXT: push r9
; AVR2-NEXT: push r14
; AVR2-NEXT: push r15
; AVR2-NEXT: push r16
; AVR2-NEXT: push r17
; AVR2-NEXT: push r28
; AVR2-NEXT: push r29
; AVR2-NEXT: in r28, 61
; AVR2-NEXT: in r29, 62
; AVR2-NEXT: mov r8, r20
; AVR2-NEXT: mov r9, r21
; AVR2-NEXT: mov r6, r18
; AVR2-NEXT: mov r7, r19
; AVR2-NEXT: mov r20, r24
; AVR2-NEXT: mov r21, r25
; AVR2-NEXT: mov r18, r22
; AVR2-NEXT: mov r19, r23
; AVR2-NEXT: ldd r22, Y+13
; AVR2-NEXT: ldd r23, Y+14
; AVR2-NEXT: ldd r24, Y+15
; AVR2-NEXT: ldd r25, Y+16
; AVR2-NEXT: sub r22, r10
; AVR2-NEXT: sbc r23, r11
; AVR2-NEXT: sbc r24, r12
; AVR2-NEXT: sbc r25, r13
; AVR2-NEXT: sub r18, r6
; AVR2-NEXT: sbc r19, r7
; AVR2-NEXT: sbc r20, r8
; AVR2-NEXT: sbc r21, r9
; AVR2-NEXT: rcall __mulsi3
; AVR2-NEXT: sub r14, r6
; AVR2-NEXT: sbc r15, r7
; AVR2-NEXT: sbc r16, r8
; AVR2-NEXT: sbc r17, r9
; AVR2-NEXT: mov r18, r14
; AVR2-NEXT: mov r19, r15
; AVR2-NEXT: mov r20, r16
; AVR2-NEXT: mov r21, r17
; AVR2-NEXT: rcall __divmodsi4
; AVR2-NEXT: add r18, r10
; AVR2-NEXT: adc r19, r11
; AVR2-NEXT: adc r20, r12
; AVR2-NEXT: adc r21, r13
; AVR2-NEXT: mov r22, r18
; AVR2-NEXT: mov r23, r19
; AVR2-NEXT: mov r24, r20
; AVR2-NEXT: mov r25, r21
; AVR2-NEXT: pop r29
; AVR2-NEXT: pop r28
; AVR2-NEXT: pop r17
; AVR2-NEXT: pop r16
; AVR2-NEXT: pop r15
; AVR2-NEXT: pop r14
; AVR2-NEXT: pop r9
; AVR2-NEXT: pop r8
; AVR2-NEXT: pop r7
; AVR2-NEXT: pop r6
; AVR2-NEXT: ret
entry:
%sub = sub nsw i32 %x, %in_min
%sub1 = sub nsw i32 %out_max, %out_min
%mul = mul nsw i32 %sub1, %sub
%sub2 = sub nsw i32 %in_max, %in_min
%div = sdiv i32 %mul, %sub2
%add = add nsw i32 %div, %out_min
ret i32 %add
}
|