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

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

Issue 1234803007: Introduction of improved switch lowering. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: CL feedback Created 5 years, 5 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
« src/IceTargetLoweringX86BaseImpl.h ('K') | « src/IceTypes.def ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 ; This tests the advanced lowering of switch statements. The advanced lowering
2 ; uses jump tables, range tests and binary search.
3
4 ; RUN: %p2i -i %s --filetype=asm --assemble --disassemble --args --adv-switch \
5 ; RUN: -O2 | FileCheck %s
6
7 ; Dense but non-continuous ranges should be converted into a jump table.
8 define internal i32 @testJumpTable(i32 %a) {
9 entry:
10 switch i32 %a, label %sw.default [
11 i32 91, label %sw.default
12 i32 92, label %sw.bb1
13 i32 93, label %sw.default
14 i32 99, label %sw.bb1
15 i32 98, label %sw.default
16 i32 96, label %sw.bb1
17 i32 97, label %sw.epilog
18 ]
19
20 sw.default: ; preds = %entry
jvoung (off chromium) 2015/07/16 22:27:49 I think you could remove these comments "; preds =
ascull 2015/07/16 22:55:44 Done.
21 %add = add i32 %a, 27
22 br label %sw.epilog
23
24 sw.bb1: ; preds = %entry
25 %tmp = add i32 %a, 16
26 br label %sw.epilog
27
28 sw.epilog: ; preds = %sw.default, %sw.bb1 , %entry
29 %result.1 = phi i32 [ %add, %sw.default ], [ %tmp, %sw.bb1 ], [ 17, %entry ]
30 ret i32 %result.1
31 }
32 ; CHECK-LABEL: testJumpTable
33 ; CHECK: sub [[IND:[^,]+]],0x5b
34 ; CHECK-NEXT: cmp [[IND]],0x8
35 ; CHECK-NEXT: ja
36 ; CHECK-NEXT: mov [[BASE:[^,]+]],0x0 f: R_386_32 .rodata.testJumpTable$jumptable
jvoung (off chromium) 2015/07/16 22:27:49 I would just regex match the "f: " part. That's th
ascull 2015/07/16 22:55:44 Done.
37 ; CHECK-NEXT: mov {{.*}},DWORD PTR {{\[}}[[BASE]]+[[IND]]*4]
38 ; CHECK-NEXT: jmp
39
40 ; Continuous ranges which map to the same target should be grouped and
41 ; efficiently tested.
42 define internal i32 @testRangeTest() {
43 entry:
44 switch i32 10, label %sw.default [
45 i32 0, label %sw.epilog
46 i32 1, label %sw.epilog
47 i32 2, label %sw.epilog
48 i32 3, label %sw.epilog
49 i32 10, label %sw.bb1
50 i32 11, label %sw.bb1
51 i32 12, label %sw.bb1
52 i32 13, label %sw.bb1
53 ]
54
55 sw.default: ; preds = %entry
56 br label %sw.epilog
57
58 sw.bb1: ; preds = %entry
59 br label %sw.epilog
60
61 sw.epilog: ; preds = %sw.default, %sw.bb1 , %entry
62 %result.1 = phi i32 [ 23, %sw.default ], [ 42, %sw.bb1 ], [ 17, %entry ], [ 17 , %entry ], [ 17, %entry ], [ 17, %entry ]
63 ret i32 %result.1
64 }
65 ; CHECK-LABEL: testRangeTest
66 ; CHECK: cmp {{.*}},0x3
67 ; CHECK-NEXT: jbe
68 ; CHECK: sub [[REG:[^,]*]],0xa
69 ; CHECK-NEXT: cmp [[REG]],0x3
70 ; CHECK-NEXT: jbe
71 ; CHECK-NEXT: jmp
72
73 ; Sparse cases should be searched with a binary search.
74 define internal i32 @testBinarySearch() {
75 entry:
76 switch i32 10, label %sw.default [
77 i32 0, label %sw.epilog
78 i32 10, label %sw.epilog
79 i32 20, label %sw.bb1
80 i32 30, label %sw.bb1
81 ]
82
83 sw.default: ; preds = %entry
84 br label %sw.epilog
85
86 sw.bb1: ; preds = %entry
87 br label %sw.epilog
88
89 sw.epilog: ; preds = %sw.default, %sw.bb1 , %entry
90 %result.1 = phi i32 [ 23, %sw.default ], [ 42, %sw.bb1 ], [ 17, %entry ], [ 17 , %entry ]
91 ret i32 %result.1
92 }
93 ; CHECK-LABEL: testBinarySearch
94 ; CHECK: cmp {{.*}},0x14
95 ; CHECK-NEXT: jb
96 ; CHECK-NEXT: je
97 ; CHECK-NEXT: cmp {{.*}},0x1e
98 ; CHECK-NEXT: je
99 ; CHECK-NEXT: jmp
100 ; CHECK-NEXT: cmp {{.*}},0x0
101 ; CHECK-NEXT: je
102 ; CHECK-NEXT: cmp {{.*}},0xa
103 ; CHECK-NEXT: je
104 ; CHECK-NEXT: jmp
105
106 ; 64-bit switches where the cases are all 32-bit values should be reduces to a
jvoung (off chromium) 2015/07/16 22:27:49 reduces -> reduced
ascull 2015/07/16 22:55:44 Done.
107 ; 32-bit switch after checking the top byte is 0.
108 define internal i32 @testSwitchSmall64(i64 %a) {
109 entry:
110 switch i64 %a, label %sw.default [
111 i64 123, label %return
112 i64 234, label %sw.bb1
113 i64 345, label %sw.bb2
114 i64 456, label %sw.bb3
115 ]
116
117 sw.bb1: ; preds = %entry
118 br label %return
119
120 sw.bb2: ; preds = %entry
121 br label %return
122
123 sw.bb3: ; preds = %entry
124 br label %return
125
126 sw.default: ; preds = %entry
127 br label %return
128
129 return: ; preds = %sw.default, %sw.bb3 , %sw.bb2, %sw.bb1, %entry
130 %retval.0 = phi i32 [ 5, %sw.default ], [ 4, %sw.bb3 ], [ 3, %sw.bb2 ], [ 2, % sw.bb1 ], [ 1, %entry ]
131 ret i32 %retval.0
132 }
133 ; CHECK-LABEL: testSwitchSmall64
134 ; CHECK: cmp {{.*}},0x0
135 ; CHECK-NEXT: jne
136 ; CHECK-NEXT: cmp {{.*}},0x159
137 ; CHECK-NEXT: jb
138 ; CHECK-NEXT: je
139 ; CHECK-NEXT: cmp {{.*}},0x1c8
140 ; CHECK-NEXT: je
141 ; CHECK-NEXT: jmp
142 ; CHECK-NEXT: cmp {{.*}},0x7b
143 ; CHECK-NEXT: je
144 ; CHECK-NEXT: cmp {{.*}},0xea
145 ; CHECK-NEXT: je
146 ; CHECK-NEXT: jmp
147
148 ; Test for correct 64-bit lowering.
149 ; TODO(ascull): this should generate better code like the 32-bit version
150 define internal i32 @testSwitch64(i64 %a) {
151 entry:
152 switch i64 %a, label %sw.default [
153 i64 123, label %return
154 i64 234, label %sw.bb1
155 i64 345, label %sw.bb2
156 i64 78187493520, label %sw.bb3
157 ]
158
159 sw.bb1: ; preds = %entry
160 br label %return
161
162 sw.bb2: ; preds = %entry
163 br label %return
164
165 sw.bb3: ; preds = %entry
166 br label %return
167
168 sw.default: ; preds = %entry
169 br label %return
170
171 return: ; preds = %sw.default, %sw.bb3 , %sw.bb2, %sw.bb1, %entry
172 %retval.0 = phi i32 [ 5, %sw.default ], [ 4, %sw.bb3 ], [ 3, %sw.bb2 ], [ 2, % sw.bb1 ], [ 1, %entry ]
173 ret i32 %retval.0
174 }
175 ; CHECK-LABEL: testSwitch64
176 ; CHECK: cmp {{.*}},0x7b
177 ; CHECK-NEXT: jne
178 ; CHECK-NEXT: cmp {{.*}},0x0
179 ; CHECK-NEXT: je
180 ; CHECK: cmp {{.*}},0xea
181 ; CHECK-NEXT: jne
182 ; CHECK-NEXT: cmp {{.*}},0x0
183 ; CHECK-NEXT: je
184 ; CHECK: cmp {{.*}},0x159
185 ; CHECK-NEXT: jne
186 ; CHECK-NEXT: cmp {{.*}},0x0
187 ; CHECK-NEXT: je
188 ; CHECK: cmp {{.*}},0x34567890
189 ; CHECK-NEXT: jne
190 ; CHECK-NEXT: cmp {{.*}},0x12
191 ; CHECK-NEXT: je
OLDNEW
« src/IceTargetLoweringX86BaseImpl.h ('K') | « src/IceTypes.def ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698