File: bug-56423.ll

package info (click to toggle)
llvm-toolchain-17 1%3A17.0.6-22
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,799,624 kB
  • sloc: cpp: 6,428,607; ansic: 1,383,196; asm: 793,408; python: 223,504; objc: 75,364; f90: 60,502; lisp: 33,869; pascal: 15,282; sh: 9,684; perl: 7,453; ml: 4,937; awk: 3,523; makefile: 2,889; javascript: 2,149; xml: 888; fortran: 619; cs: 573
file content (135 lines) | stat: -rw-r--r-- 3,871 bytes parent folder | download | duplicates (10)
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
}