| # RUN: llc -run-pass=arm-cp-islands -o - %s | FileCheck %s |
| |
| # Test created by tweaking the register allocation after stopping the IR below |
| # just before constant islands. We were forwarding the table index to the end of |
| # the block, even though the LEA clobbered it. |
| |
| # CHECK-LABEL: name: foo |
| # CHECK: tBR_JT |
| # This order is important. If the jump-table comes first then the |
| # transformation is valid because the LEA can be removed, see second test. |
| # CHECK: CONSTPOOL_ENTRY |
| # CHECK: JUMPTABLE_ADDRS |
| |
| # CHECK-LABEL: name: bar |
| # CHECK: tTBB_JT $pc, killed $r1 |
| |
| --- | |
| ; ModuleID = 'simple.ll' |
| source_filename = "simple.ll" |
| target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64" |
| target triple = "thumbv6m-none--eabi" |
| |
| define void @foo(i8 %in, i32* %addr) { |
| store i32 12345678, i32* %addr |
| %1 = call i32 @llvm.arm.space(i32 980, i32 undef) |
| %2 = zext i8 %in to i32 |
| switch i32 %2, label %default [ |
| i32 0, label %d1 |
| i32 1, label %d2 |
| i32 3, label %d3 |
| i32 4, label %d4 |
| i32 5, label %d5 |
| i32 6, label %d6 |
| i32 7, label %d7 |
| i32 2, label %d8 |
| i32 8, label %d9 |
| i32 9, label %d10 |
| i32 19, label %d11 |
| i32 20, label %d12 |
| i32 21, label %d13 |
| i32 22, label %d14 |
| i32 24, label %d15 |
| i32 25, label %d16 |
| i32 26, label %d17 |
| ] |
| |
| default: ; preds = %0 |
| unreachable |
| |
| d1: ; preds = %0 |
| unreachable |
| |
| d2: ; preds = %0 |
| unreachable |
| |
| d3: ; preds = %0 |
| unreachable |
| |
| d4: ; preds = %0 |
| unreachable |
| |
| d5: ; preds = %0 |
| unreachable |
| |
| d6: ; preds = %0 |
| unreachable |
| |
| d7: ; preds = %0 |
| unreachable |
| |
| d8: ; preds = %0 |
| unreachable |
| |
| d9: ; preds = %0 |
| unreachable |
| |
| d10: ; preds = %0 |
| unreachable |
| |
| d11: ; preds = %0 |
| unreachable |
| |
| d12: ; preds = %0 |
| unreachable |
| |
| d13: ; preds = %0 |
| unreachable |
| |
| d14: ; preds = %0 |
| unreachable |
| |
| d15: ; preds = %0 |
| unreachable |
| |
| d16: ; preds = %0 |
| unreachable |
| |
| d17: ; preds = %0 |
| unreachable |
| } |
| |
| define void @bar(i8 %in, i32* %addr) { |
| store i32 12345678, i32* %addr |
| %1 = zext i8 %in to i32 |
| switch i32 %1, label %default [ |
| i32 0, label %d1 |
| i32 1, label %d2 |
| i32 3, label %d3 |
| i32 4, label %d4 |
| i32 5, label %d5 |
| i32 6, label %d6 |
| i32 7, label %d7 |
| i32 2, label %d8 |
| i32 8, label %d9 |
| i32 9, label %d10 |
| i32 19, label %d11 |
| i32 20, label %d12 |
| i32 21, label %d13 |
| i32 22, label %d14 |
| i32 24, label %d15 |
| i32 25, label %d16 |
| i32 26, label %d17 |
| ] |
| |
| default: ; preds = %0 |
| unreachable |
| |
| d1: ; preds = %0 |
| unreachable |
| |
| d2: ; preds = %0 |
| unreachable |
| |
| d3: ; preds = %0 |
| unreachable |
| |
| d4: ; preds = %0 |
| unreachable |
| |
| d5: ; preds = %0 |
| unreachable |
| |
| d6: ; preds = %0 |
| unreachable |
| |
| d7: ; preds = %0 |
| unreachable |
| |
| d8: ; preds = %0 |
| unreachable |
| |
| d9: ; preds = %0 |
| unreachable |
| |
| d10: ; preds = %0 |
| unreachable |
| |
| d11: ; preds = %0 |
| unreachable |
| |
| d12: ; preds = %0 |
| unreachable |
| |
| d13: ; preds = %0 |
| unreachable |
| |
| d14: ; preds = %0 |
| unreachable |
| |
| d15: ; preds = %0 |
| unreachable |
| |
| d16: ; preds = %0 |
| unreachable |
| |
| d17: ; preds = %0 |
| unreachable |
| } |
| |
| ; Function Attrs: nounwind |
| declare i32 @llvm.arm.space(i32, i32) #0 |
| |
| ; Function Attrs: nounwind |
| declare void @llvm.stackprotector(i8*, i8**) #0 |
| |
| attributes #0 = { nounwind } |
| |
| ... |
| --- |
| name: foo |
| alignment: 1 |
| exposesReturnsTwice: false |
| legalized: false |
| regBankSelected: false |
| selected: false |
| tracksRegLiveness: true |
| liveins: |
| - { reg: '$r0' } |
| - { reg: '$r1' } |
| frameInfo: |
| isFrameAddressTaken: false |
| isReturnAddressTaken: false |
| hasStackMap: false |
| hasPatchPoint: false |
| stackSize: 0 |
| offsetAdjustment: 0 |
| maxAlignment: 0 |
| adjustsStack: false |
| hasCalls: false |
| maxCallFrameSize: 0 |
| hasOpaqueSPAdjustment: false |
| hasVAStart: false |
| hasMustTailInVarArgFunc: false |
| constants: |
| - id: 0 |
| value: i32 12345678 |
| alignment: 4 |
| jumpTable: |
| kind: inline |
| entries: |
| - id: 0 |
| blocks: [ '%bb.3.d2', '%bb.9.d8', '%bb.4.d3', '%bb.5.d4', |
| '%bb.6.d5', '%bb.7.d6', '%bb.8.d7', '%bb.10.d9', |
| '%bb.11.d10', '%bb.2.d1', '%bb.2.d1', '%bb.2.d1', |
| '%bb.2.d1', '%bb.2.d1', '%bb.2.d1', '%bb.2.d1', |
| '%bb.2.d1', '%bb.2.d1', '%bb.12.d11', '%bb.13.d12', |
| '%bb.14.d13', '%bb.15.d14', '%bb.2.d1', '%bb.16.d15', |
| '%bb.17.d16', '%bb.18.d17' ] |
| body: | |
| bb.0 (%ir-block.0): |
| successors: %bb.2.d1(0x03c3c3c4), %bb.1(0x7c3c3c3c) |
| liveins: $r0, $r1 |
| |
| $r2 = tLDRpci %const.0, 14, $noreg |
| tSTRi killed $r2, killed $r1, 0, 14, $noreg :: (store 4 into %ir.addr) |
| dead $r1 = SPACE 980, undef $r0 |
| $r0 = tUXTB killed $r0, 14, $noreg |
| $r1, dead $cpsr = tSUBi3 killed $r0, 1, 14, $noreg |
| tCMPi8 $r1, 25, 14, $noreg, implicit-def $cpsr |
| tBcc %bb.2.d1, 8, killed $cpsr |
| |
| bb.1 (%ir-block.0): |
| 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) |
| liveins: $r1 |
| |
| $r0, dead $cpsr = tLSLri killed $r1, 2, 14, $noreg |
| $r1 = tLEApcrelJT %jump-table.0, 14, $noreg |
| $r0 = tLDRr killed $r1, killed $r0, 14, $noreg :: (load 4 from jump-table) |
| tBR_JTr killed $r0, %jump-table.0 |
| |
| bb.3.d2: |
| |
| bb.9.d8: |
| |
| bb.4.d3: |
| |
| bb.5.d4: |
| |
| bb.6.d5: |
| |
| bb.7.d6: |
| |
| bb.8.d7: |
| |
| bb.10.d9: |
| |
| bb.11.d10: |
| |
| bb.2.d1: |
| |
| bb.12.d11: |
| |
| bb.13.d12: |
| |
| bb.14.d13: |
| |
| bb.15.d14: |
| |
| bb.16.d15: |
| |
| bb.17.d16: |
| |
| bb.18.d17: |
| |
| ... |
| |
| --- |
| name: bar |
| alignment: 1 |
| exposesReturnsTwice: false |
| legalized: false |
| regBankSelected: false |
| selected: false |
| tracksRegLiveness: true |
| liveins: |
| - { reg: '$r0' } |
| - { reg: '$r1' } |
| frameInfo: |
| isFrameAddressTaken: false |
| isReturnAddressTaken: false |
| hasStackMap: false |
| hasPatchPoint: false |
| stackSize: 0 |
| offsetAdjustment: 0 |
| maxAlignment: 0 |
| adjustsStack: false |
| hasCalls: false |
| maxCallFrameSize: 0 |
| hasOpaqueSPAdjustment: false |
| hasVAStart: false |
| hasMustTailInVarArgFunc: false |
| constants: |
| - id: 0 |
| value: i32 12345678 |
| alignment: 4 |
| jumpTable: |
| kind: inline |
| entries: |
| - id: 0 |
| blocks: [ '%bb.3.d2', '%bb.9.d8', '%bb.4.d3', '%bb.5.d4', |
| '%bb.6.d5', '%bb.7.d6', '%bb.8.d7', '%bb.10.d9', |
| '%bb.11.d10', '%bb.2.d1', '%bb.2.d1', '%bb.2.d1', |
| '%bb.2.d1', '%bb.2.d1', '%bb.2.d1', '%bb.2.d1', |
| '%bb.2.d1', '%bb.2.d1', '%bb.12.d11', '%bb.13.d12', |
| '%bb.14.d13', '%bb.15.d14', '%bb.2.d1', '%bb.16.d15', |
| '%bb.17.d16', '%bb.18.d17' ] |
| body: | |
| bb.0 (%ir-block.0): |
| successors: %bb.2.d1(0x03c3c3c4), %bb.1(0x7c3c3c3c) |
| liveins: $r0, $r1 |
| |
| $r2 = tLDRpci %const.0, 14, $noreg |
| tSTRi killed $r2, killed $r1, 0, 14, $noreg :: (store 4 into %ir.addr) |
| $r0 = tUXTB killed $r0, 14, $noreg |
| $r1, dead $cpsr = tSUBi3 killed $r0, 1, 14, $noreg |
| tCMPi8 $r1, 25, 14, $noreg, implicit-def $cpsr |
| tBcc %bb.2.d1, 8, killed $cpsr |
| |
| bb.1 (%ir-block.0): |
| 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) |
| liveins: $r1 |
| |
| $r0, dead $cpsr = tLSLri killed $r1, 2, 14, $noreg |
| $r1 = tLEApcrelJT %jump-table.0, 14, $noreg |
| $r0 = tLDRr killed $r1, killed $r0, 14, $noreg :: (load 4 from jump-table) |
| tBR_JTr killed $r0, %jump-table.0 |
| |
| bb.3.d2: |
| |
| bb.9.d8: |
| |
| bb.4.d3: |
| |
| bb.5.d4: |
| |
| bb.6.d5: |
| |
| bb.7.d6: |
| |
| bb.8.d7: |
| |
| bb.10.d9: |
| |
| bb.11.d10: |
| |
| bb.2.d1: |
| |
| bb.12.d11: |
| |
| bb.13.d12: |
| |
| bb.14.d13: |
| |
| bb.15.d14: |
| |
| bb.16.d15: |
| |
| bb.17.d16: |
| |
| bb.18.d17: |
| |
| ... |