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

Commit

Permalink
Merge pull request #16091 from dotnet-maestro-bot/master-UpdateDepend…
Browse files Browse the repository at this point in the history
…encies

Update BuildTools, CoreClr, CoreFx, PgoData to prerelease-02430-04, preview2-26130-05, preview2-26130-01, master-20180130-0046, respectively (master)
  • Loading branch information
jkotas authored Jan 31, 2018
2 parents 0196342 + ddc88f3 commit a6d7f16
Show file tree
Hide file tree
Showing 7 changed files with 38 additions and 138 deletions.
2 changes: 1 addition & 1 deletion ILAsmVersion.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2.1.0-preview2-26129-05
2.1.0-preview2-26130-05
16 changes: 8 additions & 8 deletions dependencies.props
Original file line number Diff line number Diff line change
Expand Up @@ -23,18 +23,18 @@

<!-- Source of truth for dependency tooling: the commit hash of the dotnet/versions master branch as of the last auto-upgrade. -->
<PropertyGroup>
<CoreFxCurrentRef>24b5bc6112a79756946da87bbd6f85178fc3753d</CoreFxCurrentRef>
<CoreClrCurrentRef>1c72931005703c5e509c1e3159d9378cbfea7862</CoreClrCurrentRef>
<BuildToolsCurrentRef>8724971b85883e93b071f982175ecf5e0de7ef88</BuildToolsCurrentRef>
<PgoDataCurrentRef>b8102fb1b6ee0b61222eeeeddbd9e53ec1a695b8</PgoDataCurrentRef>
<CoreFxCurrentRef>0c3e6442a8d0bbc6c8f05f7d918f2cfbde0c8cd8</CoreFxCurrentRef>
<CoreClrCurrentRef>0c3e6442a8d0bbc6c8f05f7d918f2cfbde0c8cd8</CoreClrCurrentRef>
<BuildToolsCurrentRef>0c3e6442a8d0bbc6c8f05f7d918f2cfbde0c8cd8</BuildToolsCurrentRef>
<PgoDataCurrentRef>0c3e6442a8d0bbc6c8f05f7d918f2cfbde0c8cd8</PgoDataCurrentRef>
</PropertyGroup>

<!-- Tests/infrastructure dependency versions. -->
<PropertyGroup>
<MicrosoftPrivateCoreFxNETCoreAppPackageVersion>4.5.0-preview2-26127-04</MicrosoftPrivateCoreFxNETCoreAppPackageVersion>
<MicrosoftNETCorePlatformsPackageVersion>2.1.0-preview2-26127-04</MicrosoftNETCorePlatformsPackageVersion>
<PgoDataPackageVersion>99.99.99-master-20180129-0045</PgoDataPackageVersion>
<MicrosoftNETCoreRuntimeCoreCLRPackageVersion>2.1.0-preview2-26129-05</MicrosoftNETCoreRuntimeCoreCLRPackageVersion>
<MicrosoftPrivateCoreFxNETCoreAppPackageVersion>4.5.0-preview2-26130-01</MicrosoftPrivateCoreFxNETCoreAppPackageVersion>
<MicrosoftNETCorePlatformsPackageVersion>2.1.0-preview2-26130-01</MicrosoftNETCorePlatformsPackageVersion>
<PgoDataPackageVersion>99.99.99-master-20180130-0046</PgoDataPackageVersion>
<MicrosoftNETCoreRuntimeCoreCLRPackageVersion>2.1.0-preview2-26130-05</MicrosoftNETCoreRuntimeCoreCLRPackageVersion>
<XunitPackageVersion>2.2.0-beta2-build3300</XunitPackageVersion>
<XunitConsoleNetcorePackageVersion>1.0.2-prerelease-00177</XunitConsoleNetcorePackageVersion>
<XunitPerformanceApiPackageVersion>1.0.0-beta-build0015</XunitPerformanceApiPackageVersion>
Expand Down
28 changes: 2 additions & 26 deletions src/mscorlib/shared/System/ReadOnlySpan.cs
Original file line number Diff line number Diff line change
Expand Up @@ -102,19 +102,6 @@ public unsafe ReadOnlySpan(void* pointer, int length)
_length = length;
}

/// <summary>
/// Create a new read-only span over a portion of a regular managed object. This can be useful
/// if part of a managed object represents a "fixed array." This is dangerous because neither the
/// <paramref name="length"/> is checked, nor <paramref name="obj"/> being null, nor the fact that
/// "rawPointer" actually lies within <paramref name="obj"/>.
/// </summary>
/// <param name="obj">The managed object that contains the data to span over.</param>
/// <param name="objectData">A reference to data within that object.</param>
/// <param name="length">The number of <typeparamref name="T"/> elements the memory contains.</param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
[EditorBrowsable(EditorBrowsableState.Never)]
public static ReadOnlySpan<T> DangerousCreate(object obj, ref T objectData, int length) => new ReadOnlySpan<T>(ref objectData, length);

// Constructor for internal use only.
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal ReadOnlySpan(ref T ptr, int length)
Expand All @@ -125,17 +112,6 @@ internal ReadOnlySpan(ref T ptr, int length)
_length = length;
}

/// <summary>
/// Returns a reference to the 0th element of the Span. If the Span is empty, returns a reference to the location where the 0th element
/// would have been stored. Such a reference can be used for pinning but must never be dereferenced.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
[EditorBrowsable(EditorBrowsableState.Never)]
internal ref readonly T DangerousGetPinnableReference()
{
return ref _pointer.Value;
}

/// <summary>
/// The number of items in the read-only span.
/// </summary>
Expand Down Expand Up @@ -207,7 +183,7 @@ public void CopyTo(Span<T> destination)

if ((uint)_length <= (uint)destination.Length)
{
Buffer.Memmove(ref destination.DangerousGetPinnableReference(), ref _pointer.Value, (nuint)_length);
Buffer.Memmove(ref destination._pointer.Value, ref _pointer.Value, (nuint)_length);
}
else
{
Expand All @@ -227,7 +203,7 @@ public bool TryCopyTo(Span<T> destination)
bool retVal = false;
if ((uint)_length <= (uint)destination.Length)
{
Buffer.Memmove(ref destination.DangerousGetPinnableReference(), ref _pointer.Value, (nuint)_length);
Buffer.Memmove(ref destination._pointer.Value, ref _pointer.Value, (nuint)_length);
retVal = true;
}
return retVal;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,6 @@ public static Memory<T> AsMemory<T>(ReadOnlyMemory<T> readOnlyMemory) =>
/// <exception cref="System.ArgumentException">
/// Thrown when <typeparamref name="TFrom"/> or <typeparamref name="TTo"/> contains pointers.
/// </exception>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Span<TTo> Cast<TFrom, TTo>(Span<TFrom> source)
where TFrom : struct
where TTo : struct
Expand All @@ -61,7 +60,7 @@ public static Span<TTo> Cast<TFrom, TTo>(Span<TFrom> source)
ThrowHelper.ThrowInvalidTypeWithPointersNotSupported(typeof(TTo));

return new Span<TTo>(
ref Unsafe.As<TFrom, TTo>(ref source.DangerousGetPinnableReference()),
ref Unsafe.As<TFrom, TTo>(ref source._pointer.Value),
checked((int)((long)source.Length * Unsafe.SizeOf<TFrom>() / Unsafe.SizeOf<TTo>())));
}

Expand All @@ -76,7 +75,6 @@ ref Unsafe.As<TFrom, TTo>(ref source.DangerousGetPinnableReference()),
/// <exception cref="System.ArgumentException">
/// Thrown when <typeparamref name="TFrom"/> or <typeparamref name="TTo"/> contains pointers.
/// </exception>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static ReadOnlySpan<TTo> Cast<TFrom, TTo>(ReadOnlySpan<TFrom> source)
where TFrom : struct
where TTo : struct
Expand Down
52 changes: 0 additions & 52 deletions src/mscorlib/shared/System/Span.NonGeneric.cs
Original file line number Diff line number Diff line change
Expand Up @@ -131,58 +131,6 @@ ref Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(source)),
checked(source.Length * Unsafe.SizeOf<T>()));
}

/// <summary>
/// Casts a Span of one primitive type <typeparamref name="TFrom"/> to another primitive type <typeparamref name="TTo"/>.
/// These types may not contain pointers or references. This is checked at runtime in order to preserve type safety.
/// </summary>
/// <remarks>
/// Supported only for platforms that support misaligned memory access.
/// </remarks>
/// <param name="source">The source slice, of type <typeparamref name="TFrom"/>.</param>
/// <exception cref="System.ArgumentException">
/// Thrown when <typeparamref name="TFrom"/> or <typeparamref name="TTo"/> contains pointers.
/// </exception>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Span<TTo> NonPortableCast<TFrom, TTo>(this Span<TFrom> source)
where TFrom : struct
where TTo : struct
{
if (RuntimeHelpers.IsReferenceOrContainsReferences<TFrom>())
ThrowHelper.ThrowInvalidTypeWithPointersNotSupported(typeof(TFrom));
if (RuntimeHelpers.IsReferenceOrContainsReferences<TTo>())
ThrowHelper.ThrowInvalidTypeWithPointersNotSupported(typeof(TTo));

return new Span<TTo>(
ref Unsafe.As<TFrom, TTo>(ref source.DangerousGetPinnableReference()),
checked((int)((long)source.Length * Unsafe.SizeOf<TFrom>() / Unsafe.SizeOf<TTo>())));
}

/// <summary>
/// Casts a ReadOnlySpan of one primitive type <typeparamref name="TFrom"/> to another primitive type <typeparamref name="TTo"/>.
/// These types may not contain pointers or references. This is checked at runtime in order to preserve type safety.
/// </summary>
/// <remarks>
/// Supported only for platforms that support misaligned memory access.
/// </remarks>
/// <param name="source">The source slice, of type <typeparamref name="TFrom"/>.</param>
/// <exception cref="System.ArgumentException">
/// Thrown when <typeparamref name="TFrom"/> or <typeparamref name="TTo"/> contains pointers.
/// </exception>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static ReadOnlySpan<TTo> NonPortableCast<TFrom, TTo>(this ReadOnlySpan<TFrom> source)
where TFrom : struct
where TTo : struct
{
if (RuntimeHelpers.IsReferenceOrContainsReferences<TFrom>())
ThrowHelper.ThrowInvalidTypeWithPointersNotSupported(typeof(TFrom));
if (RuntimeHelpers.IsReferenceOrContainsReferences<TTo>())
ThrowHelper.ThrowInvalidTypeWithPointersNotSupported(typeof(TTo));

return new ReadOnlySpan<TTo>(
ref Unsafe.As<TFrom, TTo>(ref MemoryMarshal.GetReference(source)),
checked((int)((long)source.Length * Unsafe.SizeOf<TFrom>() / Unsafe.SizeOf<TTo>())));
}

/// <summary>
/// Creates a new readonly span over the portion of the target string.
/// </summary>
Expand Down
30 changes: 3 additions & 27 deletions src/mscorlib/shared/System/Span.cs
Original file line number Diff line number Diff line change
Expand Up @@ -108,19 +108,6 @@ public unsafe Span(void* pointer, int length)
_length = length;
}

/// <summary>
/// Create a new span over a portion of a regular managed object. This can be useful
/// if part of a managed object represents a "fixed array." This is dangerous because neither the
/// <paramref name="length"/> is checked, nor <paramref name="obj"/> being null, nor the fact that
/// "rawPointer" actually lies within <paramref name="obj"/>.
/// </summary>
/// <param name="obj">The managed object that contains the data to span over.</param>
/// <param name="objectData">A reference to data within that object.</param>
/// <param name="length">The number of <typeparamref name="T"/> elements the memory contains.</param>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
[EditorBrowsable(EditorBrowsableState.Never)]
public static Span<T> DangerousCreate(object obj, ref T objectData, int length) => new Span<T>(ref objectData, length);

// Constructor for internal use only.
[MethodImpl(MethodImplOptions.AggressiveInlining)]
internal Span(ref T ptr, int length)
Expand All @@ -131,17 +118,6 @@ internal Span(ref T ptr, int length)
_length = length;
}

/// <summary>
/// Returns a reference to the 0th element of the Span. If the Span is empty, returns a reference to the location where the 0th element
/// would have been stored. Such a reference can be used for pinning but must never be dereferenced.
/// </summary>
[MethodImpl(MethodImplOptions.AggressiveInlining)]
[EditorBrowsable(EditorBrowsableState.Never)]
internal ref T DangerousGetPinnableReference()
{
return ref _pointer.Value;
}

/// <summary>
/// The number of items in the span.
/// </summary>
Expand Down Expand Up @@ -232,7 +208,7 @@ public void Fill(T value)
if (length == 0)
return;

ref T r = ref DangerousGetPinnableReference();
ref T r = ref _pointer.Value;

// TODO: Create block fill for value types of power of two sizes e.g. 2,4,8,16

Expand Down Expand Up @@ -281,7 +257,7 @@ public void CopyTo(Span<T> destination)

if ((uint)_length <= (uint)destination.Length)
{
Buffer.Memmove(ref destination.DangerousGetPinnableReference(), ref _pointer.Value, (nuint)_length);
Buffer.Memmove(ref destination._pointer.Value, ref _pointer.Value, (nuint)_length);
}
else
{
Expand All @@ -302,7 +278,7 @@ public bool TryCopyTo(Span<T> destination)
bool retVal = false;
if ((uint)_length <= (uint)destination.Length)
{
Buffer.Memmove(ref destination.DangerousGetPinnableReference(), ref _pointer.Value, (nuint)_length);
Buffer.Memmove(ref destination._pointer.Value, ref _pointer.Value, (nuint)_length);
retVal = true;
}
return retVal;
Expand Down
44 changes: 23 additions & 21 deletions tests/src/JIT/Performance/CodeQuality/Span/SpanBench.cs
Original file line number Diff line number Diff line change
Expand Up @@ -475,45 +475,47 @@ static void TestSpanConstructor<T>(T[] array, int iterationCount, bool untrue)
}
#endregion

#region TestSpanDangerousCreate<T>
#if false // netcoreapp specific API https://github.com/dotnet/coreclr/issues/16126
#region TestSpanCreate<T>
[Benchmark(InnerIterationCount = BaseIterations)]
[InlineData(100)]
public static void TestSpanDangerousCreateByte(int length)
public static void TestSpanCreateByte(int length)
{
InvokeTestSpanDangerousCreate<byte>(length);
InvokeTestSpanCreate<byte>(length);
}

[Benchmark(InnerIterationCount = BaseIterations)]
[InlineData(100)]
public static void TestSpanDangerousCreateString(int length)
public static void TestSpanCreateString(int length)
{
InvokeTestSpanDangerousCreate<string>(length);
InvokeTestSpanCreate<string>(length);
}

static void InvokeTestSpanDangerousCreate<T>(int length)
static void InvokeTestSpanCreate<T>(int length)
{
TestClass<T> testClass = new TestClass<T>();
testClass.C0 = new T[length];

Invoke((int innerIterationCount) => TestSpanDangerousCreate<T>(testClass, innerIterationCount, false),
"TestSpanDangerousCreate<{0}>({1})", typeof(T).Name, length);
Invoke((int innerIterationCount) => TestSpanCreate<T>(testClass, innerIterationCount, false),
"TestSpanCreate<{0}>({1})", typeof(T).Name, length);
}

[MethodImpl(MethodImplOptions.NoInlining)]
static void TestSpanDangerousCreate<T>(TestClass<T> testClass, int iterationCount, bool untrue)
static void TestSpanCreate<T>(TestClass<T> testClass, int iterationCount, bool untrue)
{
var sink = Sink<T>.Instance;

for (int i = 0; i < iterationCount; i++)
{
var span = Span<T>.DangerousCreate(testClass, ref testClass.C0[0], testClass.C0.Length);
var span = MemoryMarshal.CreateSpan<T>(ref testClass.C0[0], testClass.C0.Length);
// Under a condition that we know is false but the jit doesn't,
// add a read from 'span' to make sure it's not dead, and an assignment
// to 'testClass' so the DangerousCreate call won't get hoisted.
// to 'testClass' so the Create call won't get hoisted.
if (untrue) { sink.Data = span[0]; testClass = new TestClass<T>(); }
}
}
#endregion
#endif

#region TestMemoryMarshalGetReference<T>
[Benchmark(InnerIterationCount = BaseIterations)]
Expand Down Expand Up @@ -967,33 +969,33 @@ static void TestSpanAsBytes<T>(T[] array, int iterationCount, bool untrue)
}
#endregion

#region TestSpanNonPortableCast<T>
#region TestSpanCast<T>
[Benchmark(InnerIterationCount = BaseIterations)]
[InlineData(100)]
public static void TestSpanNonPortableCastFromByteToInt(int length)
public static void TestSpanCastFromByteToInt(int length)
{
InvokeTestSpanNonPortableCast<byte, int>(length);
InvokeTestSpanCast<byte, int>(length);
}

[Benchmark(InnerIterationCount = BaseIterations)]
[InlineData(100)]
public static void TestSpanNonPortableCastFromIntToByte(int length)
public static void TestSpanCastFromIntToByte(int length)
{
InvokeTestSpanNonPortableCast<int, byte>(length);
InvokeTestSpanCast<int, byte>(length);
}

static void InvokeTestSpanNonPortableCast<From, To>(int length)
static void InvokeTestSpanCast<From, To>(int length)
where From : struct
where To : struct
{
var array = new From[length];

Invoke((int innerIterationCount) => TestSpanNonPortableCast<From, To>(array, innerIterationCount, false),
"TestSpanNonPortableCast<{0}, {1}>({2})", typeof(From).Name, typeof(To).Name, length);
Invoke((int innerIterationCount) => TestSpanCast<From, To>(array, innerIterationCount, false),
"TestSpanCast<{0}, {1}>({2})", typeof(From).Name, typeof(To).Name, length);
}

[MethodImpl(MethodImplOptions.NoInlining)]
static void TestSpanNonPortableCast<From, To>(From[] array, int iterationCount, bool untrue)
static void TestSpanCast<From, To>(From[] array, int iterationCount, bool untrue)
where From : struct
where To : struct
{
Expand All @@ -1002,7 +1004,7 @@ static void TestSpanNonPortableCast<From, To>(From[] array, int iterationCount,

for (int i = 0; i < iterationCount; i++)
{
var toSpan = span.NonPortableCast<From, To>();
var toSpan = MemoryMarshal.Cast<From, To>(span);
// Under a condition that we know is false but the jit doesn't,
// add a read from 'toSpan' to make sure it's not dead, and an assignment
// to 'span' so the AsBytes call won't get hoisted.
Expand Down

0 comments on commit a6d7f16

Please sign in to comment.