Skip to content

Commit e5cae16

Browse files
SanderMullerclaude
andcommitted
Add bench data for the constant-scalar-union intersect fast path
The #14869 reproducer: a variable assigned under many `$x === <const>` branches. The conditional-expression machinery repeatedly intersects the variable's growing constant-value union with the narrowed union, which the finite-union fast path turns from super-linear into an O(n) set intersection. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 4aa4f46 commit e5cae16

1 file changed

Lines changed: 267 additions & 0 deletions

File tree

tests/bench/data/bug-14869.php

Lines changed: 267 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,267 @@
1+
<?php
2+
3+
namespace Bug14869;
4+
5+
/**
6+
* Exercises the constant-scalar-union fast path in TypeCombinator::intersect().
7+
*
8+
* Assigning a variable under many `$x === <const>` branches makes the
9+
* conditional-expression machinery repeatedly intersect $v growing
10+
* constant-value union with the narrowed union. Before the fast path this
11+
* was super-linear (O(N^2.3), ~21s at N=400); the identity-keyed set
12+
* intersection turns each intersect O(n). phpstan/phpstan#14869.
13+
*/
14+
15+
function intChain(int $x): string
16+
{
17+
$v = 0;
18+
if ($x === 0) { $v = 0; }
19+
if ($x === 1) { $v = 1; }
20+
if ($x === 2) { $v = 2; }
21+
if ($x === 3) { $v = 3; }
22+
if ($x === 4) { $v = 4; }
23+
if ($x === 5) { $v = 5; }
24+
if ($x === 6) { $v = 6; }
25+
if ($x === 7) { $v = 7; }
26+
if ($x === 8) { $v = 8; }
27+
if ($x === 9) { $v = 9; }
28+
if ($x === 10) { $v = 10; }
29+
if ($x === 11) { $v = 11; }
30+
if ($x === 12) { $v = 12; }
31+
if ($x === 13) { $v = 13; }
32+
if ($x === 14) { $v = 14; }
33+
if ($x === 15) { $v = 15; }
34+
if ($x === 16) { $v = 16; }
35+
if ($x === 17) { $v = 17; }
36+
if ($x === 18) { $v = 18; }
37+
if ($x === 19) { $v = 19; }
38+
if ($x === 20) { $v = 20; }
39+
if ($x === 21) { $v = 21; }
40+
if ($x === 22) { $v = 22; }
41+
if ($x === 23) { $v = 23; }
42+
if ($x === 24) { $v = 24; }
43+
if ($x === 25) { $v = 25; }
44+
if ($x === 26) { $v = 26; }
45+
if ($x === 27) { $v = 27; }
46+
if ($x === 28) { $v = 28; }
47+
if ($x === 29) { $v = 29; }
48+
if ($x === 30) { $v = 30; }
49+
if ($x === 31) { $v = 31; }
50+
if ($x === 32) { $v = 32; }
51+
if ($x === 33) { $v = 33; }
52+
if ($x === 34) { $v = 34; }
53+
if ($x === 35) { $v = 35; }
54+
if ($x === 36) { $v = 36; }
55+
if ($x === 37) { $v = 37; }
56+
if ($x === 38) { $v = 38; }
57+
if ($x === 39) { $v = 39; }
58+
if ($x === 40) { $v = 40; }
59+
if ($x === 41) { $v = 41; }
60+
if ($x === 42) { $v = 42; }
61+
if ($x === 43) { $v = 43; }
62+
if ($x === 44) { $v = 44; }
63+
if ($x === 45) { $v = 45; }
64+
if ($x === 46) { $v = 46; }
65+
if ($x === 47) { $v = 47; }
66+
if ($x === 48) { $v = 48; }
67+
if ($x === 49) { $v = 49; }
68+
if ($x === 50) { $v = 50; }
69+
if ($x === 51) { $v = 51; }
70+
if ($x === 52) { $v = 52; }
71+
if ($x === 53) { $v = 53; }
72+
if ($x === 54) { $v = 54; }
73+
if ($x === 55) { $v = 55; }
74+
if ($x === 56) { $v = 56; }
75+
if ($x === 57) { $v = 57; }
76+
if ($x === 58) { $v = 58; }
77+
if ($x === 59) { $v = 59; }
78+
if ($x === 60) { $v = 60; }
79+
if ($x === 61) { $v = 61; }
80+
if ($x === 62) { $v = 62; }
81+
if ($x === 63) { $v = 63; }
82+
if ($x === 64) { $v = 64; }
83+
if ($x === 65) { $v = 65; }
84+
if ($x === 66) { $v = 66; }
85+
if ($x === 67) { $v = 67; }
86+
if ($x === 68) { $v = 68; }
87+
if ($x === 69) { $v = 69; }
88+
if ($x === 70) { $v = 70; }
89+
if ($x === 71) { $v = 71; }
90+
if ($x === 72) { $v = 72; }
91+
if ($x === 73) { $v = 73; }
92+
if ($x === 74) { $v = 74; }
93+
if ($x === 75) { $v = 75; }
94+
if ($x === 76) { $v = 76; }
95+
if ($x === 77) { $v = 77; }
96+
if ($x === 78) { $v = 78; }
97+
if ($x === 79) { $v = 79; }
98+
if ($x === 80) { $v = 80; }
99+
if ($x === 81) { $v = 81; }
100+
if ($x === 82) { $v = 82; }
101+
if ($x === 83) { $v = 83; }
102+
if ($x === 84) { $v = 84; }
103+
if ($x === 85) { $v = 85; }
104+
if ($x === 86) { $v = 86; }
105+
if ($x === 87) { $v = 87; }
106+
if ($x === 88) { $v = 88; }
107+
if ($x === 89) { $v = 89; }
108+
if ($x === 90) { $v = 90; }
109+
if ($x === 91) { $v = 91; }
110+
if ($x === 92) { $v = 92; }
111+
if ($x === 93) { $v = 93; }
112+
if ($x === 94) { $v = 94; }
113+
if ($x === 95) { $v = 95; }
114+
if ($x === 96) { $v = 96; }
115+
if ($x === 97) { $v = 97; }
116+
if ($x === 98) { $v = 98; }
117+
if ($x === 99) { $v = 99; }
118+
if ($x === 100) { $v = 100; }
119+
if ($x === 101) { $v = 101; }
120+
if ($x === 102) { $v = 102; }
121+
if ($x === 103) { $v = 103; }
122+
if ($x === 104) { $v = 104; }
123+
if ($x === 105) { $v = 105; }
124+
if ($x === 106) { $v = 106; }
125+
if ($x === 107) { $v = 107; }
126+
if ($x === 108) { $v = 108; }
127+
if ($x === 109) { $v = 109; }
128+
if ($x === 110) { $v = 110; }
129+
if ($x === 111) { $v = 111; }
130+
if ($x === 112) { $v = 112; }
131+
if ($x === 113) { $v = 113; }
132+
if ($x === 114) { $v = 114; }
133+
if ($x === 115) { $v = 115; }
134+
if ($x === 116) { $v = 116; }
135+
if ($x === 117) { $v = 117; }
136+
if ($x === 118) { $v = 118; }
137+
if ($x === 119) { $v = 119; }
138+
139+
return (string) $v;
140+
}
141+
142+
function stringChain(int $x): string
143+
{
144+
$v = "";
145+
if ($x === 0) { $v = "v0"; }
146+
if ($x === 1) { $v = "v1"; }
147+
if ($x === 2) { $v = "v2"; }
148+
if ($x === 3) { $v = "v3"; }
149+
if ($x === 4) { $v = "v4"; }
150+
if ($x === 5) { $v = "v5"; }
151+
if ($x === 6) { $v = "v6"; }
152+
if ($x === 7) { $v = "v7"; }
153+
if ($x === 8) { $v = "v8"; }
154+
if ($x === 9) { $v = "v9"; }
155+
if ($x === 10) { $v = "v10"; }
156+
if ($x === 11) { $v = "v11"; }
157+
if ($x === 12) { $v = "v12"; }
158+
if ($x === 13) { $v = "v13"; }
159+
if ($x === 14) { $v = "v14"; }
160+
if ($x === 15) { $v = "v15"; }
161+
if ($x === 16) { $v = "v16"; }
162+
if ($x === 17) { $v = "v17"; }
163+
if ($x === 18) { $v = "v18"; }
164+
if ($x === 19) { $v = "v19"; }
165+
if ($x === 20) { $v = "v20"; }
166+
if ($x === 21) { $v = "v21"; }
167+
if ($x === 22) { $v = "v22"; }
168+
if ($x === 23) { $v = "v23"; }
169+
if ($x === 24) { $v = "v24"; }
170+
if ($x === 25) { $v = "v25"; }
171+
if ($x === 26) { $v = "v26"; }
172+
if ($x === 27) { $v = "v27"; }
173+
if ($x === 28) { $v = "v28"; }
174+
if ($x === 29) { $v = "v29"; }
175+
if ($x === 30) { $v = "v30"; }
176+
if ($x === 31) { $v = "v31"; }
177+
if ($x === 32) { $v = "v32"; }
178+
if ($x === 33) { $v = "v33"; }
179+
if ($x === 34) { $v = "v34"; }
180+
if ($x === 35) { $v = "v35"; }
181+
if ($x === 36) { $v = "v36"; }
182+
if ($x === 37) { $v = "v37"; }
183+
if ($x === 38) { $v = "v38"; }
184+
if ($x === 39) { $v = "v39"; }
185+
if ($x === 40) { $v = "v40"; }
186+
if ($x === 41) { $v = "v41"; }
187+
if ($x === 42) { $v = "v42"; }
188+
if ($x === 43) { $v = "v43"; }
189+
if ($x === 44) { $v = "v44"; }
190+
if ($x === 45) { $v = "v45"; }
191+
if ($x === 46) { $v = "v46"; }
192+
if ($x === 47) { $v = "v47"; }
193+
if ($x === 48) { $v = "v48"; }
194+
if ($x === 49) { $v = "v49"; }
195+
if ($x === 50) { $v = "v50"; }
196+
if ($x === 51) { $v = "v51"; }
197+
if ($x === 52) { $v = "v52"; }
198+
if ($x === 53) { $v = "v53"; }
199+
if ($x === 54) { $v = "v54"; }
200+
if ($x === 55) { $v = "v55"; }
201+
if ($x === 56) { $v = "v56"; }
202+
if ($x === 57) { $v = "v57"; }
203+
if ($x === 58) { $v = "v58"; }
204+
if ($x === 59) { $v = "v59"; }
205+
if ($x === 60) { $v = "v60"; }
206+
if ($x === 61) { $v = "v61"; }
207+
if ($x === 62) { $v = "v62"; }
208+
if ($x === 63) { $v = "v63"; }
209+
if ($x === 64) { $v = "v64"; }
210+
if ($x === 65) { $v = "v65"; }
211+
if ($x === 66) { $v = "v66"; }
212+
if ($x === 67) { $v = "v67"; }
213+
if ($x === 68) { $v = "v68"; }
214+
if ($x === 69) { $v = "v69"; }
215+
if ($x === 70) { $v = "v70"; }
216+
if ($x === 71) { $v = "v71"; }
217+
if ($x === 72) { $v = "v72"; }
218+
if ($x === 73) { $v = "v73"; }
219+
if ($x === 74) { $v = "v74"; }
220+
if ($x === 75) { $v = "v75"; }
221+
if ($x === 76) { $v = "v76"; }
222+
if ($x === 77) { $v = "v77"; }
223+
if ($x === 78) { $v = "v78"; }
224+
if ($x === 79) { $v = "v79"; }
225+
if ($x === 80) { $v = "v80"; }
226+
if ($x === 81) { $v = "v81"; }
227+
if ($x === 82) { $v = "v82"; }
228+
if ($x === 83) { $v = "v83"; }
229+
if ($x === 84) { $v = "v84"; }
230+
if ($x === 85) { $v = "v85"; }
231+
if ($x === 86) { $v = "v86"; }
232+
if ($x === 87) { $v = "v87"; }
233+
if ($x === 88) { $v = "v88"; }
234+
if ($x === 89) { $v = "v89"; }
235+
if ($x === 90) { $v = "v90"; }
236+
if ($x === 91) { $v = "v91"; }
237+
if ($x === 92) { $v = "v92"; }
238+
if ($x === 93) { $v = "v93"; }
239+
if ($x === 94) { $v = "v94"; }
240+
if ($x === 95) { $v = "v95"; }
241+
if ($x === 96) { $v = "v96"; }
242+
if ($x === 97) { $v = "v97"; }
243+
if ($x === 98) { $v = "v98"; }
244+
if ($x === 99) { $v = "v99"; }
245+
if ($x === 100) { $v = "v100"; }
246+
if ($x === 101) { $v = "v101"; }
247+
if ($x === 102) { $v = "v102"; }
248+
if ($x === 103) { $v = "v103"; }
249+
if ($x === 104) { $v = "v104"; }
250+
if ($x === 105) { $v = "v105"; }
251+
if ($x === 106) { $v = "v106"; }
252+
if ($x === 107) { $v = "v107"; }
253+
if ($x === 108) { $v = "v108"; }
254+
if ($x === 109) { $v = "v109"; }
255+
if ($x === 110) { $v = "v110"; }
256+
if ($x === 111) { $v = "v111"; }
257+
if ($x === 112) { $v = "v112"; }
258+
if ($x === 113) { $v = "v113"; }
259+
if ($x === 114) { $v = "v114"; }
260+
if ($x === 115) { $v = "v115"; }
261+
if ($x === 116) { $v = "v116"; }
262+
if ($x === 117) { $v = "v117"; }
263+
if ($x === 118) { $v = "v118"; }
264+
if ($x === 119) { $v = "v119"; }
265+
266+
return $v;
267+
}

0 commit comments

Comments
 (0)