1
1
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2
2
; RUN: llc -mtriple=riscv32-unknown-elf -mattr=+zba %s -o - | FileCheck %s
3
3
4
- declare i32 @callee1 (i32 noundef)
5
- declare i32 @callee2 (i32 noundef, i32 noundef)
6
- declare i32 @callee (i32 noundef, i32 noundef, i32 noundef, i32 noundef)
4
+ declare i32 @callee2 (i32 , i32 )
5
+ declare i32 @callee3 (i32 , i32 , i32 )
7
6
8
- define void @t1 (i32 noundef %a , i32 noundef %b , i32 noundef %c , i32 noundef %d ) #0 {
7
+ ; Positive test
8
+ ; The users of addi aren't more than 2
9
+ define void @t1 (i32 %a , i32 %b , i32 %c ) {
9
10
; CHECK-LABEL: t1:
10
11
; CHECK: # %bb.0: # %entry
11
- ; CHECK-NEXT: slli a4, a0, 2
12
- ; CHECK-NEXT: addi a4, a4, 45
13
- ; CHECK-NEXT: add a1, a4, a1
14
- ; CHECK-NEXT: add a2, a4, a2
15
- ; CHECK-NEXT: sh2add a3, a0, a3
16
- ; CHECK-NEXT: mv a0, a1
17
- ; CHECK-NEXT: tail callee
18
- entry:
19
- %shl = shl i32 %a , 2
20
- %add = add nsw i32 %shl , 45
21
- %add1 = add nsw i32 %add , %b
22
- %add3 = add nsw i32 %add , %c
23
- %add5 = add nsw i32 %shl , %d
24
- %call = tail call i32 @callee (i32 noundef %add1 , i32 noundef %add1 , i32 noundef %add3 , i32 noundef %add5 )
25
- ret void
26
- }
27
-
28
- define void @t2 (i32 noundef %a , i32 noundef %b , i32 noundef %c ) #0 {
29
- ; CHECK-LABEL: t2:
30
- ; CHECK: # %bb.0: # %entry
31
- ; CHECK-NEXT: slli a0, a0, 2
32
- ; CHECK-NEXT: addi a5, a0, 42
33
- ; CHECK-NEXT: add a4, a5, a1
34
- ; CHECK-NEXT: add a3, a5, a2
35
- ; CHECK-NEXT: mv a1, a5
36
- ; CHECK-NEXT: mv a2, a4
37
- ; CHECK-NEXT: tail callee
38
- entry:
39
- %shl = shl i32 %a , 2
40
- %add = add nsw i32 %shl , 42
41
- %add4 = add nsw i32 %add , %b
42
- %add7 = add nsw i32 %add , %c
43
- %call = tail call i32 @callee (i32 noundef %shl , i32 noundef %add , i32 noundef %add4 , i32 noundef %add7 )
44
- ret void
45
- }
46
-
47
- define void @t3 (i32 noundef %a , i32 noundef %b , i32 noundef %c , i32 noundef %d , i32 noundef %e ) #0 {
48
- ; CHECK-LABEL: t3:
49
- ; CHECK: # %bb.0: # %entry
50
- ; CHECK-NEXT: slli a0, a0, 2
51
- ; CHECK-NEXT: addi a5, a0, 42
52
- ; CHECK-NEXT: add a0, a5, a1
53
- ; CHECK-NEXT: add a1, a5, a2
54
- ; CHECK-NEXT: add a2, a5, a3
55
- ; CHECK-NEXT: add a3, a5, a4
56
- ; CHECK-NEXT: tail callee
57
- entry:
58
- %shl = shl i32 %a , 2
59
- %add = add nsw i32 %shl , 42
60
- %add1 = add nsw i32 %add , %b
61
- %add2 = add nsw i32 %add , %c
62
- %add3 = add nsw i32 %add , %d
63
- %add4 = add nsw i32 %add , %e
64
- %call = tail call i32 @callee (i32 noundef %add1 , i32 noundef %add2 , i32 noundef %add3 , i32 noundef %add4 )
65
- ret void
66
- }
67
-
68
- define void @t4 (i32 noundef %a , i32 noundef %b ) #0 {
69
- ; CHECK-LABEL: t4:
70
- ; CHECK: # %bb.0: # %entry
71
- ; CHECK-NEXT: sh2add a0, a0, a1
72
- ; CHECK-NEXT: addi a0, a0, 42
73
- ; CHECK-NEXT: tail callee1
74
- entry:
75
- %shl = shl i32 %a , 2
76
- %add = add nsw i32 %shl , 42
77
- %add1 = add nsw i32 %add , %b
78
- %call = tail call i32 @callee1 (i32 noundef %add1 )
79
- ret void
80
- }
81
-
82
- define void @t5 (i32 noundef %a , i32 noundef %b , i32 noundef %c ) #0 {
83
- ; CHECK-LABEL: t5:
84
- ; CHECK: # %bb.0: # %entry
85
12
; CHECK-NEXT: sh2add a2, a0, a2
86
13
; CHECK-NEXT: sh2add a0, a0, a1
87
14
; CHECK-NEXT: addi a0, a0, 42
@@ -92,97 +19,68 @@ entry:
92
19
%add = add nsw i32 %shl , 42
93
20
%add1 = add nsw i32 %add , %b
94
21
%add2 = add nsw i32 %add , %c
95
- %call = tail call i32 @callee2 (i32 noundef %add1 , i32 noundef %add2 )
96
- ret void
97
- }
98
-
99
- define void @t6 (i32 noundef %a , i32 noundef %b ) #0 {
100
- ; CHECK-LABEL: t6:
101
- ; CHECK: # %bb.0: # %entry
102
- ; CHECK-NEXT: slli a2, a0, 2
103
- ; CHECK-NEXT: sh2add a0, a0, a1
104
- ; CHECK-NEXT: addi a0, a0, 42
105
- ; CHECK-NEXT: mv a1, a2
106
- ; CHECK-NEXT: mv a3, a2
107
- ; CHECK-NEXT: tail callee
108
- entry:
109
- %shl = shl i32 %a , 2
110
- %add = add nsw i32 %shl , 42
111
- %add1 = add nsw i32 %add , %b
112
- %call = tail call i32 @callee (i32 noundef %add1 , i32 noundef %shl , i32 noundef %shl , i32 noundef %shl )
22
+ %call = tail call i32 @callee2 (i32 %add1 , i32 %add2 )
113
23
ret void
114
24
}
115
25
116
- define void @t7 (i32 noundef %a , i32 noundef %b ) #0 {
117
- ; CHECK-LABEL: t7:
26
+ ; Negative test
27
+ ; The users of addi are more than 2.
28
+ define void @t2 (i32 %a , i32 %b , i32 %c , i32 %d , i32 %e ) {
29
+ ; CHECK-LABEL: t2:
118
30
; CHECK: # %bb.0: # %entry
119
31
; CHECK-NEXT: slli a0, a0, 2
120
- ; CHECK-NEXT: addi a2 , a0, 42
121
- ; CHECK-NEXT: add a0, a2 , a1
122
- ; CHECK-NEXT: mv a1, a2
123
- ; CHECK-NEXT: mv a3, a2
124
- ; CHECK-NEXT: tail callee
32
+ ; CHECK-NEXT: addi a4 , a0, 42
33
+ ; CHECK-NEXT: add a0, a4 , a1
34
+ ; CHECK-NEXT: add a1, a4 , a2
35
+ ; CHECK-NEXT: add a2, a4, a3
36
+ ; CHECK-NEXT: tail callee3
125
37
entry:
126
38
%shl = shl i32 %a , 2
127
39
%add = add nsw i32 %shl , 42
128
40
%add1 = add nsw i32 %add , %b
129
- %call = tail call i32 @callee (i32 noundef %add1 , i32 noundef %add , i32 noundef %add , i32 noundef %add )
130
- ret void
131
- }
132
-
133
- define void @t8 (i32 noundef %a , i32 noundef %b , i32 noundef %c , i32 noundef %d ) #0 {
134
- ; CHECK-LABEL: t8:
135
- ; CHECK: # %bb.0: # %entry
136
- ; CHECK-NEXT: lui a4, 1
137
- ; CHECK-NEXT: addi a4, a4, 1307
138
- ; CHECK-NEXT: sh3add a4, a0, a4
139
- ; CHECK-NEXT: add a1, a4, a1
140
- ; CHECK-NEXT: add a2, a4, a2
141
- ; CHECK-NEXT: sh3add a3, a0, a3
142
- ; CHECK-NEXT: mv a0, a1
143
- ; CHECK-NEXT: tail callee
144
- entry:
145
- %shl = shl i32 %a , 3
146
- %add = add nsw i32 %shl , 5403
147
- %add1 = add nsw i32 %add , %b
148
- %add3 = add nsw i32 %add , %c
149
- %add5 = add nsw i32 %shl , %d
150
- %call = tail call i32 @callee (i32 noundef %add1 , i32 noundef %add1 , i32 noundef %add3 , i32 noundef %add5 )
41
+ %add2 = add nsw i32 %add , %c
42
+ %add3 = add nsw i32 %add , %d
43
+ %call = tail call i32 @callee3 (i32 %add1 , i32 %add2 , i32 %add3 )
151
44
ret void
152
45
}
153
46
154
- define void @t9 (i32 noundef %a , i32 noundef %b , i32 noundef %c , i32 noundef %d ) #0 {
155
- ; CHECK-LABEL: t9:
47
+ ; Negative test
48
+ ; shl doesn't have one use.
49
+ define void @t3 (i32 %a , i32 %b , i32 %c , i32 %d ) {
50
+ ; CHECK-LABEL: t3:
156
51
; CHECK: # %bb.0: # %entry
157
52
; CHECK-NEXT: slli a4, a0, 2
158
- ; CHECK-NEXT: addi a4 , a4, -42
159
- ; CHECK-NEXT: add a1, a4 , a1
160
- ; CHECK-NEXT: add a2, a4 , a2
161
- ; CHECK-NEXT: sh2add a3 , a0, a3
162
- ; CHECK-NEXT: mv a0, a1
163
- ; CHECK-NEXT: tail callee
53
+ ; CHECK-NEXT: addi a5 , a4, 45
54
+ ; CHECK-NEXT: add a4, a5 , a1
55
+ ; CHECK-NEXT: add a1, a5 , a2
56
+ ; CHECK-NEXT: sh2add a2 , a0, a3
57
+ ; CHECK-NEXT: mv a0, a4
58
+ ; CHECK-NEXT: tail callee3
164
59
entry:
165
60
%shl = shl i32 %a , 2
166
- %add = add nsw i32 %shl , - 42
61
+ %add = add nsw i32 %shl , 45
167
62
%add1 = add nsw i32 %add , %b
168
- %add3 = add nsw i32 %add , %c
169
- %add5 = add nsw i32 %shl , %d
170
- %call = tail call i32 @callee (i32 noundef %add1 , i32 noundef %add1 , i32 noundef %add3 , i32 noundef %add5 )
63
+ %add2 = add nsw i32 %add , %c
64
+ %add3 = add nsw i32 %shl , %d
65
+ %call = tail call i32 @callee3 (i32 %add1 , i32 %add2 , i32 %add3 )
171
66
ret void
172
67
}
173
68
174
- define void @t10 (i32 noundef %a , i32 noundef %b , i32 noundef %c , i32 noundef %d ) #0 {
175
- ; CHECK-LABEL: t10:
69
+ ; Negative test
70
+ ; shift amount isn't 1, 2, or 3.
71
+ define void @t4 (i32 %a , i32 %b , i32 %c , i32 %d ) {
72
+ ; CHECK-LABEL: t4:
176
73
; CHECK: # %bb.0: # %entry
177
- ; CHECK-NEXT: tail callee
74
+ ; CHECK-NEXT: slli a0, a0, 4
75
+ ; CHECK-NEXT: addi a3, a0, 45
76
+ ; CHECK-NEXT: add a0, a3, a1
77
+ ; CHECK-NEXT: add a1, a3, a2
78
+ ; CHECK-NEXT: tail callee2
178
79
entry:
179
- %shl = shl i32 %a , - 2
180
- %add = add nsw i32 %shl , 42
80
+ %shl = shl i32 %a , 4
81
+ %add = add nsw i32 %shl , 45
181
82
%add1 = add nsw i32 %add , %b
182
- %add3 = add nsw i32 %add , %c
183
- %add5 = add nsw i32 %shl , %d
184
- %call = tail call i32 @callee (i32 noundef %add1 , i32 noundef %add1 , i32 noundef %add3 , i32 noundef %add5 )
83
+ %add2 = add nsw i32 %add , %c
84
+ %call = tail call i32 @callee2 (i32 %add1 , i32 %add2 )
185
85
ret void
186
86
}
187
-
188
- attributes #0 = { nounwind optsize }
0 commit comments