1 # RUN: llc -run-pass=arm-cp-islands -o - %s | FileCheck %s 2 3 # Test created by tweaking the register allocation after stopping the IR below 4 # just before constant islands. We were forwarding the table index to the end of 5 # the block, even though the LEA clobbered it. 6 7 # CHECK-LABEL: name: foo 8 # CHECK: tBR_JT 9 # This order is important. If the jump-table comes first then the 10 # transformation is valid because the LEA can be removed, see second test. 11 # CHECK: CONSTPOOL_ENTRY 12 # CHECK: JUMPTABLE_ADDRS 13 14 # CHECK-LABEL: name: bar 15 # CHECK: tTBB_JT $pc, killed $r1 16 17 --- | 18 ; ModuleID = 'simple.ll' 19 source_filename = "simple.ll" 20 target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" 21 target triple = "thumbv6m-none--eabi" 22 23 define void @foo(i8 %in, i32* %addr) { 24 store i32 12345678, i32* %addr 25 %1 = call i32 @llvm.arm.space(i32 980, i32 undef) 26 %2 = zext i8 %in to i32 27 switch i32 %2, label %default [ 28 i32 0, label %d1 29 i32 1, label %d2 30 i32 3, label %d3 31 i32 4, label %d4 32 i32 5, label %d5 33 i32 6, label %d6 34 i32 7, label %d7 35 i32 2, label %d8 36 i32 8, label %d9 37 i32 9, label %d10 38 i32 19, label %d11 39 i32 20, label %d12 40 i32 21, label %d13 41 i32 22, label %d14 42 i32 24, label %d15 43 i32 25, label %d16 44 i32 26, label %d17 45 ] 46 47 default: ; preds = %0 48 unreachable 49 50 d1: ; preds = %0 51 unreachable 52 53 d2: ; preds = %0 54 unreachable 55 56 d3: ; preds = %0 57 unreachable 58 59 d4: ; preds = %0 60 unreachable 61 62 d5: ; preds = %0 63 unreachable 64 65 d6: ; preds = %0 66 unreachable 67 68 d7: ; preds = %0 69 unreachable 70 71 d8: ; preds = %0 72 unreachable 73 74 d9: ; preds = %0 75 unreachable 76 77 d10: ; preds = %0 78 unreachable 79 80 d11: ; preds = %0 81 unreachable 82 83 d12: ; preds = %0 84 unreachable 85 86 d13: ; preds = %0 87 unreachable 88 89 d14: ; preds = %0 90 unreachable 91 92 d15: ; preds = %0 93 unreachable 94 95 d16: ; preds = %0 96 unreachable 97 98 d17: ; preds = %0 99 unreachable 100 } 101 102 define void @bar(i8 %in, i32* %addr) { 103 store i32 12345678, i32* %addr 104 %1 = zext i8 %in to i32 105 switch i32 %1, label %default [ 106 i32 0, label %d1 107 i32 1, label %d2 108 i32 3, label %d3 109 i32 4, label %d4 110 i32 5, label %d5 111 i32 6, label %d6 112 i32 7, label %d7 113 i32 2, label %d8 114 i32 8, label %d9 115 i32 9, label %d10 116 i32 19, label %d11 117 i32 20, label %d12 118 i32 21, label %d13 119 i32 22, label %d14 120 i32 24, label %d15 121 i32 25, label %d16 122 i32 26, label %d17 123 ] 124 125 default: ; preds = %0 126 unreachable 127 128 d1: ; preds = %0 129 unreachable 130 131 d2: ; preds = %0 132 unreachable 133 134 d3: ; preds = %0 135 unreachable 136 137 d4: ; preds = %0 138 unreachable 139 140 d5: ; preds = %0 141 unreachable 142 143 d6: ; preds = %0 144 unreachable 145 146 d7: ; preds = %0 147 unreachable 148 149 d8: ; preds = %0 150 unreachable 151 152 d9: ; preds = %0 153 unreachable 154 155 d10: ; preds = %0 156 unreachable 157 158 d11: ; preds = %0 159 unreachable 160 161 d12: ; preds = %0 162 unreachable 163 164 d13: ; preds = %0 165 unreachable 166 167 d14: ; preds = %0 168 unreachable 169 170 d15: ; preds = %0 171 unreachable 172 173 d16: ; preds = %0 174 unreachable 175 176 d17: ; preds = %0 177 unreachable 178 } 179 180 ; Function Attrs: nounwind 181 declare i32 @llvm.arm.space(i32, i32) #0 182 183 ; Function Attrs: nounwind 184 declare void @llvm.stackprotector(i8*, i8**) #0 185 186 attributes #0 = { nounwind } 187 188 ... 189 --- 190 name: foo 191 alignment: 1 192 exposesReturnsTwice: false 193 legalized: false 194 regBankSelected: false 195 selected: false 196 tracksRegLiveness: true 197 liveins: 198 - { reg: '$r0' } 199 - { reg: '$r1' } 200 frameInfo: 201 isFrameAddressTaken: false 202 isReturnAddressTaken: false 203 hasStackMap: false 204 hasPatchPoint: false 205 stackSize: 0 206 offsetAdjustment: 0 207 maxAlignment: 0 208 adjustsStack: false 209 hasCalls: false 210 maxCallFrameSize: 0 211 hasOpaqueSPAdjustment: false 212 hasVAStart: false 213 hasMustTailInVarArgFunc: false 214 constants: 215 - id: 0 216 value: i32 12345678 217 alignment: 4 218 jumpTable: 219 kind: inline 220 entries: 221 - id: 0 222 blocks: [ '%bb.3.d2', '%bb.9.d8', '%bb.4.d3', '%bb.5.d4', 223 '%bb.6.d5', '%bb.7.d6', '%bb.8.d7', '%bb.10.d9', 224 '%bb.11.d10', '%bb.2.d1', '%bb.2.d1', '%bb.2.d1', 225 '%bb.2.d1', '%bb.2.d1', '%bb.2.d1', '%bb.2.d1', 226 '%bb.2.d1', '%bb.2.d1', '%bb.12.d11', '%bb.13.d12', 227 '%bb.14.d13', '%bb.15.d14', '%bb.2.d1', '%bb.16.d15', 228 '%bb.17.d16', '%bb.18.d17' ] 229 body: | 230 bb.0 (%ir-block.0): 231 successors: %bb.2.d1(0x03c3c3c4), %bb.1(0x7c3c3c3c) 232 liveins: $r0, $r1 233 234 $r2 = tLDRpci %const.0, 14, $noreg 235 tSTRi killed $r2, killed $r1, 0, 14, $noreg :: (store 4 into %ir.addr) 236 dead $r1 = SPACE 980, undef $r0 237 $r0 = tUXTB killed $r0, 14, $noreg 238 $r1, dead $cpsr = tSUBi3 killed $r0, 1, 14, $noreg 239 tCMPi8 $r1, 25, 14, $noreg, implicit-def $cpsr 240 tBcc %bb.2.d1, 8, killed $cpsr 241 242 bb.1 (%ir-block.0): 243 successors: %bb.3.d2(0x07c549d2), %bb.9.d8(0x07c549d2), %bb.4.d3(0x07c549d2), %bb.5.d4(0x07c549d2), %bb.6.d5(0x07c549d2), %bb.7.d6(0x07c549d2), %bb.8.d7(0x07c549d2), %bb.10.d9(0x07c549d2), %bb.11.d10(0x07c549d2), %bb.2.d1(0x03ab62db), %bb.12.d11(0x07c549d2), %bb.13.d12(0x07c549d2), %bb.14.d13(0x07c549d2), %bb.15.d14(0x07c549d2), %bb.16.d15(0x07c549d2), %bb.17.d16(0x07c549d2), %bb.18.d17(0x07c549d2) 244 liveins: $r1 245 246 $r0, dead $cpsr = tLSLri killed $r1, 2, 14, $noreg 247 $r1 = tLEApcrelJT %jump-table.0, 14, $noreg 248 $r0 = tLDRr killed $r1, killed $r0, 14, $noreg :: (load 4 from jump-table) 249 tBR_JTr killed $r0, %jump-table.0 250 251 bb.3.d2: 252 253 bb.9.d8: 254 255 bb.4.d3: 256 257 bb.5.d4: 258 259 bb.6.d5: 260 261 bb.7.d6: 262 263 bb.8.d7: 264 265 bb.10.d9: 266 267 bb.11.d10: 268 269 bb.2.d1: 270 271 bb.12.d11: 272 273 bb.13.d12: 274 275 bb.14.d13: 276 277 bb.15.d14: 278 279 bb.16.d15: 280 281 bb.17.d16: 282 283 bb.18.d17: 284 285 ... 286 287 --- 288 name: bar 289 alignment: 1 290 exposesReturnsTwice: false 291 legalized: false 292 regBankSelected: false 293 selected: false 294 tracksRegLiveness: true 295 liveins: 296 - { reg: '$r0' } 297 - { reg: '$r1' } 298 frameInfo: 299 isFrameAddressTaken: false 300 isReturnAddressTaken: false 301 hasStackMap: false 302 hasPatchPoint: false 303 stackSize: 0 304 offsetAdjustment: 0 305 maxAlignment: 0 306 adjustsStack: false 307 hasCalls: false 308 maxCallFrameSize: 0 309 hasOpaqueSPAdjustment: false 310 hasVAStart: false 311 hasMustTailInVarArgFunc: false 312 constants: 313 - id: 0 314 value: i32 12345678 315 alignment: 4 316 jumpTable: 317 kind: inline 318 entries: 319 - id: 0 320 blocks: [ '%bb.3.d2', '%bb.9.d8', '%bb.4.d3', '%bb.5.d4', 321 '%bb.6.d5', '%bb.7.d6', '%bb.8.d7', '%bb.10.d9', 322 '%bb.11.d10', '%bb.2.d1', '%bb.2.d1', '%bb.2.d1', 323 '%bb.2.d1', '%bb.2.d1', '%bb.2.d1', '%bb.2.d1', 324 '%bb.2.d1', '%bb.2.d1', '%bb.12.d11', '%bb.13.d12', 325 '%bb.14.d13', '%bb.15.d14', '%bb.2.d1', '%bb.16.d15', 326 '%bb.17.d16', '%bb.18.d17' ] 327 body: | 328 bb.0 (%ir-block.0): 329 successors: %bb.2.d1(0x03c3c3c4), %bb.1(0x7c3c3c3c) 330 liveins: $r0, $r1 331 332 $r2 = tLDRpci %const.0, 14, $noreg 333 tSTRi killed $r2, killed $r1, 0, 14, $noreg :: (store 4 into %ir.addr) 334 $r0 = tUXTB killed $r0, 14, $noreg 335 $r1, dead $cpsr = tSUBi3 killed $r0, 1, 14, $noreg 336 tCMPi8 $r1, 25, 14, $noreg, implicit-def $cpsr 337 tBcc %bb.2.d1, 8, killed $cpsr 338 339 bb.1 (%ir-block.0): 340 successors: %bb.3.d2(0x07c549d2), %bb.9.d8(0x07c549d2), %bb.4.d3(0x07c549d2), %bb.5.d4(0x07c549d2), %bb.6.d5(0x07c549d2), %bb.7.d6(0x07c549d2), %bb.8.d7(0x07c549d2), %bb.10.d9(0x07c549d2), %bb.11.d10(0x07c549d2), %bb.2.d1(0x03ab62db), %bb.12.d11(0x07c549d2), %bb.13.d12(0x07c549d2), %bb.14.d13(0x07c549d2), %bb.15.d14(0x07c549d2), %bb.16.d15(0x07c549d2), %bb.17.d16(0x07c549d2), %bb.18.d17(0x07c549d2) 341 liveins: $r1 342 343 $r0, dead $cpsr = tLSLri killed $r1, 2, 14, $noreg 344 $r1 = tLEApcrelJT %jump-table.0, 14, $noreg 345 $r0 = tLDRr killed $r1, killed $r0, 14, $noreg :: (load 4 from jump-table) 346 tBR_JTr killed $r0, %jump-table.0 347 348 bb.3.d2: 349 350 bb.9.d8: 351 352 bb.4.d3: 353 354 bb.5.d4: 355 356 bb.6.d5: 357 358 bb.7.d6: 359 360 bb.8.d7: 361 362 bb.10.d9: 363 364 bb.11.d10: 365 366 bb.2.d1: 367 368 bb.12.d11: 369 370 bb.13.d12: 371 372 bb.14.d13: 373 374 bb.15.d14: 375 376 bb.16.d15: 377 378 bb.17.d16: 379 380 bb.18.d17: 381 382 ... 383