diff options
Diffstat (limited to 'llvm/test/CodeGen/AArch64')
-rw-r--r-- | llvm/test/CodeGen/AArch64/O3-pipeline.ll | 1 | ||||
-rw-r--r-- | llvm/test/CodeGen/AArch64/jump-table-compress.mir | 111 | ||||
-rw-r--r-- | llvm/test/CodeGen/AArch64/jump-table-exynos.ll | 67 | ||||
-rw-r--r-- | llvm/test/CodeGen/AArch64/jump-table.ll | 156 | ||||
-rw-r--r-- | llvm/test/CodeGen/AArch64/min-jump-table.ll | 6 |
5 files changed, 303 insertions, 38 deletions
diff --git a/llvm/test/CodeGen/AArch64/O3-pipeline.ll b/llvm/test/CodeGen/AArch64/O3-pipeline.ll index 33bc05f91d5..dc2316987d3 100644 --- a/llvm/test/CodeGen/AArch64/O3-pipeline.ll +++ b/llvm/test/CodeGen/AArch64/O3-pipeline.ll @@ -151,6 +151,7 @@ ; CHECK-NEXT: Branch Probability Basic Block Placement ; CHECK-NEXT: Branch relaxation pass ; CHECK-NEXT: AArch64 Branch Targets +; CHECK-NEXT: AArch64 Compress Jump Tables ; CHECK-NEXT: Contiguously Lay Out Funclets ; CHECK-NEXT: StackMap Liveness Analysis ; CHECK-NEXT: Live DEBUG_VALUE analysis diff --git a/llvm/test/CodeGen/AArch64/jump-table-compress.mir b/llvm/test/CodeGen/AArch64/jump-table-compress.mir new file mode 100644 index 00000000000..b4217ea6168 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/jump-table-compress.mir @@ -0,0 +1,111 @@ +# RUN: llc -mtriple=aarch64-linux-gnu %s -run-pass=aarch64-jump-tables -o - | FileCheck %s +--- | + define i32 @test_jumptable(i32 %in) { + unreachable + } + +... +--- +name: test_jumptable +alignment: 2 +exposesReturnsTwice: false +legalized: false +regBankSelected: false +selected: false +tracksRegLiveness: true +liveins: + - { reg: '$w0' } +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 +jumpTable: + kind: block-address + entries: + - id: 0 + blocks: [ '%bb.2', '%bb.3' ] + - id: 1 + blocks: [ '%bb.4', '%bb.5' ] + - id: 2 + blocks: [ '%bb.7' ] + - id: 3 + blocks: [ '%bb.9' ] + - id: 4 + blocks: [ '%bb.9' ] + - id: 5 + blocks: [ '%bb.11' ] +body: | + bb.0 (%ir-block.0): + + bb.1 (%ir-block.0): + ; CHECK-LABEL: body: + ; CHECK-LABEL: bb.1 + ; CHECK: JumpTableDest8 + liveins: $x8 + early-clobber $x10, dead early-clobber $x11 = JumpTableDest32 undef killed $x9, undef killed $x8, %jump-table.0 + BR killed $x10 + + bb.2: + ; Last destination is 4 * 255 = 1020 bytes after first. Byte is OK. + dead $xzr = SPACE 1020, undef $xzr + + bb.3: + ; CHECK-LABEL: bb.3 + ; CHECK: JumpTableDest16 + early-clobber $x10, dead early-clobber $x11 = JumpTableDest32 undef killed $x9, undef killed $x8, %jump-table.1 + BR killed $x10 + + bb.4: + ; Last destination is 4 * 256 = 1024 bytes after first. Half needed. + dead $xzr = SPACE 1024, undef $xzr + + bb.5: + ; CHECK-LABEL: bb.5 + ; CHECK: JumpTableDest8 + early-clobber $x10, dead early-clobber $x11 = JumpTableDest32 undef killed $x9, undef killed $x8, %jump-table.2 + BR killed $x10 + + bb.6: + ; First destination is (2^20 - 4) after reference. Just reachable by ADR so can use compressed table. + dead $xzr = SPACE 1048556, undef $xzr + + bb.7: + ; CHECK-LABEL: bb.7 + ; CHECK: JumpTableDest32 + early-clobber $x10, dead early-clobber $x11 = JumpTableDest32 undef killed $x9, undef killed $x8, %jump-table.3 + BR killed $x10 + + bb.8: + ; First destination is 2^20 after reference. Compressed table cannot reach it. + dead $xzr = SPACE 1048560, undef $xzr + + bb.9: + ; First destination is 2^20 before reference. Just within reach of ADR. + dead $xzr = SPACE 1048576, undef $xzr + + bb.10: + ; CHECK-LABEL: bb.10 + ; CHECK: JumpTableDest8 + early-clobber $x10, dead early-clobber $x11 = JumpTableDest32 undef killed $x9, undef killed $x8, %jump-table.4 + BR killed $x10 + + bb.11: + ; First destination is 2^20 before reference. Just within reach of ADR. + dead $xzr = SPACE 1048580, undef $xzr + + bb.12: + ; CHECK-LABEL: bb.12 + ; CHECK: JumpTableDest32 + early-clobber $x10, dead early-clobber $x11 = JumpTableDest32 undef killed $x9, undef killed $x8, %jump-table.5 + BR killed $x10 +... diff --git a/llvm/test/CodeGen/AArch64/jump-table-exynos.ll b/llvm/test/CodeGen/AArch64/jump-table-exynos.ll new file mode 100644 index 00000000000..e018410792e --- /dev/null +++ b/llvm/test/CodeGen/AArch64/jump-table-exynos.ll @@ -0,0 +1,67 @@ +; RUN: llc -o - %s -mtriple=aarch64-none-linux-gnu -mattr=+force-32bit-jump-tables -aarch64-enable-atomic-cfg-tidy=0 | FileCheck %s +; RUN: llc -o - %s -mtriple=aarch64-none-linux-gnu -mcpu=exynos-m1 -aarch64-enable-atomic-cfg-tidy=0 | FileCheck %s +; RUN: llc -o - %s -mtriple=aarch64-none-linux-gnu -mcpu=exynos-m2 -aarch64-enable-atomic-cfg-tidy=0 | FileCheck %s +; RUN: llc -o - %s -mtriple=aarch64-none-linux-gnu -mcpu=exynos-m3 -aarch64-enable-atomic-cfg-tidy=0 | FileCheck %s + +; Exynos doesn't want jump tables to be compressed for now. + +define i32 @test_jumptable(i32 %in) { + switch i32 %in, label %def [ + i32 0, label %lbl1 + i32 1, label %lbl2 + i32 2, label %lbl3 + i32 4, label %lbl4 + ] +; CHECK-LABEL: test_jumptable: +; CHECK-NOT: ldrb + +def: + ret i32 0 + +lbl1: + ret i32 1 + +lbl2: + ret i32 2 + +lbl3: + ret i32 4 + +lbl4: + ret i32 8 + +} + +define i32 @test_jumptable_minsize(i32 %in) minsize { + switch i32 %in, label %def [ + i32 0, label %lbl1 + i32 1, label %lbl2 + i32 2, label %lbl3 + i32 4, label %lbl4 + ] +; CHECK-LABEL: test_jumptable_minsize: +; CHECK: adrp [[JTPAGE:x[0-9]+]], .LJTI1_0 +; CHECK: add x[[JT:[0-9]+]], [[JTPAGE]], {{#?}}:lo12:.LJTI1_0 +; CHECK: adr [[PCBASE:x[0-9]+]], [[JTBASE:.LBB[0-9]+_[0-9]+]] +; CHECK: ldrb w[[OFFSET:[0-9]+]], [x[[JT]], {{x[0-9]+}}] +; CHECK: add [[DEST:x[0-9]+]], [[PCBASE]], x[[OFFSET]], lsl #2 +; CHECK: br [[DEST]] + + + +def: + ret i32 0 + +lbl1: + ret i32 1 + +lbl2: + ret i32 2 + +lbl3: + ret i32 4 + +lbl4: + ret i32 8 + +} diff --git a/llvm/test/CodeGen/AArch64/jump-table.ll b/llvm/test/CodeGen/AArch64/jump-table.ll index 098b90f94b9..4e70e92beaf 100644 --- a/llvm/test/CodeGen/AArch64/jump-table.ll +++ b/llvm/test/CodeGen/AArch64/jump-table.ll @@ -1,7 +1,7 @@ -; RUN: llc -verify-machineinstrs -o - %s -mtriple=aarch64-none-linux-gnu -aarch64-enable-atomic-cfg-tidy=0 | FileCheck %s -; RUN: llc -code-model=large -verify-machineinstrs -o - %s -mtriple=aarch64-none-linux-gnu -aarch64-enable-atomic-cfg-tidy=0 | FileCheck --check-prefix=CHECK-LARGE %s -; RUN: llc -mtriple=aarch64-none-linux-gnu -verify-machineinstrs -relocation-model=pic -aarch64-enable-atomic-cfg-tidy=0 -o - %s | FileCheck --check-prefix=CHECK-PIC %s -; RUN: llc -code-model=tiny -verify-machineinstrs -o - %s -mtriple=aarch64-none-linux-gnu -aarch64-enable-atomic-cfg-tidy=0 | FileCheck --check-prefix=CHECK-TINY %s +; RUN: llc -no-integrated-as -verify-machineinstrs -o - %s -mtriple=aarch64-none-linux-gnu -aarch64-enable-atomic-cfg-tidy=0 | FileCheck %s +; RUN: llc -no-integrated-as -code-model=large -verify-machineinstrs -o - %s -mtriple=aarch64-none-linux-gnu -aarch64-enable-atomic-cfg-tidy=0 | FileCheck --check-prefix=CHECK-LARGE %s +; RUN: llc -no-integrated-as -mtriple=aarch64-none-linux-gnu -verify-machineinstrs -relocation-model=pic -aarch64-enable-atomic-cfg-tidy=0 -o - %s | FileCheck --check-prefix=CHECK-PIC %s +; RUN: llc -no-integrated-as -code-model=tiny -verify-machineinstrs -o - %s -mtriple=aarch64-none-linux-gnu -aarch64-enable-atomic-cfg-tidy=0 | FileCheck --check-prefix=CHECK-TINY %s define i32 @test_jumptable(i32 %in) { ; CHECK: test_jumptable @@ -12,27 +12,45 @@ define i32 @test_jumptable(i32 %in) { i32 2, label %lbl3 i32 4, label %lbl4 ] -; CHECK: adrp [[JTPAGE:x[0-9]+]], .LJTI0_0 -; CHECK: add x[[JT:[0-9]+]], [[JTPAGE]], {{#?}}:lo12:.LJTI0_0 -; CHECK: ldr [[DEST:x[0-9]+]], [x[[JT]], {{x[0-9]+}}, lsl #3] -; CHECK: br [[DEST]] - -; CHECK-LARGE: movz x[[JTADDR:[0-9]+]], #:abs_g0_nc:.LJTI0_0 -; CHECK-LARGE: movk x[[JTADDR]], #:abs_g1_nc:.LJTI0_0 -; CHECK-LARGE: movk x[[JTADDR]], #:abs_g2_nc:.LJTI0_0 -; CHECK-LARGE: movk x[[JTADDR]], #:abs_g3:.LJTI0_0 -; CHECK-LARGE: ldr [[DEST:x[0-9]+]], [x[[JTADDR]], {{x[0-9]+}}, lsl #3] -; CHECK-LARGE: br [[DEST]] - -; CHECK-PIC: adrp [[JTPAGE:x[0-9]+]], .LJTI0_0 -; CHECK-PIC: add x[[JT:[0-9]+]], [[JTPAGE]], {{#?}}:lo12:.LJTI0_0 -; CHECK-PIC: ldrsw [[DEST:x[0-9]+]], [x[[JT]], {{x[0-9]+}}, lsl #2] -; CHECK-PIC: add [[TABLE:x[0-9]+]], [[DEST]], x[[JT]] -; CHECK-PIC: br [[TABLE]] - -; CHECK-TINY: adr x[[JT:[0-9]+]], .LJTI0_0 -; CHECK-TINY: ldr [[DEST:x[0-9]+]], [x[[JT]], {{x[0-9]+}}, lsl #3] -; CHECK-TINY: br [[DEST]] +; CHECK-LABEL: test_jumptable: +; CHECK: adrp [[JTPAGE:x[0-9]+]], .LJTI0_0 +; CHECK: add x[[JT:[0-9]+]], [[JTPAGE]], {{#?}}:lo12:.LJTI0_0 +; CHECK: adr [[PCBASE:x[0-9]+]], [[JTBASE:.LBB[0-9]+_[0-9]+]] +; CHECK: ldrb w[[OFFSET:[0-9]+]], [x[[JT]], {{x[0-9]+}}] +; CHECK: add [[DEST:x[0-9]+]], [[PCBASE]], x[[OFFSET]], lsl #2 +; CHECK: br [[DEST]] + +; CHECK-LARGE: movz x[[JTADDR:[0-9]+]], #:abs_g0_nc:.LJTI0_0 +; CHECK-LARGE: movk x[[JTADDR]], #:abs_g1_nc:.LJTI0_0 +; CHECK-LARGE: movk x[[JTADDR]], #:abs_g2_nc:.LJTI0_0 +; CHECK-LARGE: movk x[[JTADDR]], #:abs_g3:.LJTI0_0 +; CHECK-LARGE: adr [[PCBASE:x[0-9]+]], [[JTBASE:.LBB[0-9]+_[0-9]+]] +; CHECK-LARGE: ldrb w[[OFFSET:[0-9]+]], [x[[JTADDR]], {{x[0-9]+}}] +; CHECK-LARGE: add [[DEST:x[0-9]+]], [[PCBASE]], x[[OFFSET]], lsl #2 +; CHECK-LARGE: br [[DEST]] + +; CHECK-PIC-LABEL: test_jumptable: +; CHECK-PIC: adrp [[JTPAGE:x[0-9]+]], .LJTI0_0 +; CHECK-PIC: add x[[JT:[0-9]+]], [[JTPAGE]], {{#?}}:lo12:.LJTI0_0 +; CHECK-PIC: adr [[PCBASE:x[0-9]+]], [[JTBASE:.LBB[0-9]+_[0-9]+]] +; CHECK-PIC: ldrb w[[OFFSET:[0-9]+]], [x[[JT]], {{x[0-9]+}}] +; CHECK-PIC: add [[DEST:x[0-9]+]], [[PCBASE]], x[[OFFSET]], lsl #2 +; CHECK-PIC: br [[DEST]] + +; CHECK-IOS: adrp [[JTPAGE:x[0-9]+]], LJTI0_0@PAGE +; CHECK-IOS: add x[[JT:[0-9]+]], [[JTPAGE]], LJTI0_0@PAGEOFF +; CHECK-IOS: adr [[PCBASE:x[0-9]+]], [[JTBASE:LBB[0-9]+_[0-9]+]] +; CHECK-IOS: ldrb w[[OFFSET:[0-9]+]], [x[[JT]], {{x[0-9]+}}] +; CHECK-IOS: add [[DEST:x[0-9]+]], [[PCBASE]], x[[OFFSET]], lsl #2 +; CHECK-IOS: br [[DEST]] + +; CHECK-TINY-LABEL: test_jumptable: +; CHECK-TINY: adr x[[JT:[0-9]+]], .LJTI0_0 +; CHECK-TINY: adr [[PCBASE:x[0-9]+]], [[JTBASE:.LBB[0-9]+_[0-9]+]] +; CHECK-TINY: ldrb w[[OFFSET:[0-9]+]], [x[[JT]], {{x[0-9]+}}] +; CHECK-TINY: add [[DEST:x[0-9]+]], [[PCBASE]], x[[OFFSET]], lsl #2 +; CHECK-TINY: br [[DEST]] + def: ret i32 0 @@ -54,18 +72,86 @@ lbl4: ; CHECK: .rodata ; CHECK: .LJTI0_0: -; CHECK-NEXT: .xword -; CHECK-NEXT: .xword -; CHECK-NEXT: .xword -; CHECK-NEXT: .xword -; CHECK-NEXT: .xword +; CHECK-NEXT: .byte ([[JTBASE]]-[[JTBASE]])>>2 +; CHECK-NEXT: .byte (.LBB{{.*}}-[[JTBASE]])>>2 +; CHECK-NEXT: .byte (.LBB{{.*}}-[[JTBASE]])>>2 +; CHECK-NEXT: .byte (.LBB{{.*}}-[[JTBASE]])>>2 +; CHECK-NEXT: .byte (.LBB{{.*}}-[[JTBASE]])>>2 + +define i32 @test_jumptable16(i32 %in) { + + switch i32 %in, label %def [ + i32 0, label %lbl1 + i32 1, label %lbl2 + i32 2, label %lbl3 + i32 4, label %lbl4 + ] +; CHECK-LABEL: test_jumptable16: +; CHECK: adrp [[JTPAGE:x[0-9]+]], .LJTI1_0 +; CHECK: add x[[JT:[0-9]+]], [[JTPAGE]], {{#?}}:lo12:.LJTI1_0 +; CHECK: adr [[PCBASE:x[0-9]+]], [[JTBASE:.LBB[0-9]+_[0-9]+]] +; CHECK: ldrh w[[OFFSET:[0-9]+]], [x[[JT]], {{x[0-9]+}}, lsl #1] +; CHECK: add [[DEST:x[0-9]+]], [[PCBASE]], x[[OFFSET]], lsl #2 +; CHECK: br [[DEST]] + +def: + ret i32 0 + +lbl1: + ret i32 1 + +lbl2: + call void asm sideeffect "1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16", ""() + call void asm sideeffect "1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16", ""() + call void asm sideeffect "1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16", ""() + call void asm sideeffect "1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16", ""() + call void asm sideeffect "1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16", ""() + call void asm sideeffect "1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16", ""() + call void asm sideeffect "1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16", ""() + call void asm sideeffect "1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16", ""() + call void asm sideeffect "1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16", ""() + call void asm sideeffect "1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16", ""() + call void asm sideeffect "1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16", ""() + call void asm sideeffect "1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16", ""() + call void asm sideeffect "1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16", ""() + call void asm sideeffect "1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16", ""() + call void asm sideeffect "1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16", ""() + call void asm sideeffect "1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16", ""() + ret i32 2 + +lbl3: + ret i32 4 + +lbl4: + ret i32 8 + +} + +; CHECK: .rodata +; CHECK: .p2align 1 +; CHECK: .LJTI1_0: +; CHECK-NEXT: .hword ([[JTBASE]]-[[JTBASE]])>>2 +; CHECK-NEXT: .hword (.LBB{{.*}}-[[JTBASE]])>>2 +; CHECK-NEXT: .hword (.LBB{{.*}}-[[JTBASE]])>>2 +; CHECK-NEXT: .hword (.LBB{{.*}}-[[JTBASE]])>>2 +; CHECK-NEXT: .hword (.LBB{{.*}}-[[JTBASE]])>>2 ; CHECK-PIC-NOT: .data_region ; CHECK-PIC-NOT: .LJTI0_0 ; CHECK-PIC: .LJTI0_0: -; CHECK-PIC-NEXT: .word .LBB{{.*}}-.LJTI0_0 -; CHECK-PIC-NEXT: .word .LBB{{.*}}-.LJTI0_0 -; CHECK-PIC-NEXT: .word .LBB{{.*}}-.LJTI0_0 -; CHECK-PIC-NEXT: .word .LBB{{.*}}-.LJTI0_0 -; CHECK-PIC-NEXT: .word .LBB{{.*}}-.LJTI0_0 +; CHECK-PIC-NEXT: .byte ([[JTBASE]]-[[JTBASE]])>>2 +; CHECK-PIC-NEXT: .byte (.LBB{{.*}}-[[JTBASE]])>>2 +; CHECK-PIC-NEXT: .byte (.LBB{{.*}}-[[JTBASE]])>>2 +; CHECK-PIC-NEXT: .byte (.LBB{{.*}}-[[JTBASE]])>>2 +; CHECK-PIC-NEXT: .byte (.LBB{{.*}}-[[JTBASE]])>>2 ; CHECK-PIC-NOT: .end_data_region + +; CHECK-IOS: .section __TEXT,__const +; CHECK-IOS-NOT: .data_region +; CHECK-IOS: LJTI0_0: +; CHECK-IOS-NEXT: .byte ([[JTBASE]]-[[JTBASE]])>>2 +; CHECK-IOS-NEXT: .byte (LBB{{.*}}-[[JTBASE]])>>2 +; CHECK-IOS-NEXT: .byte (LBB{{.*}}-[[JTBASE]])>>2 +; CHECK-IOS-NEXT: .byte (LBB{{.*}}-[[JTBASE]])>>2 +; CHECK-IOS-NEXT: .byte (LBB{{.*}}-[[JTBASE]])>>2 +; CHECK-IOS-NOT: .end_data_region diff --git a/llvm/test/CodeGen/AArch64/min-jump-table.ll b/llvm/test/CodeGen/AArch64/min-jump-table.ll index b22e683ebfe..7d6d26259af 100644 --- a/llvm/test/CodeGen/AArch64/min-jump-table.ll +++ b/llvm/test/CodeGen/AArch64/min-jump-table.ll @@ -14,8 +14,8 @@ entry: ; CHECK0-NEXT: Jump Tables: ; CHECK0-NEXT: %jump-table.0: ; CHECK0-NOT: %jump-table.1: -; CHECK4-NOT: Jump Tables: -; CHECK8-NOT: Jump Tables: +; CHECK4-NOT: {{^}}Jump Tables: +; CHECK8-NOT: {{^}}Jump Tables: bb1: tail call void @ext(i32 0) br label %return bb2: tail call void @ext(i32 2) br label %return @@ -38,7 +38,7 @@ entry: ; CHECK4-NEXT: Jump Tables: ; CHECK4-NEXT: %jump-table.0: ; CHECK4-NOT: %jump-table.1: -; CHECK8-NOT: Jump Tables: +; CHECK8-NOT: {{^}}Jump Tables: bb1: tail call void @ext(i32 0) br label %return bb2: tail call void @ext(i32 2) br label %return |