1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -o - %s -mtriple=riscv32 -mattr=+zcb,+zhinx -simplify-mir \
3 # RUN: -run-pass=riscv-make-compressible | FileCheck --check-prefixes=CHECK %s
4 # RUN: llc -o - %s -mtriple=riscv64 -mattr=+zcb,+zhinx -simplify-mir \
5 # RUN: -run-pass=riscv-make-compressible | FileCheck --check-prefixes=CHECK %s
8 define void @store_common_value_half(ptr %a, ptr %b, ptr %c) #0 {
10 store half 0.0, ptr %a, align 2
11 store half 0.0, ptr %b, align 2
12 store half 0.0, ptr %c, align 2
16 define void @store_common_ptr_half(ptr %p) #0 {
18 store volatile half 2.0, ptr %p, align 2
19 store volatile half 32.0, ptr %p, align 2
20 store volatile half 512.0, ptr %p, align 2
24 define void @load_common_ptr_half(ptr %p) #0 {
26 %0 = load volatile half, ptr %p, align 2
27 %1 = load volatile half, ptr %p, align 2
28 %2 = load volatile half, ptr %p, align 2
32 define void @store_large_offset_half(ptr %p) #0 {
34 %0 = getelementptr inbounds half, ptr %p, i32 100
35 store volatile half 2.0, ptr %0, align 2
36 %1 = getelementptr inbounds half, ptr %p, i32 101
37 store volatile half 32.0, ptr %1, align 2
38 %2 = getelementptr inbounds half, ptr %p, i32 102
39 store volatile half 512.0, ptr %2, align 2
40 %3 = getelementptr inbounds half, ptr %p, i32 103
41 store volatile half 16384.0, ptr %3, align 2
45 define void @load_large_offset_half(ptr %p) #0 {
47 %0 = getelementptr inbounds half, ptr %p, i32 100
48 %a = load volatile half, ptr %0, align 2
49 %1 = getelementptr inbounds half, ptr %p, i32 100
50 %b = load volatile half, ptr %1, align 2
51 %2 = getelementptr inbounds half, ptr %p, i32 101
52 %c = load volatile half, ptr %2, align 2
53 %3 = getelementptr inbounds half, ptr %p, i32 101
54 %d = load volatile half, ptr %3, align 2
58 define void @store_large_offset_no_opt_half(ptr %p) #0 {
60 %0 = getelementptr inbounds i8, ptr %p, i8 100
61 store volatile half 2.0, ptr %0, align 2
62 %1 = getelementptr inbounds i8, ptr %p, i8 101
63 store volatile half 32.0, ptr %1, align 2
64 %2 = getelementptr inbounds i8, ptr %p, i8 104
65 store volatile half 512.0, ptr %2, align 2
69 define void @load_large_offset_no_opt_half(ptr %p) #0 {
71 %0 = getelementptr inbounds half, ptr %p, i32 100
72 %a = load volatile half, ptr %0, align 2
73 %1 = getelementptr inbounds half, ptr %p, i32 101
74 %c = load volatile half, ptr %1, align 2
75 %2 = getelementptr inbounds half, ptr %p, i32 102
76 %d = load volatile half, ptr %2, align 2
80 attributes #0 = { minsize }
84 name: store_common_value_half
85 tracksRegLiveness: true
88 liveins: $x10, $x11, $x12
90 ; CHECK-LABEL: name: store_common_value_half
91 ; CHECK: liveins: $x10, $x11, $x12
93 ; CHECK-NEXT: $x13_h = PseudoMV_FPR16INX $x0_h
94 ; CHECK-NEXT: SH_INX $x13_h, killed renamable $x10, 0 :: (store (s16) into %ir.a)
95 ; CHECK-NEXT: SH_INX $x13_h, killed renamable $x11, 0 :: (store (s16) into %ir.b)
96 ; CHECK-NEXT: SH_INX $x13_h, killed renamable $x12, 0 :: (store (s16) into %ir.c)
97 ; CHECK-NEXT: PseudoRET
98 SH_INX $x0_h, killed renamable $x10, 0 :: (store (s16) into %ir.a)
99 SH_INX $x0_h, killed renamable $x11, 0 :: (store (s16) into %ir.b)
100 SH_INX $x0_h, killed renamable $x12, 0 :: (store (s16) into %ir.c)
105 name: store_common_ptr_half
106 tracksRegLiveness: true
111 ; CHECK-LABEL: name: store_common_ptr_half
112 ; CHECK: liveins: $x16
114 ; CHECK-NEXT: renamable $x10 = LUI 4
115 ; CHECK-NEXT: $x11 = ADDI $x16, 0
116 ; CHECK-NEXT: SH_INX killed renamable $x10_h, $x11, 0 :: (volatile store (s16) into %ir.p)
117 ; CHECK-NEXT: renamable $x10 = LUI 5
118 ; CHECK-NEXT: SH_INX killed renamable $x10_h, $x11, 0 :: (volatile store (s16) into %ir.p)
119 ; CHECK-NEXT: renamable $x10 = LUI 6
120 ; CHECK-NEXT: SH_INX killed renamable $x10_h, killed $x11, 0 :: (volatile store (s16) into %ir.p)
121 ; CHECK-NEXT: PseudoRET
122 renamable $x10 = LUI 4
123 SH_INX killed renamable $x10_h, renamable $x16, 0 :: (volatile store (s16) into %ir.p)
124 renamable $x10 = LUI 5
125 SH_INX killed renamable $x10_h, renamable $x16, 0 :: (volatile store (s16) into %ir.p)
126 renamable $x10 = LUI 6
127 SH_INX killed renamable $x10_h, killed renamable $x16, 0 :: (volatile store (s16) into %ir.p)
132 name: load_common_ptr_half
137 ; CHECK-LABEL: name: load_common_ptr_half
138 ; CHECK: liveins: $x16
140 ; CHECK-NEXT: $x11 = ADDI $x16, 0
141 ; CHECK-NEXT: dead $x10_h = LH_INX $x11, 0 :: (volatile load (s16) from %ir.p)
142 ; CHECK-NEXT: dead $x10_h = LH_INX $x11, 0 :: (volatile load (s16) from %ir.p)
143 ; CHECK-NEXT: dead $x10_h = LH_INX killed $x11, 0 :: (volatile load (s16) from %ir.p)
144 ; CHECK-NEXT: PseudoRET
145 dead $x10_h = LH_INX renamable $x16, 0 :: (volatile load (s16) from %ir.p)
146 dead $x10_h = LH_INX renamable $x16, 0 :: (volatile load (s16) from %ir.p)
147 dead $x10_h = LH_INX killed renamable $x16, 0 :: (volatile load (s16) from %ir.p)
152 name: store_large_offset_half
153 tracksRegLiveness: true
157 ; CHECK-LABEL: name: store_large_offset_half
158 ; CHECK: liveins: $x10
160 ; CHECK-NEXT: renamable $x11 = LUI 4
161 ; CHECK-NEXT: $x12 = ADDI $x10, 200
162 ; CHECK-NEXT: SH_INX killed renamable $x11_h, $x12, 0 :: (volatile store (s16) into %ir.0)
163 ; CHECK-NEXT: renamable $x11 = LUI 5
164 ; CHECK-NEXT: SH_INX killed renamable $x11_h, $x12, 0 :: (volatile store (s16) into %ir.1)
165 ; CHECK-NEXT: renamable $x11 = LUI 6
166 ; CHECK-NEXT: SH_INX killed renamable $x11_h, $x12, 2 :: (volatile store (s16) into %ir.2)
167 ; CHECK-NEXT: renamable $x11 = LUI 7
168 ; CHECK-NEXT: SH_INX killed renamable $x11_h, killed $x12, 2 :: (volatile store (s16) into %ir.3)
169 ; CHECK-NEXT: PseudoRET
170 renamable $x11 = LUI 4
171 SH_INX killed renamable $x11_h, renamable $x10, 200 :: (volatile store (s16) into %ir.0)
172 renamable $x11 = LUI 5
173 SH_INX killed renamable $x11_h, renamable $x10, 200 :: (volatile store (s16) into %ir.1)
174 renamable $x11 = LUI 6
175 SH_INX killed renamable $x11_h, renamable $x10, 202 :: (volatile store (s16) into %ir.2)
176 renamable $x11 = LUI 7
177 SH_INX killed renamable $x11_h, killed renamable $x10, 202 :: (volatile store (s16) into %ir.3)
182 name: load_large_offset_half
183 tracksRegLiveness: true
188 ; CHECK-LABEL: name: load_large_offset_half
189 ; CHECK: liveins: $x16
191 ; CHECK-NEXT: $x11 = ADDI $x16, 100
192 ; CHECK-NEXT: dead $x10_h = LH_INX $x11, 0 :: (volatile load (s16) from %ir.0)
193 ; CHECK-NEXT: dead $x10_h = LH_INX $x11, 0 :: (volatile load (s16) from %ir.1)
194 ; CHECK-NEXT: dead $x10_h = LH_INX $x11, 2 :: (volatile load (s16) from %ir.2)
195 ; CHECK-NEXT: dead $x10_h = LH_INX killed $x11, 2 :: (volatile load (s16) from %ir.3)
196 ; CHECK-NEXT: PseudoRET
197 dead $x10_h = LH_INX renamable $x16, 100 :: (volatile load (s16) from %ir.0)
198 dead $x10_h = LH_INX renamable $x16, 100 :: (volatile load (s16) from %ir.1)
199 dead $x10_h = LH_INX renamable $x16, 102 :: (volatile load (s16) from %ir.2)
200 dead $x10_h = LH_INX killed renamable $x16, 102 :: (volatile load (s16) from %ir.3)
205 name: store_large_offset_no_opt_half
206 tracksRegLiveness: true
211 ; CHECK-LABEL: name: store_large_offset_no_opt_half
212 ; CHECK: liveins: $x16
214 ; CHECK-NEXT: renamable $x11 = LUI 4
215 ; CHECK-NEXT: SH_INX killed renamable $x11_h, renamable $x16, 200 :: (volatile store (s16) into %ir.0)
216 ; CHECK-NEXT: renamable $x11 = LUI 5
217 ; CHECK-NEXT: SH_INX killed renamable $x11_h, renamable $x16, 202 :: (volatile store (s16) into %ir.1)
218 ; CHECK-NEXT: renamable $x11 = LUI 6
219 ; CHECK-NEXT: SH_INX killed renamable $x11_h, renamable $x16, 204 :: (volatile store (s16) into %ir.2)
220 ; CHECK-NEXT: PseudoRET
221 renamable $x11 = LUI 4
222 SH_INX killed renamable $x11_h, renamable $x16, 200 :: (volatile store (s16) into %ir.0)
223 renamable $x11 = LUI 5
224 SH_INX killed renamable $x11_h, renamable $x16, 202 :: (volatile store (s16) into %ir.1)
225 renamable $x11 = LUI 6
226 SH_INX killed renamable $x11_h, renamable $x16, 204 :: (volatile store (s16) into %ir.2)
231 name: load_large_offset_no_opt_half
232 tracksRegLiveness: true
237 ; CHECK-LABEL: name: load_large_offset_no_opt_half
238 ; CHECK: liveins: $x16
240 ; CHECK-NEXT: dead $x10_h = LH_INX renamable $x16, 100 :: (volatile load (s8) from %ir.0)
241 ; CHECK-NEXT: dead $x10_h = LH_INX renamable $x16, 102 :: (volatile load (s8) from %ir.1)
242 ; CHECK-NEXT: dead $x10_h = LH_INX killed renamable $x16, 104 :: (volatile load (s8) from %ir.2)
243 ; CHECK-NEXT: PseudoRET
244 dead $x10_h = LH_INX renamable $x16, 100 :: (volatile load (s8) from %ir.0)
245 dead $x10_h = LH_INX renamable $x16, 102 :: (volatile load (s8) from %ir.1)
246 dead $x10_h = LH_INX killed renamable $x16, 104 :: (volatile load (s8) from %ir.2)