11; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
22; RUN: llc -mtriple=riscv32-unknown-elf -mattr=+zba %s -o - | FileCheck %s
33
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 )
76
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 ) {
910; CHECK-LABEL: t1:
1011; 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
8512; CHECK-NEXT: sh2add a2, a0, a2
8613; CHECK-NEXT: sh2add a0, a0, a1
8714; CHECK-NEXT: addi a0, a0, 42
@@ -92,97 +19,68 @@ entry:
9219 %add = add nsw i32 %shl , 42
9320 %add1 = add nsw i32 %add , %b
9421 %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 )
11323 ret void
11424}
11525
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:
11830; CHECK: # %bb.0: # %entry
11931; 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
12537entry:
12638 %shl = shl i32 %a , 2
12739 %add = add nsw i32 %shl , 42
12840 %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 )
15144 ret void
15245}
15346
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:
15651; CHECK: # %bb.0: # %entry
15752; 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
16459entry:
16560 %shl = shl i32 %a , 2
166- %add = add nsw i32 %shl , - 42
61+ %add = add nsw i32 %shl , 45
16762 %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 )
17166 ret void
17267}
17368
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:
17673; 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
17879entry:
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
18182 %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 )
18585 ret void
18686}
187-
188- attributes #0 = { nounwind optsize }
0 commit comments