[C++20][Modules][Serialization] Add an additional test case for #120277. (#126349)
[llvm-project.git] / llvm / test / CodeGen / AArch64 / hardened-br-jump-table.ll
blobf20ea4db7baeb1448acab939977e473c6c8ae8b8
1 ; RUN: rm -rf %t && split-file %s %t
3 ;--- err1.ll
5 ; RUN: not --crash llc %t/err1.ll -mtriple=aarch64-elf \
6 ; RUN:   -aarch64-min-jump-table-entries=1 -aarch64-enable-atomic-cfg-tidy=0 \
7 ; RUN:   -code-model=large \
8 ; RUN:   -o - -verify-machineinstrs 2>&1 | FileCheck %s --check-prefix=ERR1
10 ; RUN: not --crash llc %t/err1.ll -mtriple=aarch64-elf \
11 ; RUN:   -aarch64-min-jump-table-entries=1 -aarch64-enable-atomic-cfg-tidy=0 \
12 ; RUN:   -global-isel -global-isel-abort=1 \
13 ; RUN:   -code-model=large \
14 ; RUN:   -o - -verify-machineinstrs 2>&1 | FileCheck %s --check-prefix=ERR1
16 ; ERR1: LLVM ERROR: Unsupported code-model for hardened jump-table
17 define i32 @test_jumptable(i32 %in) "aarch64-jump-table-hardening" {
19   switch i32 %in, label %def [
20     i32 0, label %lbl1
21     i32 1, label %lbl2
22   ]
24 def:
25   ret i32 0
27 lbl1:
28   ret i32 1
30 lbl2:
31   ret i32 2
34 ;--- test.ll
36 ; RUN: llc %t/test.ll -mtriple=arm64-apple-darwin -aarch64-enable-collect-loh=0 \
37 ; RUN:   -aarch64-min-jump-table-entries=1 -aarch64-enable-atomic-cfg-tidy=0 \
38 ; RUN:   -o - -verify-machineinstrs | FileCheck %s --check-prefix=MACHO
40 ; RUN: llc %t/test.ll -mtriple=arm64-apple-darwin -aarch64-enable-collect-loh=0 \
41 ; RUN:   -aarch64-min-jump-table-entries=1 -aarch64-enable-atomic-cfg-tidy=0 \
42 ; RUN:   -global-isel -global-isel-abort=1 \
43 ; RUN:   -o - -verify-machineinstrs | FileCheck %s --check-prefix=MACHO
45 ; RUN: llc %t/test.ll -mtriple=arm64-apple-darwin -aarch64-enable-collect-loh=0 \
46 ; RUN:   -aarch64-min-jump-table-entries=1 -aarch64-enable-atomic-cfg-tidy=0 \
47 ; RUN:   -code-model=large \
48 ; RUN:   -o - -verify-machineinstrs | FileCheck %s --check-prefix=MACHO
50 ; RUN: llc %t/test.ll -mtriple=arm64-apple-darwin -aarch64-enable-collect-loh=0 \
51 ; RUN:   -aarch64-min-jump-table-entries=1 -aarch64-enable-atomic-cfg-tidy=0 \
52 ; RUN:   -global-isel -global-isel-abort=1 \
53 ; RUN:   -code-model=large \
54 ; RUN:   -o - -verify-machineinstrs | FileCheck %s --check-prefix=MACHO
56 ; RUN: llc %t/test.ll -mtriple=aarch64-elf \
57 ; RUN:   -aarch64-min-jump-table-entries=1 -aarch64-enable-atomic-cfg-tidy=0 \
58 ; RUN:   -o - -verify-machineinstrs | FileCheck %s --check-prefix=ELF
60 ; RUN: llc %t/test.ll -mtriple=aarch64-elf \
61 ; RUN:   -aarch64-min-jump-table-entries=1 -aarch64-enable-atomic-cfg-tidy=0 \
62 ; RUN:   -global-isel -global-isel-abort=1 \
63 ; RUN:   -o - -verify-machineinstrs | FileCheck %s --check-prefix=ELF
65 ; MACHO-LABEL: test_jumptable:
66 ; MACHO:        mov   w16, w0
67 ; MACHO:        cmp   x16, #5
68 ; MACHO:        csel  x16, x16, xzr, ls
69 ; MACHO-NEXT:   adrp  x17, LJTI0_0@PAGE
70 ; MACHO-NEXT:   add   x17, x17, LJTI0_0@PAGEOFF
71 ; MACHO-NEXT:   ldrsw x16, [x17, x16, lsl #2]
72 ; MACHO-NEXT:  Ltmp0:
73 ; MACHO-NEXT:   adr   x17, Ltmp0
74 ; MACHO-NEXT:   add   x16, x17, x16
75 ; MACHO-NEXT:   br    x16
77 ; ELF-LABEL: test_jumptable:
78 ; ELF:        mov   w16, w0
79 ; ELF:        cmp   x16, #5
80 ; ELF:        csel  x16, x16, xzr, ls
81 ; ELF-NEXT:   adrp  x17, .LJTI0_0
82 ; ELF-NEXT:   add   x17, x17, :lo12:.LJTI0_0
83 ; ELF-NEXT:   ldrsw x16, [x17, x16, lsl #2]
84 ; ELF-NEXT:  .Ltmp0:
85 ; ELF-NEXT:   adr   x17, .Ltmp0
86 ; ELF-NEXT:   add   x16, x17, x16
87 ; ELF-NEXT:   br    x16
89 define i32 @test_jumptable(i32 %in) "aarch64-jump-table-hardening" {
91   switch i32 %in, label %def [
92     i32 0, label %lbl1
93     i32 1, label %lbl2
94     i32 2, label %lbl3
95     i32 4, label %lbl4
96     i32 5, label %lbl5
97   ]
99 def:
100   ret i32 0
102 lbl1:
103   ret i32 1
105 lbl2:
106   ret i32 2
108 lbl3:
109   ret i32 4
111 lbl4:
112   ret i32 8
114 lbl5:
115   ret i32 10
119 ; MACHO-LABEL: LJTI0_0:
120 ; MACHO-NEXT: .long LBB{{[0-9_]+}}-Ltmp0
121 ; MACHO-NEXT: .long LBB{{[0-9_]+}}-Ltmp0
122 ; MACHO-NEXT: .long LBB{{[0-9_]+}}-Ltmp0
123 ; MACHO-NEXT: .long LBB{{[0-9_]+}}-Ltmp0
124 ; MACHO-NEXT: .long LBB{{[0-9_]+}}-Ltmp0
125 ; MACHO-NEXT: .long LBB{{[0-9_]+}}-Ltmp0
127 ; ELF-LABEL: .LJTI0_0:
128 ; ELF-NEXT: .word .LBB{{[0-9_]+}}-.Ltmp0
129 ; ELF-NEXT: .word .LBB{{[0-9_]+}}-.Ltmp0
130 ; ELF-NEXT: .word .LBB{{[0-9_]+}}-.Ltmp0
131 ; ELF-NEXT: .word .LBB{{[0-9_]+}}-.Ltmp0
132 ; ELF-NEXT: .word .LBB{{[0-9_]+}}-.Ltmp0
133 ; ELF-NEXT: .word .LBB{{[0-9_]+}}-.Ltmp0