Skip to content

Commit 55e1ac7

Browse files
Use PackedIndexOfIsSupported checks in more places (#80254)
* Use PackedIndexOfIsSupported checks in more places This should avoids the size regression on WebAssembly and possibly other platforms without Sse2. The regression is side effect of #78861 which uses `PackedSpanHelpers.CanUsePackedIndexOf (!!T)` and TShouldUsePacked.Value to guard the usage of PackedSpanHelpers. Because these involve generics, illinker is unable to link the PackedSpanHelpers type away and that pulls other parts in, like System.Runtime.Intrinsics.X86.* types. See https://gist.github.com/radekdoulik/c0b52247d472f69bcf983ade78a924ea for more complete list. This change gets us back 9,216 bytes in the case of app used to repro the regression. ... - Type System.PackedSpanHelpers - Type System.Runtime.Intrinsics.X86.X86Base - Type System.Runtime.Intrinsics.X86.Sse - Type System.Runtime.Intrinsics.X86.Sse2 Summary: - 9,216 File size -0.76% (of 1,215,488) - 2,744 Metadata size -0.43% (of 636,264) - 4 Types count * Update src/libraries/System.Private.CoreLib/src/System/IndexOfAnyValues/IndexOfAnyValues.cs Co-authored-by: Miha Zupan <[email protected]> * Update src/libraries/System.Private.CoreLib/src/System/IndexOfAnyValues/IndexOfAnyValues.cs Co-authored-by: Miha Zupan <[email protected]> * Feedback Co-authored-by: Miha Zupan <[email protected]>
1 parent edbdce5 commit 55e1ac7

File tree

6 files changed

+17
-17
lines changed

6 files changed

+17
-17
lines changed

src/libraries/System.Private.CoreLib/src/System/IndexOfAnyValues/IndexOfAny1CharValue.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ internal override bool ContainsCore(char value) =>
2222

2323
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2424
internal override int IndexOfAny(ReadOnlySpan<char> span) =>
25-
TShouldUsePacked.Value
25+
(PackedSpanHelpers.PackedIndexOfIsSupported && TShouldUsePacked.Value)
2626
? PackedSpanHelpers.IndexOf(ref MemoryMarshal.GetReference(span), _e0, span.Length)
2727
: SpanHelpers.NonPackedIndexOfValueType<short, SpanHelpers.DontNegate<short>>(
2828
ref Unsafe.As<char, short>(ref MemoryMarshal.GetReference(span)),
@@ -31,7 +31,7 @@ ref Unsafe.As<char, short>(ref MemoryMarshal.GetReference(span)),
3131

3232
[MethodImpl(MethodImplOptions.AggressiveInlining)]
3333
internal override int IndexOfAnyExcept(ReadOnlySpan<char> span) =>
34-
TShouldUsePacked.Value
34+
(PackedSpanHelpers.PackedIndexOfIsSupported && TShouldUsePacked.Value)
3535
? PackedSpanHelpers.IndexOfAnyExcept(ref MemoryMarshal.GetReference(span), _e0, span.Length)
3636
: SpanHelpers.NonPackedIndexOfValueType<short, SpanHelpers.Negate<short>>(
3737
ref Unsafe.As<char, short>(ref MemoryMarshal.GetReference(span)),

src/libraries/System.Private.CoreLib/src/System/IndexOfAnyValues/IndexOfAny2CharValues.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ internal override bool ContainsCore(char value) =>
2222

2323
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2424
internal override int IndexOfAny(ReadOnlySpan<char> span) =>
25-
TShouldUsePacked.Value
25+
(PackedSpanHelpers.PackedIndexOfIsSupported && TShouldUsePacked.Value)
2626
? PackedSpanHelpers.IndexOfAny(ref MemoryMarshal.GetReference(span), _e0, _e1, span.Length)
2727
: SpanHelpers.NonPackedIndexOfAnyValueType<short, SpanHelpers.DontNegate<short>>(
2828
ref Unsafe.As<char, short>(ref MemoryMarshal.GetReference(span)),
@@ -32,7 +32,7 @@ ref Unsafe.As<char, short>(ref MemoryMarshal.GetReference(span)),
3232

3333
[MethodImpl(MethodImplOptions.AggressiveInlining)]
3434
internal override int IndexOfAnyExcept(ReadOnlySpan<char> span) =>
35-
TShouldUsePacked.Value
35+
(PackedSpanHelpers.PackedIndexOfIsSupported && TShouldUsePacked.Value)
3636
? PackedSpanHelpers.IndexOfAnyExcept(ref MemoryMarshal.GetReference(span), _e0, _e1, span.Length)
3737
: SpanHelpers.NonPackedIndexOfAnyValueType<short, SpanHelpers.Negate<short>>(
3838
ref Unsafe.As<char, short>(ref MemoryMarshal.GetReference(span)),

src/libraries/System.Private.CoreLib/src/System/IndexOfAnyValues/IndexOfAny3CharValues.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ internal override bool ContainsCore(char value) =>
2222

2323
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2424
internal override int IndexOfAny(ReadOnlySpan<char> span) =>
25-
TShouldUsePacked.Value
25+
(PackedSpanHelpers.PackedIndexOfIsSupported && TShouldUsePacked.Value)
2626
? PackedSpanHelpers.IndexOfAny(ref MemoryMarshal.GetReference(span), _e0, _e1, _e2, span.Length)
2727
: SpanHelpers.NonPackedIndexOfAnyValueType<short, SpanHelpers.DontNegate<short>>(
2828
ref Unsafe.As<char, short>(ref MemoryMarshal.GetReference(span)),
@@ -33,7 +33,7 @@ ref Unsafe.As<char, short>(ref MemoryMarshal.GetReference(span)),
3333

3434
[MethodImpl(MethodImplOptions.AggressiveInlining)]
3535
internal override int IndexOfAnyExcept(ReadOnlySpan<char> span) =>
36-
TShouldUsePacked.Value
36+
(PackedSpanHelpers.PackedIndexOfIsSupported && TShouldUsePacked.Value)
3737
? PackedSpanHelpers.IndexOfAnyExcept(ref MemoryMarshal.GetReference(span), _e0, _e1, _e2, span.Length)
3838
: SpanHelpers.NonPackedIndexOfAnyValueType<short, SpanHelpers.Negate<short>>(
3939
ref Unsafe.As<char, short>(ref MemoryMarshal.GetReference(span)),

src/libraries/System.Private.CoreLib/src/System/IndexOfAnyValues/IndexOfAnyCharValuesInRange.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ internal override bool ContainsCore(char value) =>
3838

3939
[MethodImpl(MethodImplOptions.AggressiveInlining)]
4040
internal override int IndexOfAny(ReadOnlySpan<char> span) =>
41-
TShouldUsePacked.Value
41+
(PackedSpanHelpers.PackedIndexOfIsSupported && TShouldUsePacked.Value)
4242
? PackedSpanHelpers.IndexOfAnyInRange(ref MemoryMarshal.GetReference(span), _lowInclusive, _rangeInclusive, span.Length)
4343
: SpanHelpers.NonPackedIndexOfAnyInRangeUnsignedNumber<ushort, SpanHelpers.DontNegate<ushort>>(
4444
ref Unsafe.As<char, ushort>(ref MemoryMarshal.GetReference(span)),
@@ -48,7 +48,7 @@ ref Unsafe.As<char, ushort>(ref MemoryMarshal.GetReference(span)),
4848

4949
[MethodImpl(MethodImplOptions.AggressiveInlining)]
5050
internal override int IndexOfAnyExcept(ReadOnlySpan<char> span) =>
51-
TShouldUsePacked.Value
51+
(PackedSpanHelpers.PackedIndexOfIsSupported && TShouldUsePacked.Value)
5252
? PackedSpanHelpers.IndexOfAnyExceptInRange(ref MemoryMarshal.GetReference(span), _lowInclusive, _rangeInclusive, span.Length)
5353
: SpanHelpers.NonPackedIndexOfAnyInRangeUnsignedNumber<ushort, SpanHelpers.Negate<ushort>>(
5454
ref Unsafe.As<char, ushort>(ref MemoryMarshal.GetReference(span)),

src/libraries/System.Private.CoreLib/src/System/IndexOfAnyValues/IndexOfAnyValues.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ public static IndexOfAnyValues<char> Create(ReadOnlySpan<char> values)
8080
if (values.Length == 1)
8181
{
8282
char value = values[0];
83-
return PackedSpanHelpers.CanUsePackedIndexOf(value)
83+
return PackedSpanHelpers.PackedIndexOfIsSupported && PackedSpanHelpers.CanUsePackedIndexOf(value)
8484
? new IndexOfAny1CharValue<TrueConst>(value)
8585
: new IndexOfAny1CharValue<FalseConst>(value);
8686
}
@@ -95,7 +95,7 @@ public static IndexOfAnyValues<char> Create(ReadOnlySpan<char> values)
9595
{
9696
char value0 = values[0];
9797
char value1 = values[1];
98-
return PackedSpanHelpers.CanUsePackedIndexOf(value0) && PackedSpanHelpers.CanUsePackedIndexOf(value1)
98+
return PackedSpanHelpers.PackedIndexOfIsSupported && PackedSpanHelpers.CanUsePackedIndexOf(value0) && PackedSpanHelpers.CanUsePackedIndexOf(value1)
9999
? new IndexOfAny2CharValue<TrueConst>(value0, value1)
100100
: new IndexOfAny2CharValue<FalseConst>(value0, value1);
101101
}
@@ -105,7 +105,7 @@ public static IndexOfAnyValues<char> Create(ReadOnlySpan<char> values)
105105
char value0 = values[0];
106106
char value1 = values[1];
107107
char value2 = values[2];
108-
return PackedSpanHelpers.CanUsePackedIndexOf(value0) && PackedSpanHelpers.CanUsePackedIndexOf(value1) && PackedSpanHelpers.CanUsePackedIndexOf(value2)
108+
return PackedSpanHelpers.PackedIndexOfIsSupported && PackedSpanHelpers.CanUsePackedIndexOf(value0) && PackedSpanHelpers.CanUsePackedIndexOf(value1) && PackedSpanHelpers.CanUsePackedIndexOf(value2)
109109
? new IndexOfAny3CharValue<TrueConst>(value0, value1, value2)
110110
: new IndexOfAny3CharValue<FalseConst>(value0, value1, value2);
111111
}
@@ -185,7 +185,7 @@ ref Unsafe.As<char, short>(ref MemoryMarshal.GetReference(values)),
185185
}
186186

187187
Debug.Assert(typeof(T) == typeof(char));
188-
return (IndexOfAnyValues<T>)(object)(PackedSpanHelpers.CanUsePackedIndexOf(min) && PackedSpanHelpers.CanUsePackedIndexOf(max)
188+
return (IndexOfAnyValues<T>)(object)(PackedSpanHelpers.PackedIndexOfIsSupported && PackedSpanHelpers.CanUsePackedIndexOf(min) && PackedSpanHelpers.CanUsePackedIndexOf(max)
189189
? new IndexOfAnyCharValuesInRange<TrueConst>(*(char*)&min, *(char*)&max)
190190
: new IndexOfAnyCharValuesInRange<FalseConst>(*(char*)&min, *(char*)&max));
191191
}

src/libraries/System.Private.CoreLib/src/System/SpanHelpers.T.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1306,7 +1306,7 @@ public static int SequenceCompareTo<T>(ref T first, int firstLength, ref T secon
13061306
[MethodImpl(MethodImplOptions.AggressiveInlining)]
13071307
internal static unsafe bool ContainsValueType<T>(ref T searchSpace, T value, int length) where T : struct, INumber<T>
13081308
{
1309-
if (PackedSpanHelpers.CanUsePackedIndexOf(value))
1309+
if (PackedSpanHelpers.PackedIndexOfIsSupported && PackedSpanHelpers.CanUsePackedIndexOf(value))
13101310
{
13111311
return PackedSpanHelpers.Contains(ref Unsafe.As<T, short>(ref searchSpace), *(short*)&value, length);
13121312
}
@@ -1448,7 +1448,7 @@ private static unsafe int IndexOfValueType<TValue, TNegator>(ref TValue searchSp
14481448
where TValue : struct, INumber<TValue>
14491449
where TNegator : struct, INegator<TValue>
14501450
{
1451-
if (PackedSpanHelpers.CanUsePackedIndexOf(value))
1451+
if (PackedSpanHelpers.PackedIndexOfIsSupported && PackedSpanHelpers.CanUsePackedIndexOf(value))
14521452
{
14531453
return typeof(TNegator) == typeof(DontNegate<short>)
14541454
? PackedSpanHelpers.IndexOf(ref Unsafe.As<TValue, char>(ref searchSpace), *(char*)&value, length)
@@ -1605,7 +1605,7 @@ private static unsafe int IndexOfAnyValueType<TValue, TNegator>(ref TValue searc
16051605
where TValue : struct, INumber<TValue>
16061606
where TNegator : struct, INegator<TValue>
16071607
{
1608-
if (PackedSpanHelpers.CanUsePackedIndexOf(value0) && PackedSpanHelpers.CanUsePackedIndexOf(value1))
1608+
if (PackedSpanHelpers.PackedIndexOfIsSupported && PackedSpanHelpers.CanUsePackedIndexOf(value0) && PackedSpanHelpers.CanUsePackedIndexOf(value1))
16091609
{
16101610
return typeof(TNegator) == typeof(DontNegate<short>)
16111611
? PackedSpanHelpers.IndexOfAny(ref Unsafe.As<TValue, char>(ref searchSpace), *(char*)&value0, *(char*)&value1, length)
@@ -1782,7 +1782,7 @@ private static unsafe int IndexOfAnyValueType<TValue, TNegator>(ref TValue searc
17821782
where TValue : struct, INumber<TValue>
17831783
where TNegator : struct, INegator<TValue>
17841784
{
1785-
if (PackedSpanHelpers.CanUsePackedIndexOf(value0) && PackedSpanHelpers.CanUsePackedIndexOf(value1) && PackedSpanHelpers.CanUsePackedIndexOf(value2))
1785+
if (PackedSpanHelpers.PackedIndexOfIsSupported && PackedSpanHelpers.CanUsePackedIndexOf(value0) && PackedSpanHelpers.CanUsePackedIndexOf(value1) && PackedSpanHelpers.CanUsePackedIndexOf(value2))
17861786
{
17871787
return typeof(TNegator) == typeof(DontNegate<short>)
17881788
? PackedSpanHelpers.IndexOfAny(ref Unsafe.As<TValue, char>(ref searchSpace), *(char*)&value0, *(char*)&value1, *(char*)&value2, length)
@@ -3085,7 +3085,7 @@ private static unsafe int IndexOfAnyInRangeUnsignedNumber<T, TNegator>(ref T sea
30853085
where T : struct, IUnsignedNumber<T>, IComparisonOperators<T, T, bool>
30863086
where TNegator : struct, INegator<T>
30873087
{
3088-
if (PackedSpanHelpers.CanUsePackedIndexOf(lowInclusive) && PackedSpanHelpers.CanUsePackedIndexOf(highInclusive) && highInclusive >= lowInclusive)
3088+
if (PackedSpanHelpers.PackedIndexOfIsSupported && PackedSpanHelpers.CanUsePackedIndexOf(lowInclusive) && PackedSpanHelpers.CanUsePackedIndexOf(highInclusive) && highInclusive >= lowInclusive)
30893089
{
30903090
ref char charSearchSpace = ref Unsafe.As<T, char>(ref searchSpace);
30913091
char charLowInclusive = *(char*)&lowInclusive;

0 commit comments

Comments
 (0)