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
200 9 <0> padav[@a:-437,-436] lRM*
201 a <2> aassign[t2] KS/COMMON
202 b <1> leavesub[1 ref] K/REFC,1
204 # 1 <;> nextstate(main 427 optree_sort.t:172) v:>,<,%
205 # 2 <0> padav[@a:427,428] vM/LVINTRO
206 # 3 <;> nextstate(main 428 optree_sort.t:173) v:>,<,%
209 # 6 <0> padav[@a:427,428] l
212 # 9 <0> padav[@a:-437,-436] lRM*
213 # a <2> aassign[t2] KS/COMMON
214 # b <1> leavesub[1 ref] K/REFC,1
217 checkOptree ( name => 'my @a; @a = sort @a',
218 prog => 'my @a; @a = sort @a',
220 strip_open_hints => 1,
221 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
223 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
224 3 <0> padav[@a:1,2] vM/LVINTRO
225 4 <;> nextstate(main 2 -e:1) v:>,<,%,{
228 7 <0> padav[@a:1,2] lRM*
229 8 <@> sort lK/INPLACE
230 9 <@> leave[1 ref] vKP/REFC
233 # 2 <;> nextstate(main 1 -e:1) v:>,<,%,{
234 # 3 <0> padav[@a:1,2] vM/LVINTRO
235 # 4 <;> nextstate(main 2 -e:1) v:>,<,%,{
238 # 7 <0> padav[@a:1,2] lRM*
239 # 8 <@> sort lK/INPLACE
240 # 9 <@> leave[1 ref] vKP/REFC
243 checkOptree ( name => 'sub {my @a; @a = sort @a; push @a, 1}',
244 code => sub {my @a; @a = sort @a; push @a, 1},
247 strip_open_hints => 1,
248 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
249 1 <;> nextstate(main -437 optree.t:325) v:>,<,%
250 2 <0> padav[@a:-437,-436] vM/LVINTRO
251 3 <;> nextstate(main -436 optree.t:325) v:>,<,%
254 6 <0> padav[@a:-437,-436] lRM*
255 7 <@> sort lK/INPLACE
256 8 <;> nextstate(main -436 optree.t:325) v:>,<,%,{
258 a <0> padav[@a:-437,-436] lRM
261 d <1> leavesub[1 ref] K/REFC,1
263 # 1 <;> nextstate(main 429 optree_sort.t:219) v:>,<,%
264 # 2 <0> padav[@a:429,430] vM/LVINTRO
265 # 3 <;> nextstate(main 430 optree_sort.t:220) v:>,<,%
268 # 6 <0> padav[@a:429,430] lRM*
269 # 7 <@> sort lK/INPLACE
270 # 8 <;> nextstate(main 430 optree_sort.t:220) v:>,<,%,{
272 # a <0> padav[@a:429,430] lRM
273 # b <$> const(IV 1) s
274 # c <@> push[t3] sK/2
275 # d <1> leavesub[1 ref] K/REFC,1
278 checkOptree ( name => 'sub {my @a; @a = sort @a; 1}',
279 code => sub {my @a; @a = sort @a; 1},
282 strip_open_hints => 1,
283 expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
284 1 <;> nextstate(main -437 optree.t:325) v:>,<,%
285 2 <0> padav[@a:-437,-436] vM/LVINTRO
286 3 <;> nextstate(main -436 optree.t:325) v:>,<,%
289 6 <0> padav[@a:-437,-436] lRM*
290 7 <@> sort lK/INPLACE
291 8 <;> nextstate(main -436 optree.t:346) v:>,<,%,{
293 a <1> leavesub[1 ref] K/REFC,1
295 # 1 <;> nextstate(main 431 optree_sort.t:250) v:>,<,%
296 # 2 <0> padav[@a:431,432] vM/LVINTRO
297 # 3 <;> nextstate(main 432 optree_sort.t:251) v:>,<,%
300 # 6 <0> padav[@a:431,432] lRM*
301 # 7 <@> sort lK/INPLACE
302 # 8 <;> nextstate(main 432 optree_sort.t:251) v:>,<,%,{
303 # 9 <$> const(IV 1) s
304 # a <1> leavesub[1 ref] K/REFC,1