123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 |
- using System.Linq;
- using System.Runtime.CompilerServices;
- using Unity.Burst;
- using Unity.Burst.CompilerServices;
- using Unity.Collections;
-
- namespace Burst.Compiler.IL.Tests
- {
- #if BURST_INTERNAL || UNITY_BURST_EXPERIMENTAL_LOOP_INTRINSICS
- internal class LoopIntrinsics
- {
- [MethodImpl(MethodImplOptions.NoInlining)]
- private static unsafe void CheckExpectVectorizedImpl([NoAlias] int* a, [NoAlias] int* b, int count)
- {
- for (var i = 0; i < count; i++)
- {
- Loop.ExpectVectorized();
-
- a[i] += b[i];
- }
- }
-
- [TestCompiler(100, IgnoreOnPlatform = Backend.TargetPlatform.Wasm)]
- [OptimizationsOnly("Loops are not vectorized when optimizations are disabled")]
- public static unsafe void CheckExpectVectorized(int count)
- {
- var a = stackalloc int[count];
- var b = stackalloc int[count];
-
- CheckExpectVectorizedImpl(a, b, count);
- }
-
- [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
- private static unsafe void CheckExpectVectorizedNoOptimizationsImpl([NoAlias] int* a, [NoAlias] int* b, int count)
- {
- for (var i = 0; i < count; i++)
- {
- Loop.ExpectVectorized();
-
- a[i] += b[i];
- }
- }
-
- [TestCompiler(100, ExpectCompilerException = true, ExpectedDiagnosticId = DiagnosticId.ERR_LoopUnexpectedAutoVectorization, IgnoreOnPlatform = Backend.TargetPlatform.Wasm)]
- [OptimizationsOnly("Intrinsics are not evaluated when optimizations are disabled")]
- public static unsafe void CheckExpectVectorizedNoOptimizations(int count)
- {
- var a = stackalloc int[count];
- var b = stackalloc int[count];
-
- CheckExpectVectorizedNoOptimizationsImpl(a, b, count);
- }
-
- [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]
- private static unsafe void CheckExpectNotVectorizedNoOptimizationsImpl([NoAlias] int* a, [NoAlias] int* b, int count)
- {
- for (var i = 0; i < count; i++)
- {
- Loop.ExpectNotVectorized();
-
- a[i] += b[i];
- }
- }
-
- [TestCompiler(100, IgnoreOnPlatform = Backend.TargetPlatform.Wasm)]
- public static unsafe void CheckExpectNotVectorizedNoOptimizations(int count)
- {
- var a = stackalloc int[count];
- var b = stackalloc int[count];
-
- CheckExpectNotVectorizedNoOptimizationsImpl(a, b, count);
- }
-
- [MethodImpl(MethodImplOptions.NoOptimization)]
- private static unsafe void CheckExpectVectorizedOptimizationsDisabledImpl([NoAlias] int* a, [NoAlias] int* b, int count)
- {
- for (var i = 0; i < count; i++)
- {
- Loop.ExpectVectorized();
-
- a[i] += b[i];
- }
- }
-
- [TestCompiler(100, ExpectCompilerException = true, ExpectedDiagnosticId = DiagnosticId.ERR_LoopUnexpectedAutoVectorization, IgnoreOnPlatform = Backend.TargetPlatform.Wasm)]
- [OptimizationsOnly("We only validate loop intrinsics with optimizations enabled")]
- public static unsafe void CheckExpectVectorizedOptimizationsDisabled(int count)
- {
- var a = stackalloc int[count];
- var b = stackalloc int[count];
-
- CheckExpectVectorizedOptimizationsDisabledImpl(a, b, count);
- }
-
- [MethodImpl(MethodImplOptions.NoInlining)]
- private static unsafe void CheckExpectNotVectorizedImpl([NoAlias] int* a, [NoAlias] int* b, int count)
- {
- for (var i = 0; i < count; i++)
- {
- Loop.ExpectNotVectorized();
-
- if (a[i] > b[i])
- {
- break;
- }
-
- a[i] += b[i];
- }
- }
-
- [TestCompiler(100, IgnoreOnPlatform = Backend.TargetPlatform.Wasm)]
- public static unsafe void CheckExpectNotVectorized(int count)
- {
- var a = stackalloc int[count];
- var b = stackalloc int[count];
-
- CheckExpectNotVectorizedImpl(a, b, count);
- }
-
- [MethodImpl(MethodImplOptions.NoInlining)]
- private static unsafe void CheckExpectVectorizedFailImpl([NoAlias] int* a, [NoAlias] int* b, int count)
- {
- for (var i = 0; i < count; i++)
- {
- Loop.ExpectVectorized();
-
- if (a[i] > b[i])
- {
- break;
- }
-
- a[i] += b[i];
- }
- }
-
- [TestCompiler(100, ExpectCompilerException = true, ExpectedDiagnosticId = DiagnosticId.ERR_LoopUnexpectedAutoVectorization, IgnoreOnPlatform = Backend.TargetPlatform.Wasm)]
- [OptimizationsOnly("Intrinsics are not evaluated when optimizations are disabled")]
- public static unsafe void CheckExpectVectorizedFail(int count)
- {
- var a = stackalloc int[count];
- var b = stackalloc int[count];
-
- CheckExpectVectorizedFailImpl(a, b, count);
- }
-
- [MethodImpl(MethodImplOptions.NoInlining)]
- private static unsafe void CheckExpectNotVectorizedFailImpl([NoAlias] int* a, [NoAlias] int* b, int count)
- {
- for (var i = 0; i < count; i++)
- {
- Loop.ExpectNotVectorized();
-
- a[i] += b[i];
- }
- }
-
- [TestCompiler(100, ExpectCompilerException = true, ExpectedDiagnosticId = DiagnosticId.ERR_LoopUnexpectedAutoVectorization, IgnoreOnPlatform = Backend.TargetPlatform.Wasm)]
- [OptimizationsOnly("Loops are not vectorized when optimizations are disabled")]
- public static unsafe void CheckExpectNotVectorizedFail(int count)
- {
- var a = stackalloc int[count];
- var b = stackalloc int[count];
-
- CheckExpectNotVectorizedFailImpl(a, b, count);
- }
-
- [TestCompiler(ExpectCompilerException = true, ExpectedDiagnosticId = DiagnosticId.ERR_LoopIntrinsicMustBeCalledInsideLoop, IgnoreOnPlatform = Backend.TargetPlatform.Wasm)]
- [OptimizationsOnly("Intrinsics are not evaluated when optimizations are disabled")]
- public static unsafe void CheckExpectVectorizedOutsideLoop()
- {
- Loop.ExpectVectorized();
- }
-
- [TestCompiler(ExpectCompilerException = true, ExpectedDiagnosticId = DiagnosticId.ERR_LoopIntrinsicMustBeCalledInsideLoop, IgnoreOnPlatform = Backend.TargetPlatform.Wasm)]
- [OptimizationsOnly("Intrinsics are not evaluated when optimizations are disabled")]
- public static unsafe void CheckExpectNotVectorizedOutsideLoop()
- {
- Loop.ExpectNotVectorized();
- }
-
- [MethodImpl(MethodImplOptions.NoInlining)]
- private static unsafe void CheckExpectVectorizedMultipleCallsImpl([NoAlias] int* a, [NoAlias] int* b, int count)
- {
- for (var i = 0; i < count; i++)
- {
- Loop.ExpectVectorized();
-
- a[i] += b[i];
-
- Loop.ExpectVectorized();
- }
- }
-
- [TestCompiler(100, IgnoreOnPlatform = Backend.TargetPlatform.Wasm)]
- [OptimizationsOnly("Loops are not vectorized when optimizations are disabled")]
- public static unsafe void CheckExpectVectorizedMultipleCalls(int count)
- {
- var a = stackalloc int[count];
- var b = stackalloc int[count];
-
- CheckExpectVectorizedMultipleCallsImpl(a, b, count);
- }
-
- [MethodImpl(MethodImplOptions.NoInlining)]
- private static unsafe void CheckExpectVectorizedUnrolledLoopImpl([NoAlias] int* a, [NoAlias] int* b)
- {
- for (var i = 0; i < 4; i++)
- {
- Loop.ExpectVectorized();
-
- if (a[i] > b[i])
- {
- a[i] += b[i];
- }
- }
- }
-
- [TestCompiler(100, ExpectedDiagnosticId = DiagnosticId.WRN_LoopIntrinsicCalledButLoopOptimizedAway, IgnoreOnPlatform = Backend.TargetPlatform.Wasm)]
- [OptimizationsOnly("Loops are not vectorized when optimizations are disabled")]
- public static unsafe void CheckExpectVectorizedUnrolledLoop(int count)
- {
- var a = stackalloc int[count];
- var b = stackalloc int[count];
-
- CheckExpectVectorizedUnrolledLoopImpl(a, b);
- }
-
- [MethodImpl(MethodImplOptions.NoInlining)]
- private static unsafe int CheckExpectVectorizedPartiallyUnrolledLoopImpl(int* a, int count)
- {
- var sum = 0;
-
- for (var i = 0; i < count; i++)
- {
- Loop.ExpectVectorized();
-
- sum += a[i];
- }
-
- return sum;
- }
-
- [TestCompiler(100, IgnoreOnPlatform = Backend.TargetPlatform.Wasm)]
- [OptimizationsOnly("Loops are not vectorized when optimizations are disabled")]
- public static unsafe int CheckExpectVectorizedPartiallyUnrolledLoop(int count)
- {
- var a = stackalloc int[count];
-
- a[0] = 8;
- a[10] = 16;
-
- return CheckExpectVectorizedPartiallyUnrolledLoopImpl(a, count);
- }
-
- [TestCompiler(100, ExpectedDiagnosticId = DiagnosticId.WRN_LoopIntrinsicCalledButLoopOptimizedAway, IgnoreOnPlatform = Backend.TargetPlatform.Wasm)]
- [OptimizationsOnly("Loops are not vectorized when optimizations are disabled")]
- public static unsafe void CheckExpectVectorizedRemovedLoop(int count)
- {
- for (var i = 0; i < count; i++)
- {
- Loop.ExpectVectorized();
- }
- }
-
- [MethodImpl(MethodImplOptions.NoInlining)]
- private static unsafe void CheckExpectVectorizedNestedImpl(
- [NoAlias] int* a, [NoAlias] int* b,
- [NoAlias] int* c, [NoAlias] int* d,
- int count)
- {
- for (var i = 0; i < count; i++)
- {
- Loop.ExpectNotVectorized();
-
- if (a[i] > b[i])
- {
- break;
- }
-
- a[i] += b[i];
-
- for (var j = i; j < count; j++)
- {
- Loop.ExpectVectorized();
-
- c[j] += d[j];
- }
- }
- }
-
- [TestCompiler(100, IgnoreOnPlatform = Backend.TargetPlatform.Wasm)]
- [OptimizationsOnly("Loops are not vectorized when optimizations are disabled")]
- public static unsafe void CheckExpectVectorizedNested(int count)
- {
- var a = stackalloc int[count];
- var b = stackalloc int[count];
- var c = stackalloc int[count];
- var d = stackalloc int[count];
-
- CheckExpectVectorizedNestedImpl(a, b, c, d, count);
- }
-
- [TestCompiler(ExpectCompilerException = true, ExpectedDiagnosticId = DiagnosticId.ERR_InstructionBoxNotSupported)]
- public static void TestCallingMethodWithParametersDefinedInSystemRuntime()
- {
- NativeArray<int> collection = new NativeArray<int>(2, Allocator.Temp);
- collection.Count();
- }
- }
- #endif
- }
|