1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2# RUN: llc -o - %s -mtriple=riscv64 -mattr=+c -simplify-mir \ 3# RUN: -run-pass=riscv-make-compressible | FileCheck %s 4--- | 5 6 define void @store_common_value(ptr %a, ptr %b, ptr %c) #0 { 7 entry: 8 store i64 0, ptr %a, align 8 9 store i64 0, ptr %b, align 8 10 store i64 0, ptr %c, align 8 11 ret void 12 } 13 14 define void @store_common_ptr(i64 %a, i64 %b, i64 %c, i64 %d, i64 %e, i64 %f, ptr %p) #0 { 15 entry: 16 store volatile i64 1, ptr %p, align 8 17 store volatile i64 3, ptr %p, align 8 18 store volatile i64 5, ptr %p, align 8 19 ret void 20 } 21 22 define void @store_common_ptr_self(i64 %a, i64 %b, i64 %c, i64 %d, i64 %e, i64 %f, ptr %p) #0 { 23 entry: 24 %q = bitcast ptr %p to ptr 25 store volatile i64 1, ptr %p, align 8 26 store volatile i64 3, ptr %p, align 8 27 store volatile ptr %p, ptr %q, align 8 28 ret void 29 } 30 31 define void @load_common_ptr(i64 %a, i64 %b, i64 %c, i64 %d, i64 %e, i64 %f, ptr %p) #0 { 32 entry: 33 %g = load volatile i64, ptr %p, align 8 34 %h = load volatile i64, ptr %p, align 8 35 %i = load volatile i64, ptr %p, align 8 36 ret void 37 } 38 39 define void @store_large_offset(ptr %p) #0 { 40 entry: 41 %0 = getelementptr inbounds i64, ptr %p, i64 100 42 store volatile i64 1, ptr %0, align 8 43 %1 = getelementptr inbounds i64, ptr %p, i64 101 44 store volatile i64 3, ptr %1, align 8 45 %2 = getelementptr inbounds i64, ptr %p, i64 102 46 store volatile i64 5, ptr %2, align 8 47 %3 = getelementptr inbounds i64, ptr %p, i64 103 48 store volatile i64 7, ptr %3, align 8 49 ret void 50 } 51 52 define void @load_large_offset(ptr %p) #0 { 53 entry: 54 %0 = getelementptr inbounds i64, ptr %p, i64 100 55 %a = load volatile i64, ptr %0, align 8 56 %1 = getelementptr inbounds i64, ptr %p, i64 101 57 %b = load volatile i64, ptr %1, align 8 58 %2 = getelementptr inbounds i64, ptr %p, i64 102 59 %c = load volatile i64, ptr %2, align 8 60 %3 = getelementptr inbounds i64, ptr %p, i64 103 61 %d = load volatile i64, ptr %3, align 8 62 ret void 63 } 64 65 define void @store_common_value_no_opt(ptr %a) #0 { 66 entry: 67 store i64 0, ptr %a, align 8 68 ret void 69 } 70 71 define void @store_common_ptr_no_opt(i64 %a, i64 %b, i64 %c, i64 %d, i64 %e, i64 %f, ptr %p) #0 { 72 entry: 73 store volatile i64 1, ptr %p, align 8 74 ret void 75 } 76 77 define void @load_common_ptr_no_opt(i64 %a, i64 %b, i64 %c, i64 %d, i64 %e, i64 %f, ptr %p) #0 { 78 entry: 79 %g = load volatile i64, ptr %p, align 8 80 ret void 81 } 82 83 define void @store_large_offset_no_opt(ptr %p) #0 { 84 entry: 85 %0 = getelementptr inbounds i64, ptr %p, i64 100 86 store volatile i64 1, ptr %0, align 8 87 %1 = getelementptr inbounds i64, ptr %p, i64 101 88 store volatile i64 3, ptr %1, align 8 89 ret void 90 } 91 92 define void @load_large_offset_no_opt(ptr %p) #0 { 93 entry: 94 %0 = getelementptr inbounds i64, ptr %p, i64 100 95 %a = load volatile i64, ptr %0, align 8 96 %1 = getelementptr inbounds i64, ptr %p, i64 101 97 %b = load volatile i64, ptr %1, align 8 98 ret void 99 } 100 101 attributes #0 = { minsize "target-features"="+c" } 102 103... 104--- 105name: store_common_value 106tracksRegLiveness: true 107body: | 108 bb.0.entry: 109 liveins: $x10, $x11, $x12 110 111 ; CHECK-LABEL: name: store_common_value 112 ; CHECK: liveins: $x10, $x11, $x12 113 ; CHECK-NEXT: {{ $}} 114 ; CHECK-NEXT: $x13 = ADDI $x0, 0 115 ; CHECK-NEXT: SD $x13, killed renamable $x10, 0 :: (store (s64) into %ir.a) 116 ; CHECK-NEXT: SD $x13, killed renamable $x11, 0 :: (store (s64) into %ir.b) 117 ; CHECK-NEXT: SD $x13, killed renamable $x12, 0 :: (store (s64) into %ir.c) 118 ; CHECK-NEXT: PseudoRET 119 SD $x0, killed renamable $x10, 0 :: (store (s64) into %ir.a) 120 SD $x0, killed renamable $x11, 0 :: (store (s64) into %ir.b) 121 SD $x0, killed renamable $x12, 0 :: (store (s64) into %ir.c) 122 PseudoRET 123 124... 125--- 126name: store_common_ptr 127tracksRegLiveness: true 128body: | 129 bb.0.entry: 130 liveins: $x16 131 132 ; CHECK-LABEL: name: store_common_ptr 133 ; CHECK: liveins: $x16 134 ; CHECK-NEXT: {{ $}} 135 ; CHECK-NEXT: renamable $x10 = ADDI $x0, 1 136 ; CHECK-NEXT: $x11 = ADDI $x16, 0 137 ; CHECK-NEXT: SD killed renamable $x10, $x11, 0 :: (volatile store (s64) into %ir.p) 138 ; CHECK-NEXT: renamable $x10 = ADDI $x0, 3 139 ; CHECK-NEXT: SD killed renamable $x10, $x11, 0 :: (volatile store (s64) into %ir.p) 140 ; CHECK-NEXT: renamable $x10 = ADDI $x0, 5 141 ; CHECK-NEXT: SD killed renamable $x10, killed $x11, 0 :: (volatile store (s64) into %ir.p) 142 ; CHECK-NEXT: PseudoRET 143 renamable $x10 = ADDI $x0, 1 144 SD killed renamable $x10, renamable $x16, 0 :: (volatile store (s64) into %ir.p) 145 renamable $x10 = ADDI $x0, 3 146 SD killed renamable $x10, renamable $x16, 0 :: (volatile store (s64) into %ir.p) 147 renamable $x10 = ADDI $x0, 5 148 SD killed renamable $x10, killed renamable $x16, 0 :: (volatile store (s64) into %ir.p) 149 PseudoRET 150 151... 152--- 153name: store_common_ptr_self 154tracksRegLiveness: true 155body: | 156 bb.0.entry: 157 liveins: $x16 158 159 ; CHECK-LABEL: name: store_common_ptr_self 160 ; CHECK: liveins: $x16 161 ; CHECK-NEXT: {{ $}} 162 ; CHECK-NEXT: renamable $x10 = ADDI $x0, 1 163 ; CHECK-NEXT: $x11 = ADDI $x16, 0 164 ; CHECK-NEXT: SD killed renamable $x10, $x11, 0 :: (volatile store (s64) into %ir.p) 165 ; CHECK-NEXT: renamable $x10 = ADDI $x0, 3 166 ; CHECK-NEXT: SD killed renamable $x10, $x11, 0 :: (volatile store (s64) into %ir.p) 167 ; CHECK-NEXT: SD killed $x11, $x11, 0 :: (volatile store (s64) into %ir.q) 168 ; CHECK-NEXT: PseudoRET 169 renamable $x10 = ADDI $x0, 1 170 SD killed renamable $x10, renamable $x16, 0 :: (volatile store (s64) into %ir.p) 171 renamable $x10 = ADDI $x0, 3 172 SD killed renamable $x10, renamable $x16, 0 :: (volatile store (s64) into %ir.p) 173 SD killed renamable $x16, renamable $x16, 0 :: (volatile store (s64) into %ir.q) 174 PseudoRET 175 176... 177--- 178name: load_common_ptr 179tracksRegLiveness: true 180body: | 181 bb.0.entry: 182 liveins: $x16 183 184 ; CHECK-LABEL: name: load_common_ptr 185 ; CHECK: liveins: $x16 186 ; CHECK-NEXT: {{ $}} 187 ; CHECK-NEXT: $x11 = ADDI $x16, 0 188 ; CHECK-NEXT: dead renamable $x10 = LD $x11, 0 :: (volatile load (s64) from %ir.p) 189 ; CHECK-NEXT: dead renamable $x10 = LD $x11, 0 :: (volatile load (s64) from %ir.p) 190 ; CHECK-NEXT: dead renamable $x10 = LD killed $x11, 0 :: (volatile load (s64) from %ir.p) 191 ; CHECK-NEXT: PseudoRET 192 dead renamable $x10 = LD renamable $x16, 0 :: (volatile load (s64) from %ir.p) 193 dead renamable $x10 = LD renamable $x16, 0 :: (volatile load (s64) from %ir.p) 194 dead renamable $x10 = LD killed renamable $x16, 0 :: (volatile load (s64) from %ir.p) 195 PseudoRET 196 197... 198--- 199name: store_large_offset 200tracksRegLiveness: true 201body: | 202 bb.0.entry: 203 liveins: $x10 204 205 ; CHECK-LABEL: name: store_large_offset 206 ; CHECK: liveins: $x10 207 ; CHECK-NEXT: {{ $}} 208 ; CHECK-NEXT: renamable $x11 = ADDI $x0, 1 209 ; CHECK-NEXT: $x12 = ADDI $x10, 768 210 ; CHECK-NEXT: SD killed renamable $x11, $x12, 32 :: (volatile store (s64) into %ir.0) 211 ; CHECK-NEXT: renamable $x11 = ADDI $x0, 3 212 ; CHECK-NEXT: SD killed renamable $x11, $x12, 40 :: (volatile store (s64) into %ir.1) 213 ; CHECK-NEXT: renamable $x11 = ADDI $x0, 5 214 ; CHECK-NEXT: SD killed renamable $x11, $x12, 48 :: (volatile store (s64) into %ir.2) 215 ; CHECK-NEXT: renamable $x11 = ADDI $x0, 7 216 ; CHECK-NEXT: SD killed renamable $x11, killed $x12, 56 :: (volatile store (s64) into %ir.3) 217 ; CHECK-NEXT: PseudoRET 218 renamable $x11 = ADDI $x0, 1 219 SD killed renamable $x11, renamable $x10, 800 :: (volatile store (s64) into %ir.0) 220 renamable $x11 = ADDI $x0, 3 221 SD killed renamable $x11, renamable $x10, 808 :: (volatile store (s64) into %ir.1) 222 renamable $x11 = ADDI $x0, 5 223 SD killed renamable $x11, renamable $x10, 816 :: (volatile store (s64) into %ir.2) 224 renamable $x11 = ADDI $x0, 7 225 SD killed renamable $x11, killed renamable $x10, 824 :: (volatile store (s64) into %ir.3) 226 PseudoRET 227 228... 229--- 230name: load_large_offset 231tracksRegLiveness: true 232body: | 233 bb.0.entry: 234 liveins: $x10 235 236 ; CHECK-LABEL: name: load_large_offset 237 ; CHECK: liveins: $x10 238 ; CHECK-NEXT: {{ $}} 239 ; CHECK-NEXT: $x12 = ADDI $x10, 768 240 ; CHECK-NEXT: dead renamable $x11 = LD $x12, 32 :: (volatile load (s64) from %ir.0) 241 ; CHECK-NEXT: dead renamable $x11 = LD $x12, 40 :: (volatile load (s64) from %ir.1) 242 ; CHECK-NEXT: dead renamable $x11 = LD $x12, 48 :: (volatile load (s64) from %ir.2) 243 ; CHECK-NEXT: dead renamable $x10 = LD killed $x12, 56 :: (volatile load (s64) from %ir.3) 244 ; CHECK-NEXT: PseudoRET 245 dead renamable $x11 = LD renamable $x10, 800 :: (volatile load (s64) from %ir.0) 246 dead renamable $x11 = LD renamable $x10, 808 :: (volatile load (s64) from %ir.1) 247 dead renamable $x11 = LD renamable $x10, 816 :: (volatile load (s64) from %ir.2) 248 dead renamable $x10 = LD killed renamable $x10, 824 :: (volatile load (s64) from %ir.3) 249 PseudoRET 250 251... 252--- 253name: store_common_value_no_opt 254tracksRegLiveness: true 255body: | 256 bb.0.entry: 257 liveins: $x10 258 259 ; CHECK-LABEL: name: store_common_value_no_opt 260 ; CHECK: liveins: $x10 261 ; CHECK-NEXT: {{ $}} 262 ; CHECK-NEXT: SD $x0, killed renamable $x10, 0 :: (store (s64) into %ir.a) 263 ; CHECK-NEXT: PseudoRET 264 SD $x0, killed renamable $x10, 0 :: (store (s64) into %ir.a) 265 PseudoRET 266 267... 268--- 269name: store_common_ptr_no_opt 270tracksRegLiveness: true 271body: | 272 bb.0.entry: 273 liveins: $x16 274 275 ; CHECK-LABEL: name: store_common_ptr_no_opt 276 ; CHECK: liveins: $x16 277 ; CHECK-NEXT: {{ $}} 278 ; CHECK-NEXT: renamable $x10 = ADDI $x0, 1 279 ; CHECK-NEXT: SD killed renamable $x10, killed renamable $x16, 0 :: (volatile store (s64) into %ir.p) 280 ; CHECK-NEXT: PseudoRET 281 renamable $x10 = ADDI $x0, 1 282 SD killed renamable $x10, killed renamable $x16, 0 :: (volatile store (s64) into %ir.p) 283 PseudoRET 284 285... 286--- 287name: load_common_ptr_no_opt 288tracksRegLiveness: true 289body: | 290 bb.0.entry: 291 liveins: $x16 292 293 ; CHECK-LABEL: name: load_common_ptr_no_opt 294 ; CHECK: liveins: $x16 295 ; CHECK-NEXT: {{ $}} 296 ; CHECK-NEXT: dead renamable $x10 = LD killed renamable $x16, 0 :: (volatile load (s64) from %ir.p) 297 ; CHECK-NEXT: PseudoRET 298 dead renamable $x10 = LD killed renamable $x16, 0 :: (volatile load (s64) from %ir.p) 299 PseudoRET 300 301... 302--- 303name: store_large_offset_no_opt 304tracksRegLiveness: true 305body: | 306 bb.0.entry: 307 liveins: $x10 308 309 ; CHECK-LABEL: name: store_large_offset_no_opt 310 ; CHECK: liveins: $x10 311 ; CHECK-NEXT: {{ $}} 312 ; CHECK-NEXT: renamable $x11 = ADDI $x0, 1 313 ; CHECK-NEXT: SD killed renamable $x11, renamable $x10, 800 :: (volatile store (s64) into %ir.0) 314 ; CHECK-NEXT: renamable $x11 = ADDI $x0, 3 315 ; CHECK-NEXT: SD killed renamable $x11, killed renamable $x10, 808 :: (volatile store (s64) into %ir.1) 316 ; CHECK-NEXT: PseudoRET 317 renamable $x11 = ADDI $x0, 1 318 SD killed renamable $x11, renamable $x10, 800 :: (volatile store (s64) into %ir.0) 319 renamable $x11 = ADDI $x0, 3 320 SD killed renamable $x11, killed renamable $x10, 808 :: (volatile store (s64) into %ir.1) 321 PseudoRET 322 323... 324--- 325name: load_large_offset_no_opt 326tracksRegLiveness: true 327body: | 328 bb.0.entry: 329 liveins: $x10 330 331 ; CHECK-LABEL: name: load_large_offset_no_opt 332 ; CHECK: liveins: $x10 333 ; CHECK-NEXT: {{ $}} 334 ; CHECK-NEXT: dead renamable $x11 = LD renamable $x10, 800 :: (volatile load (s64) from %ir.0) 335 ; CHECK-NEXT: dead renamable $x10 = LD killed renamable $x10, 808 :: (volatile load (s64) from %ir.1) 336 ; CHECK-NEXT: PseudoRET 337 dead renamable $x11 = LD renamable $x10, 800 :: (volatile load (s64) from %ir.0) 338 dead renamable $x10 = LD killed renamable $x10, 808 :: (volatile load (s64) from %ir.1) 339 PseudoRET 340 341... 342