Skip to content

Commit ac4b7c6

Browse files
authored
Arm: Consider the fact that targetReg can be second half during resolution (#107493)
* Arm: Consider the fact that targetReg can be second half during resolution * add test case * Make sure we only handle float registers * fix test case's public methods
1 parent 18eedbe commit ac4b7c6

File tree

3 files changed

+307
-4
lines changed

3 files changed

+307
-4
lines changed

src/coreclr/jit/lsra.cpp

Lines changed: 53 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9789,10 +9789,26 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock,
97899789
if (location[targetReg] == REG_NA)
97909790
{
97919791
#ifdef TARGET_ARM
9792-
regNumber sourceReg = (regNumber)source[targetReg];
9793-
Interval* interval = sourceIntervals[sourceReg];
9792+
// For Arm, check two things:
9793+
// 1. If sourceReg relates to DOUBLE interval, then make sure
9794+
// the second half of targetReg is not participating in the resolution.
9795+
// 2. On the contrary, if targetReg is second half of a DOUBLE interval,
9796+
// then make sure the first half is not participating in the resolution.
9797+
// Only when both these conditions are met, can we safely assume
9798+
// that sourceReg can be moved to targetReg.
9799+
regNumber sourceReg = (regNumber)source[targetReg];
9800+
Interval* interval = sourceIntervals[sourceReg];
9801+
Interval* otherTargetInterval = nullptr;
9802+
regNumber otherHalfTargetReg = REG_NA;
9803+
if (genIsValidFloatReg(targetReg) && !genIsValidDoubleReg(targetReg))
9804+
{
9805+
otherHalfTargetReg = REG_PREV(targetReg);
9806+
otherTargetInterval = sourceIntervals[otherHalfTargetReg];
9807+
}
9808+
97949809
if (interval->registerType == TYP_DOUBLE)
97959810
{
9811+
// Condition 1 above.
97969812
// For ARM32, make sure that both of the float halves of the double register are available.
97979813
assert(genIsValidDoubleReg(targetReg));
97989814
regNumber anotherHalfRegNum = REG_NEXT(targetReg);
@@ -9801,11 +9817,22 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock,
98019817
targetRegsReady.AddRegNumInMask(targetReg);
98029818
}
98039819
}
9820+
else if ((otherTargetInterval != nullptr) && (otherTargetInterval->registerType == TYP_DOUBLE))
9821+
{
9822+
// Condition 2 above.
9823+
assert(otherHalfTargetReg != REG_NA);
9824+
if (location[otherHalfTargetReg] == REG_NA)
9825+
{
9826+
targetRegsReady.AddRegNumInMask(targetReg);
9827+
}
9828+
}
98049829
else
9805-
#endif // TARGET_ARM
98069830
{
98079831
targetRegsReady.AddRegNumInMask(targetReg);
98089832
}
9833+
#else
9834+
targetRegsReady.AddRegNumInMask(targetReg);
9835+
#endif
98099836
}
98109837
}
98119838

@@ -10019,6 +10046,13 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock,
1001910046
{
1002010047
compiler->codeGen->regSet.rsSetRegsModified(genRegMask(tempReg) DEBUGARG(true));
1002110048
#ifdef TARGET_ARM
10049+
Interval* otherTargetInterval = nullptr;
10050+
regNumber otherHalfTargetReg = REG_NA;
10051+
if (genIsValidFloatReg(targetReg) && !genIsValidDoubleReg(targetReg))
10052+
{
10053+
otherHalfTargetReg = REG_PREV(targetReg);
10054+
otherTargetInterval = sourceIntervals[otherHalfTargetReg];
10055+
}
1002210056
if (sourceIntervals[fromReg]->registerType == TYP_DOUBLE)
1002310057
{
1002410058
assert(genIsValidDoubleReg(targetReg));
@@ -10027,8 +10061,15 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock,
1002710061
addResolutionForDouble(block, insertionPoint, sourceIntervals, location, tempReg, targetReg,
1002810062
resolveType DEBUG_ARG(fromBlock) DEBUG_ARG(toBlock));
1002910063
}
10064+
else if (otherTargetInterval != nullptr)
10065+
{
10066+
assert(otherHalfTargetReg != REG_NA);
10067+
assert(otherTargetInterval->registerType == TYP_DOUBLE);
10068+
10069+
addResolutionForDouble(block, insertionPoint, sourceIntervals, location, tempReg,
10070+
otherHalfTargetReg, resolveType DEBUG_ARG(fromBlock) DEBUG_ARG(toBlock));
10071+
}
1003010072
else
10031-
#endif // TARGET_ARM
1003210073
{
1003310074
assert(sourceIntervals[targetReg] != nullptr);
1003410075

@@ -10037,6 +10078,14 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock,
1003710078
DEBUG_ARG(resolveTypeName[resolveType]));
1003810079
location[targetReg] = (regNumberSmall)tempReg;
1003910080
}
10081+
#else
10082+
assert(sourceIntervals[targetReg] != nullptr);
10083+
10084+
addResolution(block, insertionPoint, sourceIntervals[targetReg], tempReg,
10085+
targetReg DEBUG_ARG(fromBlock) DEBUG_ARG(toBlock)
10086+
DEBUG_ARG(resolveTypeName[resolveType]));
10087+
location[targetReg] = (regNumberSmall)tempReg;
10088+
#endif // TARGET_ARM
1004010089
targetRegsReady |= targetRegMask;
1004110090
}
1004210091
}
Lines changed: 246 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,246 @@
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+
4+
// Generated by Fuzzlyn v2.1 on 2024-07-28 15:37:46
5+
// Run on Arm Linux
6+
// Seed: 8024459297219020330
7+
// Reduced from 3285.8 KiB to 12.2 KiB in 01:46:03
8+
// Hits JIT assert in Release:
9+
// Assertion failed 'varDsc->IsAlwaysAliveInMemory() || ((regSet.GetMaskVars() & regMask) == 0)' in 'Program:Main(Fuzzlyn.ExecutionServer.IRuntime)' during 'Generate code' (IL size 7170; hash 0xade6b36b; FullOpts)
10+
//
11+
// File: /__w/1/s/src/coreclr/jit/codegencommon.cpp Line: 664
12+
//
13+
using System;
14+
using System.Runtime.CompilerServices;
15+
using Xunit;
16+
17+
public interface I1
18+
{
19+
}
20+
21+
public struct S0
22+
{
23+
public double F0;
24+
public sbyte F1;
25+
public ulong F2;
26+
public int F3;
27+
public ulong F4;
28+
public ulong F6;
29+
public int F7;
30+
public long F8;
31+
public S0(double f0, ulong f2, ulong f4, float f5, ulong f6, int f7, long f8) : this()
32+
{
33+
}
34+
}
35+
36+
public struct S1
37+
{
38+
public int F0;
39+
public S0 F2;
40+
public S0 F3;
41+
public S0 F4;
42+
public S1(int f0, double f1, S0 f2, S0 f3, S0 f4) : this()
43+
{
44+
}
45+
}
46+
47+
public struct S2 : I1
48+
{
49+
public S1 F2;
50+
public ushort F4;
51+
public S1 F6;
52+
public S1 F7;
53+
public S2(sbyte f0, ulong f1, S1 f2, ushort f4, byte f5, S1 f6, S1 f7) : this()
54+
{
55+
}
56+
}
57+
58+
public class C0
59+
{
60+
public S1 F1;
61+
public C0(S1 f1)
62+
{
63+
}
64+
}
65+
66+
public struct S3 : I1
67+
{
68+
public S3(short f0) : this()
69+
{
70+
}
71+
}
72+
73+
public struct S4 : I1
74+
{
75+
public S3 F0;
76+
public S2 F1;
77+
public S4(S3 f0, S2 f1, float f2, S0 f3, int f5) : this()
78+
{
79+
}
80+
}
81+
82+
public struct S5
83+
{
84+
public C0 F0;
85+
public S5(C0 f0, S1 f3) : this()
86+
{
87+
}
88+
}
89+
90+
public class C1
91+
{
92+
public bool F1;
93+
}
94+
95+
public class Program
96+
{
97+
public static IRuntime s_rt;
98+
public static S2 s_13;
99+
public static S1 s_18;
100+
public static bool[] s_22;
101+
public static C0 s_24;
102+
public static ushort[, ] s_31;
103+
public static S1 s_35;
104+
public static bool s_37;
105+
public static S5[] s_44;
106+
public static S4 s_54;
107+
public static S1 s_58;
108+
public static C1[, ] s_59;
109+
public static S4 s_60;
110+
public static S2 s_88;
111+
public static S2[] s_90;
112+
113+
[Fact]
114+
public static void TestEntryPoint()
115+
{
116+
try
117+
{
118+
CollectibleALC alc = new CollectibleALC();
119+
System.Reflection.Assembly asm = alc.LoadFromAssemblyPath(System.Reflection.Assembly.GetExecutingAssembly().Location);
120+
System.Reflection.MethodInfo mi = asm.GetType(typeof(Program).FullName).GetMethod(nameof(MainInner));
121+
System.Type runtimeTy = asm.GetType(typeof(Runtime).FullName);
122+
mi.Invoke(null, new object[] { System.Activator.CreateInstance(runtimeTy) });
123+
} catch {}
124+
}
125+
126+
// Allow reflection lookup on public method
127+
#pragma warning disable xUnit1013
128+
public static void MainInner(IRuntime rt)
129+
{
130+
S0 vr8 = default(S0);
131+
if (s_59[0, 0].F1)
132+
{
133+
bool[] vr9 = new bool[]
134+
{
135+
true
136+
};
137+
s_88 = new S2(s_54.F1.F2.F4.F1, s_24.F1.F2.F4--, new S1(s_35.F2.F3, 0, new S0(-2, 0, 0, 0, 11218621709493063492UL, 450420498, 0), s_60.F1.F7.F2, new S0(0, 0, 0, 0, 0, 1, 0)), s_13.F4--, (byte)s_31[0, 0], new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), s_54.F1.F2);
138+
vr9[0] = vr9[0];
139+
}
140+
141+
s_rt.WriteLine("c_6973", vr8.F2);
142+
s_rt.WriteLine("c_6975", vr8.F4);
143+
s_rt.WriteLine("c_6978", vr8.F7);
144+
I1[] vr10 = new I1[]
145+
{
146+
new S2(0, 0, new S1(0, 0, new S0(0, 0, 0, -3.4028235E+38F, 0, 0, 0), new S0(0, 0, 0, 1, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), 0, 0, new S1(1, 0, new S0(0, 0, 0, 0, 0, 1, 0), new S0(0, 0, 0, 0, 0, 1, 0), new S0(0, 0, 0, 0, 0, 0, 0)), new S1(0, 0, new S0(0, 0, 16728947367172946933UL, 0, 0, 0, 0), new S0(1, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0))),
147+
new S3(0),
148+
new S2(0, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), 1, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 2102657202, 0)), new S1(0, 0, new S0(0, 0, 0, 0, 0, 1, 0), new S0(0, 16794536930986757818UL, 0, 0, 0, 0, 0), new S0(0, 0, 11911619636908597430UL, 0, 0, 0, 0))),
149+
new S3(0),
150+
new S2(0, 0, new S1(-2147483647, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), 1, 0, new S1(0, -2, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(1, 0, 0, 0, 0, 0, 0)), new S1(1, 1, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0))),
151+
new S2(0, 0, new S1(0, -1, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), 0, 0, new S1(-1, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, -3.4028235E+38F, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0)), new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0))),
152+
new S4(new S3(0), new S2(1, 0, new S1(0, 1, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0)), 1, 0, new S1(1, 0, new S0(0, 0, 0, 0, 0, 1, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0)), new S1(0, 0, new S0(0, 0, 0, 0, 0, 1, 0), new S0(1, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0))), 0, new S0(0, 0, 0, 0, 0, 0, 0), 0)
153+
};
154+
var vr11 = new S3(0);
155+
var vr12 = s_44[0].F0.F1.F3.F0;
156+
M75(vr11, vr12);
157+
if (s_22[0])
158+
{
159+
S3 vr13 = new S3(0);
160+
try
161+
{
162+
var vr14 = s_54.F0;
163+
var vr15 = s_18.F4.F0;
164+
S3 vr23 = vr14;
165+
}
166+
finally
167+
{
168+
var vr16 = new S3(0);
169+
var vr17 = s_58.F4.F0--;
170+
M75(vr16, vr17);
171+
if (s_37)
172+
{
173+
for (int vr18 = 0; vr18 < 2; vr18++)
174+
{
175+
var vr19 = new S3(0);
176+
vr10[0] = new S4(new S3(0), new S2(1, 5461410436353764379UL, new S1(0, 0, new S0(0, 18446744073709551614UL, 0, 0, 17533718527758593297UL, 0, 0), new S0(0, 8592301711847430801UL, 0, 0, 0, 0, 0), new S0(-1, 7862269010569978854UL, 0, 0, 0, 0, 0)), 0, 0, new S1(0, 0, new S0(0, 3156588052453432602UL, 0, 0, 0, 810788132, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), new S1(1, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 15070356010362475091UL, 0, 0))), 0, new S0(0, 0, 0, 0, 0, 0, 0), 0);
177+
vr10 = new I1[]
178+
{
179+
new S2(1, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, -3.4028235E+38F, 0, -1, 0), new S0(0, 7703692348755595801UL, 0, 0, 0, 0, 0)), 0, 0, new S1(1, 1.7976931348623157E+308, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0)), new S1(0, -1, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 3991586019811875011UL, 0, 0, 0, -2147483648, 0))),
180+
new S4(new S3(-1), new S2(0, 9890997199408041578UL, new S1(0, 0, new S0(0, 0, 0, 0, 0, 1, 0), new S0(0, 0, 0, 0, 0, 0, -7424873608279851173L), new S0(0, 0, 9698347484967702837UL, 0, 0, 0, 0)), 0, 0, new S1(0, 0, new S0(1, 0, 0, 0, 0, 0, 8154649548600176800L), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, -9223372036854775808L)), new S1(0, 0, new S0(1, 0, 0, 0, 0, 0, 0), new S0(0, 778004003835070330UL, 0, 0, 0, 0, 0), new S0(0, 0, 8658698987098108904UL, 0, 0, 0, 0))), 0, new S0(0, 0, 0, 0, 0, 0, 0), 956596481),
181+
new S4(new S3(0), new S2(0, 453734974695362841UL, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, -8941433507005588199L)), 0, 1, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0)), new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 10794758865549560580UL, 0, 7077610171127139841UL, 1, 0), new S0(1, 0, 0, 0, 0, 0, 0))), 0, new S0(1, 0, 0, 0, 17621340021635995622UL, 0, 0), 1),
182+
new S2(0, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(1, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), 0, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), new S1(0, 0, new S0(1, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0))),
183+
new S2(0, 6130557987521252430UL, new S1(0, -2, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0), new S0(1, 12555188232274105334UL, 0, 0, 0, 0, 0)), 1, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), new S1(0, 0, new S0(0, 1828388993980413842UL, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 5800380996067047058UL, 0, 0))),
184+
new S3(1)
185+
};
186+
s_rt.WriteLine("c_7152", vr18);
187+
}
188+
189+
S0 vr20 = new S0(0, 0, 0, 0, 0, 0, 0);
190+
C0 vr21 = new C0(new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)));
191+
s_rt.WriteLine("c_7159", vr20.F6);
192+
s_rt.WriteLine("c_7164", vr21.F1.F0);
193+
s_rt.WriteLine("c_7168", vr21.F1.F2.F2);
194+
s_rt.WriteLine("c_7170", vr21.F1.F2.F4);
195+
s_rt.WriteLine("c_7173", vr21.F1.F2.F7);
196+
s_rt.WriteLine("c_7176", vr21.F1.F3.F1);
197+
s_rt.WriteLine("c_7177", vr21.F1.F3.F2);
198+
s_rt.WriteLine("c_7181", vr21.F1.F3.F6);
199+
s_rt.WriteLine("c_7185", vr21.F1.F4.F1);
200+
s_rt.WriteLine("c_7191", vr21.F1.F4.F7);
201+
s_rt.WriteLine("c_7192", vr21.F1.F4.F8);
202+
}
203+
204+
s_54.F1.F2.F0 = s_90[0].F6.F0++;
205+
}
206+
207+
var vr22 = new S5(new C0(new S1(0, 0, new S0(-2, 0, 0, 0, 0, 0, 0), new S0(1, 0, 0, 0, 0, -1, 0), new S0(0, 0, 0, 0, 0, 0, 0))), new S1(0, 0, new S0(-1, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)));
208+
}
209+
210+
vr10 = new I1[]
211+
{
212+
new S4(new S3(-18643), new S2(0, 0, new S1(1, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 11398096482162480173UL, 0, 0, 0, 9223372036854775806L), new S0(0, 0, 0, 0, 0, 2134113955, 0)), 0, 0, new S1(0, 0, new S0(0, 0, 15971873843035984033UL, 0, 5979847448536525346UL, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(1, 0, 0, 0, 11276959574309188693UL, 0, 0)), new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0), new S0(0, 0, 0, 0, 0, 0, 0))), 0, new S0(0, 0, 0, 0, 0, 0, 0), 0),
213+
new S3(1),
214+
new S3(0),
215+
new S4(new S3(0), new S2(0, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0), new S0(0, 0, 0, 0, 0, 1, 0)), 1, 0, new S1(0, 0, new S0(0, 0, 0, 0, 11829847737932804605UL, 0, 0), new S0(1, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), new S1(0, -2, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 9919258226402299883UL, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0))), 0, new S0(0, 0, 0, 0, 0, 1, 0), 0),
216+
new S2(0, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), 0, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), new S1(-1, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 1, 0), new S0(0, 0, 0, 0, 0, 0, 0))),
217+
new S4(new S3(0), new S2(0, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), 0, 0, new S1(0, 1, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, -1, 0), new S0(0, 0, 0, 0, 0, 0, 0)), new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(1, 0, 0, 0, 0, 0, 0))), 0, new S0(0, 0, 0, 0, 0, 1, 0), 0),
218+
new S4(new S3(0), new S2(0, 0, new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), 0, 0, new S1(0, 0, new S0(1, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0)), new S1(0, 0, new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0), new S0(0, 0, 0, 0, 0, 0, 0))), 0, new S0(1, 0, 0, 0, 0, 0, 0), 0),
219+
new S3(0),
220+
new S3(0),
221+
new S3(0)
222+
};
223+
}
224+
#pragma warning restore xUnit1013
225+
226+
private static void M75(S3 argThis, double arg1)
227+
{
228+
}
229+
}
230+
231+
public interface IRuntime
232+
{
233+
void WriteLine<T>(string site, T value);
234+
}
235+
236+
public class Runtime : IRuntime
237+
{
238+
public void WriteLine<T>(string site, T value) => System.Console.WriteLine(value);
239+
}
240+
241+
public class CollectibleALC : System.Runtime.Loader.AssemblyLoadContext
242+
{
243+
public CollectibleALC() : base(true)
244+
{
245+
}
246+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
<PropertyGroup>
3+
<Optimize>True</Optimize>
4+
</PropertyGroup>
5+
<ItemGroup>
6+
<Compile Include="$(MSBuildProjectName).cs" />
7+
</ItemGroup>
8+
</Project>

0 commit comments

Comments
 (0)