Skip to content
This repository was archived by the owner on Jan 23, 2023. It is now read-only.

Commit 29c05d2

Browse files
authored
Merge pull request #23368 from sandreenko/PortStackOverFlowFixTo2.2
JIT: optimize fgMorphTree for GenTreeArgList
2 parents c716b5d + ddf5d3d commit 29c05d2

File tree

4 files changed

+325
-0
lines changed

4 files changed

+325
-0
lines changed

src/jit/compiler.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4923,6 +4923,7 @@ class Compiler
49234923
GenTree* fgMorphCast(GenTree* tree);
49244924
GenTree* fgUnwrapProxy(GenTree* objRef);
49254925
GenTreeCall* fgMorphArgs(GenTreeCall* call);
4926+
GenTreeArgList* fgMorphArgList(GenTreeArgList* args, MorphAddrContext* mac);
49264927

49274928
void fgMakeOutgoingStructArgCopy(GenTreeCall* call,
49284929
GenTree* args,

src/jit/morph.cpp

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12255,6 +12255,9 @@ GenTree* Compiler::fgMorphSmpOp(GenTree* tree, MorphAddrContext* mac)
1225512255
}
1225612256
break;
1225712257
#endif
12258+
case GT_LIST:
12259+
// Special handling for the arg list.
12260+
return fgMorphArgList(tree->AsArgList(), mac);
1225812261

1225912262
default:
1226012263
break;
@@ -20024,3 +20027,64 @@ bool Compiler::fgCheckStmtAfterTailCall()
2002420027
}
2002520028
return nextMorphStmt == nullptr;
2002620029
}
20030+
20031+
//------------------------------------------------------------------------
20032+
// fgMorphArgList: morph argument list tree without recursion.
20033+
//
20034+
// Arguments:
20035+
// args - argument list tree to morph;
20036+
// mac - morph address context, used to morph children.
20037+
//
20038+
// Return Value:
20039+
// morphed argument list.
20040+
//
20041+
GenTreeArgList* Compiler::fgMorphArgList(GenTreeArgList* args, MorphAddrContext* mac)
20042+
{
20043+
// Use a non-recursive algorithm that morphs all actual list values,
20044+
// memorizes the last node for each effect flag and resets
20045+
// them during the second iteration.
20046+
constexpr int numberOfTrackedFlags = 5;
20047+
constexpr unsigned trackedFlags[numberOfTrackedFlags] = {GTF_ASG, GTF_CALL, GTF_EXCEPT, GTF_GLOB_REF,
20048+
GTF_ORDER_SIDEEFF};
20049+
static_assert_no_msg((trackedFlags[0] | trackedFlags[1] | trackedFlags[2] | trackedFlags[3] | trackedFlags[4]) ==
20050+
GTF_ALL_EFFECT);
20051+
20052+
GenTree* memorizedLastNodes[numberOfTrackedFlags] = {nullptr};
20053+
20054+
for (GenTreeArgList* listNode = args; listNode != nullptr; listNode = listNode->Rest())
20055+
{
20056+
// Morph actual list values.
20057+
GenTree*& arg = listNode->Current();
20058+
arg = fgMorphTree(arg, mac);
20059+
20060+
// Remember the last list node with each flag.
20061+
for (int i = 0; i < numberOfTrackedFlags; ++i)
20062+
{
20063+
if ((arg->gtFlags & trackedFlags[i]) != 0)
20064+
{
20065+
memorizedLastNodes[i] = listNode;
20066+
}
20067+
}
20068+
}
20069+
20070+
for (GenTreeArgList* listNode = args; listNode != nullptr; listNode = listNode->Rest())
20071+
{
20072+
// Clear all old effects from the list node.
20073+
listNode->gtFlags &= ~GTF_ALL_EFFECT;
20074+
20075+
// Spread each flag to all list nodes (to the prefix) before the memorized last node.
20076+
for (int i = 0; i < numberOfTrackedFlags; ++i)
20077+
{
20078+
if (memorizedLastNodes[i] != nullptr)
20079+
{
20080+
listNode->gtFlags |= trackedFlags[i];
20081+
}
20082+
if (listNode == memorizedLastNodes[i])
20083+
{
20084+
memorizedLastNodes[i] = nullptr;
20085+
}
20086+
}
20087+
}
20088+
20089+
return args;
20090+
}
Lines changed: 221 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,221 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
// See the LICENSE file in the project root for more information.
4+
5+
using System;
6+
using System.Runtime.CompilerServices;
7+
using System.Threading;
8+
9+
// Repro for issue fixed 18582 (also seein in 23309) -- stack overflow when remorphing
10+
// call with a lot of arguments and some CSEs when running with limited stack (as is
11+
// done when CLR is hosted by IIS).
12+
13+
class GitHub_18582
14+
{
15+
[MethodImpl(MethodImplOptions.NoInlining)]
16+
static void Consume(
17+
int x000, int x001, int x002, int x003, int x004, int x005, int x006, int x007, int x008, int x009,
18+
int x010, int x011, int x012, int x013, int x014, int x015, int x016, int x017, int x018, int x019,
19+
int x020, int x021, int x022, int x023, int x024, int x025, int x026, int x027, int x028, int x029,
20+
int x030, int x031, int x032, int x033, int x034, int x035, int x036, int x037, int x038, int x039,
21+
int x040, int x041, int x042, int x043, int x044, int x045, int x046, int x047, int x048, int x049,
22+
int x050, int x051, int x052, int x053, int x054, int x055, int x056, int x057, int x058, int x059,
23+
int x060, int x061, int x062, int x063, int x064, int x065, int x066, int x067, int x068, int x069,
24+
int x070, int x071, int x072, int x073, int x074, int x075, int x076, int x077, int x078, int x079,
25+
int x080, int x081, int x082, int x083, int x084, int x085, int x086, int x087, int x088, int x089,
26+
int x090, int x091, int x092, int x093, int x094, int x095, int x096, int x097, int x098, int x099,
27+
int x100, int x101, int x102, int x103, int x104, int x105, int x106, int x107, int x108, int x109,
28+
int x110, int x111, int x112, int x113, int x114, int x115, int x116, int x117, int x118, int x119,
29+
int x120, int x121, int x122, int x123, int x124, int x125, int x126, int x127, int x128, int x129,
30+
int x130, int x131, int x132, int x133, int x134, int x135, int x136, int x137, int x138, int x139,
31+
int x140, int x141, int x142, int x143, int x144, int x145, int x146, int x147, int x148, int x149,
32+
int x150, int x151, int x152, int x153, int x154, int x155, int x156, int x157, int x158, int x159,
33+
int x160, int x161, int x162, int x163, int x164, int x165, int x166, int x167, int x168, int x169,
34+
int x170, int x171, int x172, int x173, int x174, int x175, int x176, int x177, int x178, int x179,
35+
int x180, int x181, int x182, int x183, int x184, int x185, int x186, int x187, int x188, int x189,
36+
int x190, int x191, int x192, int x193, int x194, int x195, int x196, int x197, int x198, int x199,
37+
int x200, int x201, int x202, int x203, int x204, int x205, int x206, int x207, int x208, int x209,
38+
int x210, int x211, int x212, int x213, int x214, int x215, int x216, int x217, int x218, int x219,
39+
int x220, int x221, int x222, int x223, int x224, int x225, int x226, int x227, int x228, int x229,
40+
int x230, int x231, int x232, int x233, int x234, int x235, int x236, int x237, int x238, int x239,
41+
int x240, int x241, int x242, int x243, int x244, int x245, int x246, int x247, int x248, int x249,
42+
int x250, int x251, int x252, int x253, int x254, int x255, int x256, int x257, int x258, int x259,
43+
int x260, int x261, int x262, int x263, int x264, int x265, int x266, int x267, int x268, int x269,
44+
int x270, int x271, int x272, int x273, int x274, int x275, int x276, int x277, int x278, int x279,
45+
int x280, int x281, int x282, int x283, int x284, int x285, int x286, int x287, int x288, int x289,
46+
int x290, int x291, int x292, int x293, int x294, int x295, int x296, int x297, int x298, int x299,
47+
int x300, int x301, int x302, int x303, int x304, int x305, int x306, int x307, int x308, int x309,
48+
int x310, int x311, int x312, int x313, int x314, int x315, int x316, int x317, int x318, int x319,
49+
int x320, int x321, int x322, int x323, int x324, int x325, int x326, int x327, int x328, int x329,
50+
int x330, int x331, int x332, int x333, int x334, int x335, int x336, int x337, int x338, int x339,
51+
int x340, int x341, int x342, int x343, int x344, int x345, int x346, int x347, int x348, int x349,
52+
int x350, int x351, int x352, int x353, int x354, int x355, int x356, int x357, int x358, int x359,
53+
int x360, int x361, int x362, int x363, int x364, int x365, int x366, int x367, int x368, int x369,
54+
int x370, int x371, int x372, int x373, int x374, int x375, int x376, int x377, int x378, int x379,
55+
int x380, int x381, int x382, int x383, int x384, int x385, int x386, int x387, int x388, int x389,
56+
int x390, int x391, int x392, int x393, int x394, int x395, int x396, int x397, int x398, int x399,
57+
int x400, int x401, int x402, int x403, int x404, int x405, int x406, int x407, int x408, int x409,
58+
int x410, int x411, int x412, int x413, int x414, int x415, int x416, int x417, int x418, int x419,
59+
int x420, int x421, int x422, int x423, int x424, int x425, int x426, int x427, int x428, int x429,
60+
int x430, int x431, int x432, int x433, int x434, int x435, int x436, int x437, int x438, int x439,
61+
int x440, int x441, int x442, int x443, int x444, int x445, int x446, int x447, int x448, int x449,
62+
int x450, int x451, int x452, int x453, int x454, int x455, int x456, int x457, int x458, int x459,
63+
int x460, int x461, int x462, int x463, int x464, int x465, int x466, int x467, int x468, int x469,
64+
int x470, int x471, int x472, int x473, int x474, int x475, int x476, int x477, int x478, int x479,
65+
int x480, int x481, int x482, int x483, int x484, int x485, int x486, int x487, int x488, int x489,
66+
int x490, int x491, int x492, int x493, int x494, int x495, int x496, int x497, int x498, int x499,
67+
int x500, int x501, int x502, int x503, int x504, int x505, int x506, int x507, int x508, int x509,
68+
int x510, int x511, int x512, int x513, int x514, int x515, int x516, int x517, int x518, int x519,
69+
int x520, int x521, int x522, int x523, int x524, int x525, int x526, int x527, int x528, int x529,
70+
int x530, int x531, int x532, int x533, int x534, int x535, int x536, int x537, int x538, int x539,
71+
int x540, int x541, int x542, int x543, int x544, int x545, int x546, int x547, int x548, int x549,
72+
int x550, int x551, int x552, int x553, int x554, int x555, int x556, int x557, int x558, int x559,
73+
int x560, int x561, int x562, int x563, int x564, int x565, int x566, int x567, int x568, int x569,
74+
int x570, int x571, int x572, int x573, int x574, int x575, int x576, int x577, int x578, int x579,
75+
int x580, int x581, int x582, int x583, int x584, int x585, int x586, int x587, int x588, int x589,
76+
int x590, int x591, int x592, int x593, int x594, int x595, int x596, int x597, int x598, int x599,
77+
int x600, int x601, int x602, int x603, int x604, int x605, int x606, int x607, int x608, int x609,
78+
int x610, int x611, int x612, int x613, int x614, int x615, int x616, int x617, int x618, int x619,
79+
int x620, int x621, int x622, int x623, int x624, int x625, int x626, int x627, int x628, int x629,
80+
int x630, int x631, int x632, int x633, int x634, int x635, int x636, int x637, int x638, int x639,
81+
int x640, int x641, int x642, int x643, int x644, int x645, int x646, int x647, int x648, int x649,
82+
int x650, int x651, int x652, int x653, int x654, int x655, int x656, int x657, int x658, int x659,
83+
int x660, int x661, int x662, int x663, int x664, int x665, int x666, int x667, int x668, int x669,
84+
int x670, int x671, int x672, int x673, int x674, int x675, int x676, int x677, int x678, int x679,
85+
int x680, int x681, int x682, int x683, int x684, int x685, int x686, int x687, int x688, int x689,
86+
int x690, int x691, int x692, int x693, int x694, int x695, int x696, int x697, int x698, int x699,
87+
int x700, int x701, int x702, int x703, int x704, int x705, int x706, int x707, int x708, int x709,
88+
int x710, int x711, int x712, int x713, int x714, int x715, int x716, int x717, int x718, int x719,
89+
int x720, int x721, int x722, int x723, int x724, int x725, int x726, int x727, int x728, int x729,
90+
int x730, int x731, int x732, int x733, int x734, int x735, int x736, int x737, int x738, int x739,
91+
int x740, int x741, int x742, int x743, int x744, int x745, int x746, int x747, int x748, int x749,
92+
int x750, int x751, int x752, int x753, int x754, int x755, int x756, int x757, int x758, int x759,
93+
int x760, int x761, int x762, int x763, int x764, int x765, int x766, int x767, int x768, int x769,
94+
int x770, int x771, int x772, int x773, int x774, int x775, int x776, int x777, int x778, int x779,
95+
int x780, int x781, int x782, int x783, int x784, int x785, int x786, int x787, int x788, int x789,
96+
int x790, int x791, int x792, int x793, int x794, int x795, int x796, int x797, int x798, int x799,
97+
int x800, int x801, int x802, int x803, int x804, int x805, int x806, int x807, int x808, int x809,
98+
int x810, int x811, int x812, int x813, int x814, int x815, int x816, int x817, int x818, int x819,
99+
int x820, int x821, int x822, int x823, int x824, int x825, int x826, int x827, int x828, int x829,
100+
int x830, int x831, int x832, int x833, int x834, int x835, int x836, int x837, int x838, int x839,
101+
int x840, int x841, int x842, int x843, int x844, int x845, int x846, int x847, int x848, int x849)
102+
{
103+
s_x = x000 + x099 + x749 + x849;
104+
}
105+
106+
[MethodImpl(MethodImplOptions.NoInlining)]
107+
static int q() => s_x + 1;
108+
109+
public static void Test()
110+
{
111+
int z = s_x;
112+
Consume(
113+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
114+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
115+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
116+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
117+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
118+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
119+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
120+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
121+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
122+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
123+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
124+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
125+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
126+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
127+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
128+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
129+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
130+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
131+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
132+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
133+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
134+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
135+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
136+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
137+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
138+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
139+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
140+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
141+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
142+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
143+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
144+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
145+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
146+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
147+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
148+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
149+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
150+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
151+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
152+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
153+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
154+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
155+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
156+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
157+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
158+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
159+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
160+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
161+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
162+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
163+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
164+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
165+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
166+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
167+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
168+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
169+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
170+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
171+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
172+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
173+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
174+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
175+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
176+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
177+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
178+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
179+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
180+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
181+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
182+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
183+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
184+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
185+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
186+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
187+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
188+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
189+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
190+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
191+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
192+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
193+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
194+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
195+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
196+
q(), q(), q(), q(), q(), q(), q(), q(), q(), q(),
197+
z + 1, z + 1, z + 1, z + 1, z + 1, z + 1, z + 1, z + 1, z + 1, z + 1);
198+
}
199+
200+
static int s_x;
201+
202+
public static int Main()
203+
{
204+
s_x = 1;
205+
int expected = 8;
206+
Thread t = new Thread(Test, 512 * 1024);
207+
t.Start();
208+
t.Join();
209+
210+
if (s_x == expected)
211+
{
212+
Console.WriteLine("PASSED");
213+
return 100;
214+
}
215+
else
216+
{
217+
Console.WriteLine($"FAILED, got {s_x}, expected {expected}");
218+
return -1;
219+
}
220+
}
221+
}

0 commit comments

Comments
 (0)