This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Skip padrange optimisation for one padop
[perl5.git] / ext / B / t / optree_sort.t
1 #!perl
2
3 BEGIN {
4     unshift @INC, 't';
5     require Config;
6     if (($Config::Config{'extensions'} !~ /\bB\b/) ){
7         print "1..0 # Skip -- Perl configured without B module\n";
8         exit 0;
9     }
10     if (!$Config::Config{useperlio}) {
11         print "1..0 # Skip -- need perlio to walk the optree\n";
12         exit 0;
13     }
14 }
15 use OptreeCheck;
16 use Config;
17 plan tests => 21;
18
19 pass("SORT OPTIMIZATION");
20
21 checkOptree ( name      => 'sub {sort @a}',
22               code      => sub {sort @a},
23               bcopts    => '-exec',
24               strip_open_hints => 1,
25               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
26 # 1  <;> nextstate(main 424 optree_sort.t:14) v:>,<,%
27 # 2  <0> pushmark s
28 # 3  <#> gv[*a] s
29 # 4  <1> rv2av[t2] lK/1
30 # 5  <@> sort K
31 # 6  <1> leavesub[1 ref] K/REFC,1
32 EOT_EOT
33 # 1  <;> nextstate(main 424 optree_sort.t:14) v:>,<,%
34 # 2  <0> pushmark s
35 # 3  <$> gv(*a) s
36 # 4  <1> rv2av[t1] lK/1
37 # 5  <@> sort K
38 # 6  <1> leavesub[1 ref] K/REFC,1
39 EONT_EONT
40
41 checkOptree ( name => 'sort @a',
42               prog => '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.',
45                         ],
46               bcopts => '-exec',
47               strip_open_hints => 1,
48               expect => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
49 1  <0> enter 
50 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
51 3  <0> pushmark s
52 4  <#> gv[*a] s
53 5  <1> rv2av[t2] lK/1
54 6  <@> sort vK
55 7  <@> leave[1 ref] vKP/REFC
56 EOT_EOT
57 # 1  <0> enter 
58 # 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
59 # 3  <0> pushmark s
60 # 4  <$> gv(*a) s
61 # 5  <1> rv2av[t1] lK/1
62 # 6  <@> sort vK
63 # 7  <@> leave[1 ref] vKP/REFC
64 EONT_EONT
65
66 checkOptree ( name      => 'sub {@a = sort @a}',
67               code      => sub {@a = sort @a},
68               bcopts    => '-exec',
69               strip_open_hints => 1,
70               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
71 1  <;> nextstate(main -438 optree.t:244) v:>,<,%
72 2  <0> pushmark s
73 3  <0> pushmark s
74 4  <#> gv[*a] s
75 5  <1> rv2av[t4] lK/1
76 6  <@> sort lK
77 7  <0> pushmark s
78 8  <#> gv[*a] s
79 9  <1> rv2av[t2] lKRM*/1
80 a  <2> aassign[t5] KS/COMMON
81 b  <1> leavesub[1 ref] K/REFC,1
82 EOT_EOT
83 # 1  <;> nextstate(main 65 optree.t:311) v:>,<,%
84 # 2  <0> pushmark s
85 # 3  <0> pushmark s
86 # 4  <$> gv(*a) s
87 # 5  <1> rv2av[t2] lK/1
88 # 6  <@> sort lK
89 # 7  <0> pushmark s
90 # 8  <$> gv(*a) s
91 # 9  <1> rv2av[t1] lKRM*/1
92 # a  <2> aassign[t3] KS/COMMON
93 # b  <1> leavesub[1 ref] K/REFC,1
94 EONT_EONT
95
96 checkOptree ( name      => '@a = sort @a',
97               prog      => '@a = sort @a',
98               bcopts    => '-exec',
99               strip_open_hints => 1,
100               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
101 1  <0> enter 
102 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
103 3  <0> pushmark s
104 4  <0> pushmark s
105 5  <#> gv[*a] s
106 6  <1> rv2av[t4] lKRM*/1
107 7  <@> sort lK/INPLACE
108 8  <@> leave[1 ref] vKP/REFC
109 EOT_EOT
110 # 1  <0> enter 
111 # 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
112 # 3  <0> pushmark s
113 # 4  <0> pushmark s
114 # 5  <$> gv(*a) s
115 # 6  <1> rv2av[t2] lKRM*/1
116 # 7  <@> sort lK/INPLACE
117 # 8  <@> leave[1 ref] vKP/REFC
118 EONT_EONT
119
120 checkOptree ( name      => 'sub {@a = sort @a; reverse @a}',
121               code      => sub {@a = sort @a; reverse @a},
122               bcopts    => '-exec',
123               strip_open_hints => 1,
124               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
125 1  <;> nextstate(main -438 optree.t:286) v:>,<,%
126 2  <0> pushmark s
127 3  <0> pushmark s
128 4  <#> gv[*a] s
129 5  <1> rv2av[t4] lKRM*/1
130 6  <@> sort lK/INPLACE
131 7  <;> nextstate(main -438 optree.t:288) v:>,<,%
132 8  <0> pushmark s
133 9  <#> gv[*a] s
134 a  <1> rv2av[t7] lK/1
135 b  <@> reverse[t8] K/1
136 c  <1> leavesub[1 ref] K/REFC,1
137 EOT_EOT
138 # 1  <;> nextstate(main 66 optree.t:345) v:>,<,%
139 # 2  <0> pushmark s
140 # 3  <0> pushmark s
141 # 4  <$> gv(*a) s
142 # 5  <1> rv2av[t2] lKRM*/1
143 # 6  <@> sort lK/INPLACE
144 # 7  <;> nextstate(main 66 optree.t:346) v:>,<,%
145 # 8  <0> pushmark s
146 # 9  <$> gv(*a) s
147 # a  <1> rv2av[t4] lK/1
148 # b  <@> reverse[t5] K/1
149 # c  <1> leavesub[1 ref] K/REFC,1
150 EONT_EONT
151
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.'],
155               bcopts    => '-exec',
156               strip_open_hints => 1,
157               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
158 1  <0> enter 
159 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
160 3  <0> pushmark s
161 4  <0> pushmark s
162 5  <#> gv[*a] s
163 6  <1> rv2av[t4] lKRM*/1
164 7  <@> sort lK/INPLACE
165 8  <;> nextstate(main 1 -e:1) v:>,<,%,{
166 9  <0> pushmark s
167 a  <#> gv[*a] s
168 b  <1> rv2av[t7] lK/1
169 c  <@> reverse[t8] vK/1
170 d  <@> leave[1 ref] vKP/REFC
171 EOT_EOT
172 # 1  <0> enter 
173 # 2  <;> nextstate(main 1 -e:1) v:>,<,%,{
174 # 3  <0> pushmark s
175 # 4  <0> pushmark s
176 # 5  <$> gv(*a) s
177 # 6  <1> rv2av[t2] lKRM*/1
178 # 7  <@> sort lK/INPLACE
179 # 8  <;> nextstate(main 1 -e:1) v:>,<,%,{
180 # 9  <0> pushmark s
181 # a  <$> gv(*a) s
182 # b  <1> rv2av[t4] lK/1
183 # c  <@> reverse[t5] vK/1
184 # d  <@> leave[1 ref] vKP/REFC
185 EONT_EONT
186
187 checkOptree ( name      => 'sub {my @a; @a = sort @a}',
188               code      => sub {my @a; @a = sort @a},
189               bcopts    => '-exec',
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:>,<,%
195 4  <0> pushmark s
196 5  <0> pushmark s
197 6  <0> padav[@a:-437,-436] l
198 7  <@> sort lK
199 8  <0> pushmark s
200 9  <0> padav[@a:-437,-436] lRM*
201 a  <2> aassign[t2] KS/COMMON
202 b  <1> leavesub[1 ref] K/REFC,1
203 EOT_EOT
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:>,<,%
207 # 4  <0> pushmark s
208 # 5  <0> pushmark s
209 # 6  <0> padav[@a:427,428] l
210 # 7  <@> sort lK
211 # 8  <0> pushmark s
212 # 9  <0> padav[@a:-437,-436] lRM*
213 # a  <2> aassign[t2] KS/COMMON
214 # b  <1> leavesub[1 ref] K/REFC,1
215 EONT_EONT
216
217 checkOptree ( name      => 'my @a; @a = sort @a',
218               prog      => 'my @a; @a = sort @a',
219               bcopts    => '-exec',
220               strip_open_hints => 1,
221               expect    => <<'EOT_EOT', expect_nt => <<'EONT_EONT');
222 1  <0> enter 
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:>,<,%,{
226 5  <0> pushmark s
227 6  <0> pushmark s
228 7  <0> padav[@a:1,2] lRM*
229 8  <@> sort lK/INPLACE
230 9  <@> leave[1 ref] vKP/REFC
231 EOT_EOT
232 # 1  <0> enter 
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:>,<,%,{
236 # 5  <0> pushmark s
237 # 6  <0> pushmark s
238 # 7  <0> padav[@a:1,2] lRM*
239 # 8  <@> sort lK/INPLACE
240 # 9  <@> leave[1 ref] vKP/REFC
241 EONT_EONT
242
243 checkOptree ( name      => 'sub {my @a; @a = sort @a; push @a, 1}',
244               code      => sub {my @a; @a = sort @a; push @a, 1},
245               bcopts    => '-exec',
246               debug     => 0,
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:>,<,%
252 4  <0> pushmark s
253 5  <0> pushmark s
254 6  <0> padav[@a:-437,-436] lRM*
255 7  <@> sort lK/INPLACE
256 8  <;> nextstate(main -436 optree.t:325) v:>,<,%,{
257 9  <0> pushmark s
258 a  <0> padav[@a:-437,-436] lRM
259 b  <$> const[IV 1] s
260 c  <@> push[t3] sK/2
261 d  <1> leavesub[1 ref] K/REFC,1
262 EOT_EOT
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:>,<,%
266 # 4  <0> pushmark s
267 # 5  <0> pushmark s
268 # 6  <0> padav[@a:429,430] lRM*
269 # 7  <@> sort lK/INPLACE
270 # 8  <;> nextstate(main 430 optree_sort.t:220) v:>,<,%,{
271 # 9  <0> pushmark s
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
276 EONT_EONT
277
278 checkOptree ( name      => 'sub {my @a; @a = sort @a; 1}',
279               code      => sub {my @a; @a = sort @a; 1},
280               bcopts    => '-exec',
281               debug     => 0,
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:>,<,%
287 4  <0> pushmark s
288 5  <0> pushmark s
289 6  <0> padav[@a:-437,-436] lRM*
290 7  <@> sort lK/INPLACE
291 8  <;> nextstate(main -436 optree.t:346) v:>,<,%,{
292 9  <$> const[IV 1] s
293 a  <1> leavesub[1 ref] K/REFC,1
294 EOT_EOT
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:>,<,%
298 # 4  <0> pushmark s
299 # 5  <0> pushmark s
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
305 EONT_EONT