6 if (($Config::Config{'extensions'} !~ /\bB\b/) ){
7 print "1..0 # Skip -- Perl configured without B module\n";
10 if (!$Config::Config{useperlio}) {
11 print "1..0 # Skip -- need perlio to walk the optree\n";
19 pass("SORT OPTIMIZATION");
21 checkOptree ( name => 'sub {sort @a}',
22 code => sub {sort @a},
24 strip_open_hints => 1,
25 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
26 # 1 <;> nextstate(main 424 optree_sort.t:14) v:>,<,%
29 # 4 <1> rv2av[t2] lK/1
31 # 6 <1> leavesub[1 ref] K/REFC,1
33 # 1 <;> nextstate(main 424 optree_sort.t:14) v:>,<,%
36 # 4 <1> rv2av[t1] lK/1
38 # 6 <1> leavesub[1 ref] K/REFC,1
41 checkOptree ( name => 'sort @a',
43 errs => [ 'Useless use of sort in void context at -e line 1.',
44 'Name "main::a" used only once: possible typo at -e line 1.',
47 strip_open_hints => 1,
48 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
50 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
55 7 <@> leave[1 ref] vKP/REFC
58 # 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
61 # 5 <1> rv2av[t1] lK/1
63 # 7 <@> leave[1 ref] vKP/REFC
66 checkOptree ( name => 'sub {@a = sort @a}',
67 code => sub {@a = sort @a},
69 strip_open_hints => 1,
70 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
71 1 <;> nextstate(main -438 optree.t:244) v:>,<,%
79 9 <1> rv2av[t2] lKRM*/1
80 a <2> aassign[t5] KS/COMMON
81 b <1> leavesub[1 ref] K/REFC,1
83 # 1 <;> nextstate(main 65 optree.t:311) v:>,<,%
87 # 5 <1> rv2av[t2] lK/1
91 # 9 <1> rv2av[t1] lKRM*/1
92 # a <2> aassign[t3] KS/COMMON
93 # b <1> leavesub[1 ref] K/REFC,1
96 checkOptree ( name => '@a = sort @a',
97 prog => '@a = sort @a',
99 strip_open_hints => 1,
100 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
102 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
106 6 <1> rv2av[t4] lKRM*/1
107 7 <@> sort lK/INPLACE
108 8 <@> leave[1 ref] vKP/REFC
111 # 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
115 # 6 <1> rv2av[t2] lKRM*/1
116 # 7 <@> sort lK/INPLACE
117 # 8 <@> leave[1 ref] vKP/REFC
120 checkOptree ( name => 'sub {@a = sort @a; reverse @a}',
121 code => sub {@a = sort @a; reverse @a},
123 strip_open_hints => 1,
124 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
125 1 <;> nextstate(main -438 optree.t:286) v:>,<,%
129 5 <1> rv2av[t4] lKRM*/1
130 6 <@> sort lK/INPLACE
131 7 <;> nextstate(main -438 optree.t:288) v:>,<,%
135 b <@> reverse[t8] K/1
136 c <1> leavesub[1 ref] K/REFC,1
138 # 1 <;> nextstate(main 66 optree.t:345) v:>,<,%
142 # 5 <1> rv2av[t2] lKRM*/1
143 # 6 <@> sort lK/INPLACE
144 # 7 <;> nextstate(main 66 optree.t:346) v:>,<,%
147 # a <1> rv2av[t4] lK/1
148 # b <@> reverse[t5] K/1
149 # c <1> leavesub[1 ref] K/REFC,1
152 checkOptree ( name => '@a = sort @a; reverse @a',
153 prog => '@a = sort @a; reverse @a',
154 errs => ['Useless use of reverse in void context at -e line 1.'],
156 strip_open_hints => 1,
157 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
159 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
163 6 <1> rv2av[t4] lKRM*/1
164 7 <@> sort lK/INPLACE
165 8 <;> nextstate(main 1 -e:1) v:>,<,%,{
169 c <@> reverse[t8] vK/1
170 d <@> leave[1 ref] vKP/REFC
173 # 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
177 # 6 <1> rv2av[t2] lKRM*/1
178 # 7 <@> sort lK/INPLACE
179 # 8 <;> nextstate(main 1 -e:1) v:>,<,%,{
182 # b <1> rv2av[t4] lK/1
183 # c <@> reverse[t5] vK/1
184 # d <@> leave[1 ref] vKP/REFC
187 checkOptree ( name => 'sub {my @a; @a = sort @a}',
188 code => sub {my @a; @a = sort @a},
190 strip_open_hints => 1,
191 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
192 1 <;> nextstate(main -437 optree.t:254) v:>,<,%
193 2 <0> padav[@a:-437,-436] vM/LVINTRO
194 3 <;> nextstate(main -436 optree.t:256) v:>,<,%
197 6 <0> padav[@a:-437,-436] l
199 8 <0> padrange[@a:-437,-436] l/1
200 9 <2> aassign[t2] KS/COMMON
201 a <1> leavesub[1 ref] K/REFC,1
203 # 1 <;> nextstate(main 427 optree_sort.t:172) v:>,<,%
204 # 2 <0> padav[@a:427,428] vM/LVINTRO
205 # 3 <;> nextstate(main 428 optree_sort.t:173) v:>,<,%
208 # 6 <0> padav[@a:427,428] l
210 # 8 <0> padrange[@a:427,428] l/1
211 # 9 <2> aassign[t2] KS/COMMON
212 # a <1> leavesub[1 ref] K/REFC,1
215 checkOptree ( name => 'my @a; @a = sort @a',
216 prog => 'my @a; @a = sort @a',
218 strip_open_hints => 1,
219 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
221 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
222 3 <0> padav[@a:1,2] vM/LVINTRO
223 4 <;> nextstate(main 2 -e:1) v:>,<,%,{
225 6 <0> padrange[@a:1,2] l/1
226 7 <@> sort lK/INPLACE
227 8 <@> leave[1 ref] vKP/REFC
230 # 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
231 # 3 <0> padav[@a:1,2] vM/LVINTRO
232 # 4 <;> nextstate(main 2 -e:1) v:>,<,%,{
234 # 6 <0> padrange[@a:1,2] l/1
235 # 7 <@> sort lK/INPLACE
236 # 8 <@> leave[1 ref] vKP/REFC
239 checkOptree ( name => 'sub {my @a; @a = sort @a; push @a, 1}',
240 code => sub {my @a; @a = sort @a; push @a, 1},
243 strip_open_hints => 1,
244 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
245 1 <;> nextstate(main -437 optree.t:325) v:>,<,%
246 2 <0> padav[@a:-437,-436] vM/LVINTRO
247 3 <;> nextstate(main -436 optree.t:325) v:>,<,%
249 5 <0> padrange[@a:-437,-436] l/1
250 6 <@> sort lK/INPLACE
251 7 <;> nextstate(main -436 optree.t:325) v:>,<,%,{
252 8 <0> padrange[@a:-437,-436] l/1
255 b <1> leavesub[1 ref] K/REFC,1
257 # 1 <;> nextstate(main 429 optree_sort.t:219) v:>,<,%
258 # 2 <0> padav[@a:429,430] vM/LVINTRO
259 # 3 <;> nextstate(main 430 optree_sort.t:220) v:>,<,%
261 # 5 <0> padrange[@a:429,430] l/1
262 # 6 <@> sort lK/INPLACE
263 # 7 <;> nextstate(main 430 optree_sort.t:220) v:>,<,%,{
264 # 8 <0> padrange[@a:429,430] l/1
265 # 9 <$> const(IV 1) s
266 # a <@> push[t3] sK/2
267 # b <1> leavesub[1 ref] K/REFC,1
270 checkOptree ( name => 'sub {my @a; @a = sort @a; 1}',
271 code => sub {my @a; @a = sort @a; 1},
274 strip_open_hints => 1,
275 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
276 1 <;> nextstate(main -437 optree.t:325) v:>,<,%
277 2 <0> padav[@a:-437,-436] vM/LVINTRO
278 3 <;> nextstate(main -436 optree.t:325) v:>,<,%
280 5 <0> padrange[@a:-437,-436] l/1
281 6 <@> sort lK/INPLACE
282 7 <;> nextstate(main -436 optree.t:346) v:>,<,%,{
284 9 <1> leavesub[1 ref] K/REFC,1
286 # 1 <;> nextstate(main 431 optree_sort.t:250) v:>,<,%
287 # 2 <0> padav[@a:431,432] vM/LVINTRO
288 # 3 <;> nextstate(main 432 optree_sort.t:251) v:>,<,%
290 # 5 <0> padrange[@a:431,432] l/1
291 # 6 <@> sort lK/INPLACE
292 # 7 <;> nextstate(main 432 optree_sort.t:251) v:>,<,%,{
293 # 8 <$> const(IV 1) s
294 # 9 <1> leavesub[1 ref] K/REFC,1