Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Side by Side Diff: tests_lit/llvm2ice_tests/adv-switch-opt.ll

Issue 1743133002: Subzero: Fix JumpTable lowering on x86-64. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Clean up the test a bit Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 ; This tests the advanced lowering of switch statements. The advanced lowering 1 ; This tests the advanced lowering of switch statements. The advanced lowering
2 ; uses jump tables, range tests and binary search. 2 ; uses jump tables, range tests and binary search.
3 3
4 ; RUN: %p2i -i %s --filetype=obj --disassemble --args -O2 | FileCheck %s 4 ; RUN: %p2i -i %s --target=x8632 --filetype=obj --disassemble --args -O2 \
John 2016/02/29 15:34:09 enable the other lit tests, too?
Jim Stichnoth 2016/02/29 17:53:18 Clarified offline. Most of the tests are run for
5 ; RUN: | FileCheck %s --check-prefix=CHECK --check-prefix=X8632
6 ; RUN: %p2i -i %s --target=x8664 --filetype=obj --disassemble --args -O2 \
7 ; RUN: | FileCheck %s --check-prefix=CHECK --check-prefix=X8664
5 8
6 ; Dense but non-continuous ranges should be converted into a jump table. 9 ; Dense but non-continuous ranges should be converted into a jump table.
7 define internal i32 @testJumpTable(i32 %a) { 10 define internal i32 @testJumpTable(i32 %a) {
8 entry: 11 entry:
9 switch i32 %a, label %sw.default [ 12 switch i32 %a, label %sw.default [
10 i32 91, label %sw.default 13 i32 91, label %sw.default
11 i32 92, label %sw.bb1 14 i32 92, label %sw.bb1
12 i32 93, label %sw.default 15 i32 93, label %sw.default
13 i32 99, label %sw.bb1 16 i32 99, label %sw.bb1
14 i32 98, label %sw.default 17 i32 98, label %sw.default
(...skipping 10 matching lines...) Expand all
25 br label %sw.epilog 28 br label %sw.epilog
26 29
27 sw.epilog: 30 sw.epilog:
28 %result.1 = phi i32 [ %add, %sw.default ], [ %tmp, %sw.bb1 ], [ 17, %entry ] 31 %result.1 = phi i32 [ %add, %sw.default ], [ %tmp, %sw.bb1 ], [ 17, %entry ]
29 ret i32 %result.1 32 ret i32 %result.1
30 } 33 }
31 ; CHECK-LABEL: testJumpTable 34 ; CHECK-LABEL: testJumpTable
32 ; CHECK: sub [[IND:[^,]+]],0x5b 35 ; CHECK: sub [[IND:[^,]+]],0x5b
33 ; CHECK-NEXT: cmp [[IND]],0x8 36 ; CHECK-NEXT: cmp [[IND]],0x8
34 ; CHECK-NEXT: ja 37 ; CHECK-NEXT: ja
35 ; CHECK-NEXT: mov [[TARGET:.*]],DWORD PTR {{\[}}[[IND]]*4+0x0] {{[0-9a-f]+}}: R_ 386_32 .{{.*}}testJumpTable$jumptable 38 ; X8632-NEXT: mov [[TARGET:.*]],DWORD PTR {{\[}}[[IND]]*4+0x0] {{[0-9a-f]+}}: R_ 386_32 .{{.*}}testJumpTable$jumptable
36 ; CHECK-NEXT: jmp [[TARGET]] 39 ; X8632-NEXT: jmp [[TARGET]]
40 ; X8664-NEXT: mov {{.}}[[TARGET:.*]],DWORD PTR {{\[}}[[IND]]*4+0x0] {{[0-9a-f]+} }: R_X86_64_32S .{{.*}}testJumpTable$jumptable
41 ; X8664-NEXT: jmp {{.}}[[TARGET]]
42 ; Note: x86-32 may do "mov eax, [...]; jmp eax", whereas x86-64 may do
43 ; "mov eax, [...]; jmp rax", so we assume the all characters except the first
44 ; one in the register name will match.
37 45
38 ; Continuous ranges which map to the same target should be grouped and 46 ; Continuous ranges which map to the same target should be grouped and
39 ; efficiently tested. 47 ; efficiently tested.
40 define internal i32 @testRangeTest() { 48 define internal i32 @testRangeTest() {
41 entry: 49 entry:
42 switch i32 10, label %sw.default [ 50 switch i32 10, label %sw.default [
43 i32 0, label %sw.epilog 51 i32 0, label %sw.epilog
44 i32 1, label %sw.epilog 52 i32 1, label %sw.epilog
45 i32 2, label %sw.epilog 53 i32 2, label %sw.epilog
46 i32 3, label %sw.epilog 54 i32 3, label %sw.epilog
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
122 br label %return 130 br label %return
123 131
124 sw.default: 132 sw.default:
125 br label %return 133 br label %return
126 134
127 return: 135 return:
128 %retval.0 = phi i32 [ 5, %sw.default ], [ 4, %sw.bb3 ], [ 3, %sw.bb2 ], [ 2, % sw.bb1 ], [ 1, %entry ] 136 %retval.0 = phi i32 [ 5, %sw.default ], [ 4, %sw.bb3 ], [ 3, %sw.bb2 ], [ 2, % sw.bb1 ], [ 1, %entry ]
129 ret i32 %retval.0 137 ret i32 %retval.0
130 } 138 }
131 ; CHECK-LABEL: testSwitchSmall64 139 ; CHECK-LABEL: testSwitchSmall64
132 ; CHECK: cmp {{.*}},0x0 140 ; X8632: cmp {{.*}},0x0
133 ; CHECK-NEXT: jne 141 ; X8632-NEXT: jne
134 ; CHECK-NEXT: cmp {{.*}},0x159 142 ; X8632-NEXT: cmp {{.*}},0x159
135 ; CHECK-NEXT: jb 143 ; X8632-NEXT: jb
136 ; CHECK-NEXT: je 144 ; X8632-NEXT: je
137 ; CHECK-NEXT: cmp {{.*}},0x1c8 145 ; X8632-NEXT: cmp {{.*}},0x1c8
138 ; CHECK-NEXT: je 146 ; X8632-NEXT: je
139 ; CHECK-NEXT: jmp 147 ; X8632-NEXT: jmp
140 ; CHECK-NEXT: cmp {{.*}},0x7b 148 ; X8632-NEXT: cmp {{.*}},0x7b
141 ; CHECK-NEXT: je 149 ; X8632-NEXT: je
142 ; CHECK-NEXT: cmp {{.*}},0xea 150 ; X8632-NEXT: cmp {{.*}},0xea
143 ; CHECK-NEXT: je 151 ; X8632-NEXT: je
144 152
145 ; Test for correct 64-bit lowering. 153 ; Test for correct 64-bit lowering.
146 ; TODO(ascull): this should generate better code like the 32-bit version 154 ; TODO(ascull): this should generate better code like the 32-bit version
147 define internal i32 @testSwitch64(i64 %a) { 155 define internal i32 @testSwitch64(i64 %a) {
148 entry: 156 entry:
149 switch i64 %a, label %sw.default [ 157 switch i64 %a, label %sw.default [
150 i64 123, label %return 158 i64 123, label %return
151 i64 234, label %sw.bb1 159 i64 234, label %sw.bb1
152 i64 345, label %sw.bb2 160 i64 345, label %sw.bb2
153 i64 78187493520, label %sw.bb3 161 i64 78187493520, label %sw.bb3
154 ] 162 ]
155 163
156 sw.bb1: 164 sw.bb1:
157 br label %return 165 br label %return
158 166
159 sw.bb2: 167 sw.bb2:
160 br label %return 168 br label %return
161 169
162 sw.bb3: 170 sw.bb3:
163 br label %return 171 br label %return
164 172
165 sw.default: 173 sw.default:
166 br label %return 174 br label %return
167 175
168 return: 176 return:
169 %retval.0 = phi i32 [ 5, %sw.default ], [ 4, %sw.bb3 ], [ 3, %sw.bb2 ], [ 2, % sw.bb1 ], [ 1, %entry ] 177 %retval.0 = phi i32 [ 5, %sw.default ], [ 4, %sw.bb3 ], [ 3, %sw.bb2 ], [ 2, % sw.bb1 ], [ 1, %entry ]
170 ret i32 %retval.0 178 ret i32 %retval.0
171 } 179 }
172 ; CHECK-LABEL: testSwitch64 180 ; CHECK-LABEL: testSwitch64
173 ; CHECK: cmp {{.*}},0x7b 181 ; X8632: cmp {{.*}},0x7b
174 ; CHECK-NEXT: jne 182 ; X8632-NEXT: jne
175 ; CHECK-NEXT: cmp {{.*}},0x0 183 ; X8632-NEXT: cmp {{.*}},0x0
176 ; CHECK-NEXT: je 184 ; X8632-NEXT: je
177 ; CHECK: cmp {{.*}},0xea 185 ; X8632: cmp {{.*}},0xea
178 ; CHECK-NEXT: jne 186 ; X8632-NEXT: jne
179 ; CHECK-NEXT: cmp {{.*}},0x0 187 ; X8632-NEXT: cmp {{.*}},0x0
180 ; CHECK-NEXT: je 188 ; X8632-NEXT: je
181 ; CHECK: cmp {{.*}},0x159 189 ; X8632: cmp {{.*}},0x159
182 ; CHECK-NEXT: jne 190 ; X8632-NEXT: jne
183 ; CHECK-NEXT: cmp {{.*}},0x0 191 ; X8632-NEXT: cmp {{.*}},0x0
184 ; CHECK-NEXT: je 192 ; X8632-NEXT: je
185 ; CHECK: cmp {{.*}},0x34567890 193 ; X8632: cmp {{.*}},0x34567890
186 ; CHECK-NEXT: jne 194 ; X8632-NEXT: jne
187 ; CHECK-NEXT: cmp {{.*}},0x12 195 ; X8632-NEXT: cmp {{.*}},0x12
188 ; CHECK-NEXT: je 196 ; X8632-NEXT: je
189 197
190 ; Test for correct 64-bit jump table with UINT64_MAX as one of the values. 198 ; Test for correct 64-bit jump table with UINT64_MAX as one of the values.
191 define internal i32 @testJumpTable64(i64 %a) { 199 define internal i32 @testJumpTable64(i64 %a) {
192 entry: 200 entry:
193 switch i64 %a, label %sw.default [ 201 switch i64 %a, label %sw.default [
194 i64 -6, label %return 202 i64 -6, label %return
195 i64 -4, label %sw.bb1 203 i64 -4, label %sw.bb1
196 i64 -3, label %sw.bb2 204 i64 -3, label %sw.bb2
197 i64 -1, label %sw.bb3 205 i64 -1, label %sw.bb3
198 ] 206 ]
(...skipping 10 matching lines...) Expand all
209 sw.default: 217 sw.default:
210 br label %return 218 br label %return
211 219
212 return: 220 return:
213 %retval.0 = phi i32 [ 5, %sw.default ], [ 4, %sw.bb3 ], [ 3, %sw.bb2 ], [ 2, % sw.bb1 ], [ 1, %entry ] 221 %retval.0 = phi i32 [ 5, %sw.default ], [ 4, %sw.bb3 ], [ 3, %sw.bb2 ], [ 2, % sw.bb1 ], [ 1, %entry ]
214 ret i32 %retval.0 222 ret i32 %retval.0
215 } 223 }
216 224
217 ; TODO(ascull): this should generate a jump table. For now, just make sure it 225 ; TODO(ascull): this should generate a jump table. For now, just make sure it
218 ; doesn't crash the compiler. 226 ; doesn't crash the compiler.
227 ; CHECK-LABEL: testJumpTable64
OLDNEW
« src/IceTargetLoweringX86BaseImpl.h ('K') | « src/IceTargetLoweringX86BaseImpl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698