summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacek Blaszczynski <biosciencenow@outlook.com>2017-11-08 13:01:49 +0100
committerJacek Blaszczynski <biosciencenow@outlook.com>2017-11-08 13:01:49 +0100
commit37a0e349970b1a1710b9067398124dd42691a3e8 (patch)
tree7549ae1492ac9a3169dbe6283dc421d91db8ec55
parent4148d6abf1a4ea3c98431fa99cb9a02baabb1b98 (diff)
parent661ee8f407deec5a36011fdcce8f68cf68266823 (diff)
downloadcoreclr-37a0e349970b1a1710b9067398124dd42691a3e8.tar.gz
coreclr-37a0e349970b1a1710b9067398124dd42691a3e8.tar.bz2
coreclr-37a0e349970b1a1710b9067398124dd42691a3e8.zip
Merge branch 'master' of https://github.com/dotnet/coreclr into cleanall
-rw-r--r--BuildToolsVersion.txt2
-rw-r--r--Documentation/building/windows-test-instructions.md13
-rw-r--r--Documentation/deep-dive-blog-posts.md5
-rw-r--r--buildpipeline/DotNet-Trusted-Publish-Symbols.json4
-rw-r--r--buildpipeline/DotNet-Trusted-Publish.json40
-rw-r--r--config.json2
-rw-r--r--dependencies.props14
-rwxr-xr-xnetci.groovy16
-rw-r--r--src/inc/clrconfig.h14
-rw-r--r--src/inc/clrconfigvalues.h1
-rw-r--r--src/inc/eventtracebase.h4
-rw-r--r--src/inc/perfcounters.h2
-rw-r--r--src/jit/assertionprop.cpp6
-rw-r--r--src/jit/bitset.cpp18
-rw-r--r--src/jit/bitset.h18
-rw-r--r--src/jit/bitsetasshortlong.h26
-rw-r--r--src/jit/bitsetasuint64.h5
-rw-r--r--src/jit/bitsetasuint64inclass.h15
-rw-r--r--src/jit/block.cpp2
-rw-r--r--src/jit/block.h10
-rw-r--r--src/jit/codegen.h17
-rw-r--r--src/jit/codegenarm64.cpp160
-rw-r--r--src/jit/codegenarmarch.cpp19
-rw-r--r--src/jit/codegencommon.cpp10
-rw-r--r--src/jit/codegenlegacy.cpp2
-rw-r--r--src/jit/codegenlinear.cpp6
-rw-r--r--src/jit/codegenxarch.cpp54
-rw-r--r--src/jit/compiler.cpp50
-rw-r--r--src/jit/compiler.h189
-rw-r--r--src/jit/compiler.hpp41
-rw-r--r--src/jit/compilerbitsettraits.h3
-rw-r--r--src/jit/compmemkind.h3
-rw-r--r--src/jit/copyprop.cpp2
-rw-r--r--src/jit/disasm.h9
-rw-r--r--src/jit/ee_il_dll.cpp2
-rw-r--r--src/jit/eeinterface.cpp2
-rw-r--r--src/jit/emit.cpp69
-rw-r--r--src/jit/emit.h4
-rw-r--r--src/jit/emitarm64.cpp107
-rw-r--r--src/jit/emitxarch.cpp48
-rw-r--r--src/jit/flowgraph.cpp24
-rw-r--r--src/jit/gcencode.cpp7
-rw-r--r--src/jit/gentree.cpp2
-rw-r--r--src/jit/gentree.h16
-rw-r--r--src/jit/hostallocator.h22
-rw-r--r--src/jit/importer.cpp2
-rw-r--r--src/jit/instr.cpp6
-rw-r--r--src/jit/jit.h100
-rw-r--r--src/jit/jitexpandarray.h409
-rw-r--r--src/jit/jitgcinfo.h6
-rw-r--r--src/jit/jithashtable.h823
-rw-r--r--src/jit/jitstd/allocator.h30
-rw-r--r--src/jit/lclvars.cpp4
-rw-r--r--src/jit/loopcloning.cpp79
-rw-r--r--src/jit/loopcloning.h106
-rw-r--r--src/jit/lower.cpp48
-rw-r--r--src/jit/lowerarmarch.cpp20
-rw-r--r--src/jit/lsra.cpp587
-rw-r--r--src/jit/lsra.h27
-rw-r--r--src/jit/lsraarmarch.cpp12
-rw-r--r--src/jit/morph.cpp8
-rw-r--r--src/jit/optimizer.cpp25
-rw-r--r--src/jit/rangecheck.cpp324
-rw-r--r--src/jit/rangecheck.h110
-rw-r--r--src/jit/regalloc.cpp10
-rw-r--r--src/jit/ssabuilder.cpp17
-rw-r--r--src/jit/ssabuilder.h2
-rw-r--r--src/jit/target.h2
-rw-r--r--src/jit/utils.cpp6
-rw-r--r--src/jit/utils.h41
-rw-r--r--src/jit/valuenum.cpp31
-rw-r--r--src/jit/valuenum.h38
-rw-r--r--src/jit/valuenumfuncs.h2
-rw-r--r--src/mscorlib/System.Private.CoreLib.csproj7
-rw-r--r--src/mscorlib/shared/System/Byte.cs11
-rw-r--r--src/mscorlib/shared/System/Double.cs11
-rw-r--r--src/mscorlib/shared/System/Globalization/DateTimeParse.cs70
-rw-r--r--src/mscorlib/shared/System/Globalization/JapaneseCalendar.Win32.cs6
-rw-r--r--src/mscorlib/shared/System/Int16.cs11
-rw-r--r--src/mscorlib/shared/System/Int32.cs11
-rw-r--r--src/mscorlib/shared/System/Int64.cs11
-rw-r--r--src/mscorlib/shared/System/SByte.cs13
-rw-r--r--src/mscorlib/shared/System/Single.cs11
-rw-r--r--src/mscorlib/shared/System/TimeSpan.cs33
-rw-r--r--src/mscorlib/shared/System/UInt16.cs13
-rw-r--r--src/mscorlib/shared/System/UInt32.cs13
-rw-r--r--src/mscorlib/shared/System/UInt64.cs13
-rw-r--r--src/mscorlib/shared/System/Version.cs2
-rw-r--r--src/mscorlib/src/Microsoft/Win32/Win32Native.cs1
-rw-r--r--src/mscorlib/src/System/BCLDebug.cs279
-rw-r--r--src/mscorlib/src/System/Decimal.cs11
-rw-r--r--src/mscorlib/src/System/Diagnostics/Assert.cs87
-rw-r--r--src/mscorlib/src/System/Diagnostics/AssertFilter.cs43
-rw-r--r--src/mscorlib/src/System/Diagnostics/AssertFilters.cs26
-rw-r--r--src/mscorlib/src/System/Diagnostics/Contracts/Contracts.cs228
-rw-r--r--src/mscorlib/src/System/Diagnostics/Contracts/ContractsBCL.cs99
-rw-r--r--src/mscorlib/src/System/Diagnostics/LogSwitch.cs123
-rw-r--r--src/mscorlib/src/System/Diagnostics/LoggingLevels.cs45
-rw-r--r--src/mscorlib/src/System/Diagnostics/Stacktrace.cs11
-rw-r--r--src/mscorlib/src/System/Diagnostics/log.cs128
-rw-r--r--src/mscorlib/src/System/Environment.cs15
-rw-r--r--src/mscorlib/src/System/Globalization/CultureInfo.Windows.cs3
-rw-r--r--src/mscorlib/src/System/Runtime/InteropServices/WindowsRuntime/WindowsRuntimeMarshal.cs46
-rw-r--r--src/mscorlib/src/System/Runtime/MemoryFailPoint.cs22
-rw-r--r--src/publish.proj78
-rw-r--r--src/scripts/genXplatEventing.py16
-rw-r--r--src/utilcode/clrconfig.cpp57
-rw-r--r--src/vm/CMakeLists.txt2
-rw-r--r--src/vm/ceemain.cpp102
-rw-r--r--src/vm/comutilnative.cpp19
-rw-r--r--src/vm/comutilnative.h6
-rw-r--r--src/vm/debugdebugger.cpp430
-rw-r--r--src/vm/debugdebugger.h226
-rw-r--r--src/vm/ecalllist.h16
-rw-r--r--src/vm/eedbginterfaceimpl.cpp2
-rw-r--r--src/vm/i386/stublinkerx86.cpp11
-rw-r--r--src/vm/microsoft.comservices.h277
-rw-r--r--src/vm/microsoft.comservices_i.c173
-rw-r--r--src/vm/mscorlib.h3
-rw-r--r--src/vm/object.inl37
-rw-r--r--src/vm/perfdefaults.cpp147
-rw-r--r--src/vm/perfdefaults.h90
-rw-r--r--src/vm/siginfo.cpp46
-rw-r--r--src/vm/siginfo.hpp1
-rw-r--r--src/vm/wks/CMakeLists.txt2
-rw-r--r--tests/scripts/run-corefx-tests.py24
-rw-r--r--tests/src/AllTestProjects.sln34953
-rw-r--r--tests/src/CoreMangLib/system/span/SlowTailCallArgs.cs53
-rw-r--r--tests/src/CoreMangLib/system/span/SlowTailCallArgs.csproj29
-rw-r--r--tests/src/JIT/Performance/CodeQuality/BenchmarksGame/mandelbrot/mandelbrot-4.cs125
-rw-r--r--tests/src/JIT/Performance/CodeQuality/BenchmarksGame/mandelbrot/mandelbrot-7.cs208
-rw-r--r--tests/src/JIT/Performance/CodeQuality/BenchmarksGame/mandelbrot/mandelbrot-7.csproj (renamed from tests/src/JIT/Performance/CodeQuality/BenchmarksGame/mandelbrot/mandelbrot-4.csproj)9
-rw-r--r--tests/src/JIT/Regression/JitBlue/GitHub_14784/GitHub_14784.il55
-rw-r--r--tests/src/JIT/Regression/JitBlue/GitHub_14784/GitHub_14784.ilproj24
-rw-r--r--tests/src/baseservices/threading/generics/Monitor/MonitorHelper.cs168
135 files changed, 3274 insertions, 39478 deletions
diff --git a/BuildToolsVersion.txt b/BuildToolsVersion.txt
index b763bcfda6..a1c02ab2d5 100644
--- a/BuildToolsVersion.txt
+++ b/BuildToolsVersion.txt
@@ -1 +1 @@
-2.0.0-prerelease-02203-01
+2.0.0-prerelease-02208-03
diff --git a/Documentation/building/windows-test-instructions.md b/Documentation/building/windows-test-instructions.md
index bcad244569..99aa11e613 100644
--- a/Documentation/building/windows-test-instructions.md
+++ b/Documentation/building/windows-test-instructions.md
@@ -33,8 +33,6 @@ To run a clean, priority 1, crossgen test pass:
**buildtest /?** will list additional supported parameters.
-Additionally, there is a Visual Studio solution, `<repo_root>\tests\src\AllTestProjects.sln`, where users can build a particular testcase, or all priority 0 testcases that are within it.
-
**Building Individual Tests**
Note: buildtest.cmd or build.cmd skipnative skipmscorlib needs to be run atleast once
@@ -87,12 +85,11 @@ If test changes are needed, make the change and build the test project. This wil
1. Use an existing test such as `<repo_root>\tests\src\Exceptions\Finalization\Finalizer.csproj` as a template and copy it to a new folder under `<repo_root>\tests\src`.
2. Be sure that the AssemblyName has been removed (this causes confusion with the way tests are generally handled behind the scenes by the build system).
3. [Assign a CLRTestKind/CLRTestPriority.](test-configuration.md)
-4. Add the project of the new test to `<repo_root>\tests\src\AllTestProjects.sln` in VS
-5. Add source files to this newly added project.
-6. Indicate the success of the test by returning `100`.
-8. Add any other projects as a dependency, if needed.
-9. Build the test.
-10. Follow the steps to re-run a failed test to validate the new test.
+4. Add source files to this newly added project.
+5. Indicate the success of the test by returning `100`.
+6. Add any other projects as a dependency, if needed.
+7. Build the test.
+8. Follow the steps to re-run a failed test to validate the new test.
Note:
diff --git a/Documentation/deep-dive-blog-posts.md b/Documentation/deep-dive-blog-posts.md
index 4ebadfac41..cb567f331c 100644
--- a/Documentation/deep-dive-blog-posts.md
+++ b/Documentation/deep-dive-blog-posts.md
@@ -1,5 +1,10 @@
## List of blog posts that provide a 'deep-dive' into the CoreCLR source code
+### Posts that take a high-level overview of releases
+
+- [Corestart 2.0: What's new for performance in .NET Core 2.0](https://www.ageofascent.com/2017/11/05/perfromance-dotnet-core-2-corestart-conference/)
+
+
### Posts that take a high-level look at the entire source:
- [A Hitchhikers Guide to the CoreCLR Source Code](http://mattwarren.org/2017/03/23/Hitchhikers-Guide-to-the-CoreCLR-Source-Code/)
diff --git a/buildpipeline/DotNet-Trusted-Publish-Symbols.json b/buildpipeline/DotNet-Trusted-Publish-Symbols.json
index 9686780eb8..f8b03812f4 100644
--- a/buildpipeline/DotNet-Trusted-Publish-Symbols.json
+++ b/buildpipeline/DotNet-Trusted-Publish-Symbols.json
@@ -33,7 +33,7 @@
},
"inputs": {
"filename": "sync.cmd",
- "arguments": "-ab -AzureAccount=$(CloudDropAccountName) -AzureToken=$(CloudDropAccessToken) -Container=$(PB_ContainerName) -BlobNamePrefix=$(PB_BlobNamePrefix)",
+ "arguments": "-ab -AzureAccount=$(CloudDropAccountName) -AzureToken=$(CloudDropAccessToken) -Container=$(PB_ContainerName) -BlobNamePrefix=$(PB_BlobNamePrefix)$(PB_BuildType)/symbolpkg/ -- /p:DownloadFlatFiles=true /p:BlobNameExtension=\".nupkg\" /p:DownloadDirectory=$(Pipeline.SourcesDirectory)\\packages\\AzureTransfer\\$(ConfigurationGroup)\\symbolpkg",
"workingFolder": "$(Pipeline.SourcesDirectory)",
"failOnStandardError": "false"
}
@@ -176,7 +176,7 @@
"allowOverride": true
},
"AzureContainerSymbolPackageGlob": {
- "value": "symbolpkg\\*\\*\\*.nupkg",
+ "value": "symbolpkg\\*.nupkg",
"allowOverride": true
},
"PB_AzureContainerSymbolPackageGlob": {
diff --git a/buildpipeline/DotNet-Trusted-Publish.json b/buildpipeline/DotNet-Trusted-Publish.json
index 2bb1451664..7cec1762b5 100644
--- a/buildpipeline/DotNet-Trusted-Publish.json
+++ b/buildpipeline/DotNet-Trusted-Publish.json
@@ -91,7 +91,25 @@
},
"inputs": {
"filename": "sync.cmd",
- "arguments": "-ab -AzureAccount=$(CloudDropAccountName) -AzureToken=$(CloudDropAccessToken) -Container=$(PB_ContainerName) -BlobNamePrefix=$(PB_BlobNamePrefix)",
+ "arguments": "-ab -AzureAccount=$(CloudDropAccountName) -AzureToken=$(CloudDropAccessToken) -Container=$(PB_ContainerName) -BlobNamePrefix=$(PB_BlobNamePrefix)$(PB_BuildType)/pkg/flatcontainer/ -- /p:DownloadFlatFiles=true /p:BlobNameExtension=\".nupkg\" /p:DownloadDirectory=$(Pipeline.SourcesDirectory)\\packages\\AzureTransfer\\$(ConfigurationGroup)\\pkg",
+ "workingFolder": "$(Pipeline.SourcesDirectory)",
+ "failOnStandardError": "false"
+ }
+ },
+ {
+ "enabled": true,
+ "continueOnError": false,
+ "alwaysRun": false,
+ "displayName": "Sync symbol packages",
+ "timeoutInMinutes": 0,
+ "task": {
+ "id": "d9bafed4-0b18-4f58-968d-86655b4d2ce9",
+ "versionSpec": "1.*",
+ "definitionType": "task"
+ },
+ "inputs": {
+ "filename": "sync.cmd",
+ "arguments": "-ab -AzureAccount=$(CloudDropAccountName) -AzureToken=$(CloudDropAccessToken) -Container=$(PB_ContainerName) -BlobNamePrefix=$(PB_BlobNamePrefix)$(PB_BuildType)/symbolpkg/ -- /p:DownloadFlatFiles=true /p:BlobNameExtension=\".nupkg\" /p:DownloadDirectory=$(Pipeline.SourcesDirectory)\\packages\\AzureTransfer\\$(ConfigurationGroup)\\symbolpkg",
"workingFolder": "$(Pipeline.SourcesDirectory)",
"failOnStandardError": "false"
}
@@ -179,7 +197,7 @@
"alwaysRun": false,
"displayName": "packages -> dotnet.myget.org",
"timeoutInMinutes": 0,
- "condition": "and(succeeded(), contains(variables.PB_PublishType, 'myget'), eq(ConfigurationGroup, 'Release'))",
+ "condition": "and(succeeded(), contains(variables.PB_PublishType, 'myget'), eq(variables.ConfigurationGroup, 'Release'))",
"task": {
"id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1",
"versionSpec": "1.*",
@@ -200,7 +218,7 @@
"alwaysRun": false,
"displayName": "symbol packages -> dotnet.myget.org",
"timeoutInMinutes": 0,
- "condition": "and(succeeded(), contains(variables.PB_PublishType, 'myget'), eq(ConfigurationGroup, 'Release'))",
+ "condition": "and(succeeded(), contains(variables.PB_PublishType, 'myget'), eq(variables.ConfigurationGroup, 'Release'))",
"task": {
"id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1",
"versionSpec": "1.*",
@@ -221,7 +239,7 @@
"alwaysRun": false,
"displayName": "Packages -> Blob Feed",
"timeoutInMinutes": 0,
- "condition": "and(succeeded(), contains(variables.PB_PublishType, 'blob'), eq(variables.ConfigurationGroup'], 'Release'))",
+ "condition": "and(succeeded(), contains(variables.PB_PublishType, 'blob'), eq(variables.ConfigurationGroup, 'Release'))",
"task": {
"id": "d9bafed4-0b18-4f58-968d-86655b4d2ce9",
"versionSpec": "1.*",
@@ -229,7 +247,7 @@
},
"inputs": {
"filename": "msbuild",
- "arguments": "src\\publish.proj /t:PublishPackages /p:CloudDropAccessToken=$(AzureBlobFeedAccessToken) /p:CloudDropAccountName=$(AzureBlobFeedAccountName) /p:ContainerName=$(AzureBlobFeedContainerName) /p:__PublishPackages=true /p:OverwriteOnPublish=true /p:PackagesPattern=../packages/AzureTransfer/Release/pkg/*/*/*.nupkg /p:RelativePath=packages /p:__BuildType=$(ConfigurationGroup) /p:OfficialPublish=true /p:PublishFlatContainer=false /fileloggerparameters:Verbosity=diag;LogFile=publishpkg.log",
+ "arguments": "src\\publish.proj /t:PublishPackages /p:CloudDropAccessToken=$(AzureBlobFeedAccessToken) /p:CloudDropAccountName=$(AzureBlobFeedAccountName) /p:ContainerName=$(AzureBlobFeedContainerName) /p:__PublishPackages=true /p:OverwriteOnPublish=true /p:PackagesPattern=../packages/AzureTransfer/Release/pkg/*.nupkg /p:RelativePath=packages /p:__BuildType=$(ConfigurationGroup) /p:OfficialPublish=true /p:PublishFlatContainer=false /fileloggerparameters:Verbosity=diag;LogFile=publishpkg.log",
"workingFolder": "$(Pipeline.SourcesDirectory)",
"failOnStandardError": "false"
}
@@ -240,7 +258,7 @@
"alwaysRun": false,
"displayName": "Symbol Packages -> Blob Feed",
"timeoutInMinutes": 0,
- "condition": "and(succeeded(), contains(variables.PB_PublishType, 'blob'), eq(variables.ConfigurationGroup'], 'Release'))",
+ "condition": "and(succeeded(), contains(variables.PB_PublishType, 'blob'), eq(variables.ConfigurationGroup, 'Release'))",
"task": {
"id": "d9bafed4-0b18-4f58-968d-86655b4d2ce9",
"versionSpec": "1.*",
@@ -248,7 +266,7 @@
},
"inputs": {
"filename": "msbuild",
- "arguments": "src\\publish.proj /t:PublishSymbolPackages /p:CloudDropAccessToken=$(AzureBlobFeedAccessToken) /p:CloudDropAccountName=$(AzureBlobFeedAccountName) /p:ContainerName=$(AzureBlobFeedContainerName) /p:__PublishSymbols=true /p:OverwriteOnPublish=true /p:SymbolsPackagesPattern=../packages/AzureTransfer/Release/symbolpkg/*/*/*.nupkg /p:RelativePath=symbols /p:__BuildType=$(ConfigurationGroup) /p:OfficialPublish=true /p:PublishFlatContainer=true /fileloggerparameters:Verbosity=diag;LogFile=publishpkg.log",
+ "arguments": "src\\publish.proj /t:PublishSymbolPackages /p:CloudDropAccessToken=$(AzureBlobFeedAccessToken) /p:CloudDropAccountName=$(AzureBlobFeedAccountName) /p:ContainerName=$(AzureBlobFeedContainerName) /p:__PublishSymbols=true /p:OverwriteOnPublish=true /p:SymbolsPackagesPattern=../packages/AzureTransfer/Release/symbolpkg/*.nupkg /p:RelativePath=symbols /p:__BuildType=$(ConfigurationGroup) /p:OfficialPublish=true /p:PublishFlatContainer=true /fileloggerparameters:Verbosity=diag;LogFile=publishpkg.log",
"workingFolder": "$(Pipeline.SourcesDirectory)",
"failOnStandardError": "false"
}
@@ -299,7 +317,7 @@
"alwaysRun": false,
"displayName": "Update versions repository",
"timeoutInMinutes": 0,
- "condition": "and(succeeded(), contains(variables.PB_PublishType, 'versions'), eq(variables.ConfigurationGroup'], 'Release'))",
+ "condition": "and(succeeded(), contains(variables.PB_PublishType, 'versions'), eq(variables.ConfigurationGroup, 'Release'))",
"task": {
"id": "e213ff0f-5d5c-4791-802d-52ea3e7be1f1",
"versionSpec": "1.*",
@@ -597,11 +615,11 @@
"allowOverride": true
},
"AzureContainerPackageGlob": {
- "value": "pkg\\*\\*\\*.nupkg",
+ "value": "pkg\\*.nupkg",
"allowOverride": true
},
"AzureContainerSymbolPackageGlob": {
- "value": "symbolpkg\\*\\*\\*.nupkg",
+ "value": "symbolpkg\\*.nupkg",
"allowOverride": true
},
"SymbolPackageLocation": {
@@ -682,4 +700,4 @@
"state": "wellFormed",
"revision": 418097633
}
-} \ No newline at end of file
+}
diff --git a/config.json b/config.json
index 536dd15453..69d8a5f451 100644
--- a/config.json
+++ b/config.json
@@ -674,7 +674,7 @@
"settings": {
"__BuildOS": "default",
"Project": "./src/publish.proj",
- "MsBuildFileLogging": "/flp:v=detailed;LogFile=publish-packages.log"
+ "MsBuildFileLogging": "/flp:v=detailed;LogFile=publish-packages.log /clp:v=detailed"
}
}
},
diff --git a/dependencies.props b/dependencies.props
index a53a6ebbeb..c95d3a15d0 100644
--- a/dependencies.props
+++ b/dependencies.props
@@ -23,17 +23,17 @@
<!-- Source of truth for dependency tooling: the commit hash of the dotnet/versions master branch as of the last auto-upgrade. -->
<PropertyGroup>
- <CoreFxCurrentRef>a2b323a39e7ab7e92d87334260328cc042ed6a78</CoreFxCurrentRef>
+ <CoreFxCurrentRef>ac4c079ac61d3a69fff717ce7ef9c7b880c4ad6d</CoreFxCurrentRef>
<CoreClrCurrentRef>4dd4bc933ecb18df77beb65afe79b118cae240d4</CoreClrCurrentRef>
- <BuildToolsCurrentRef>a2b323a39e7ab7e92d87334260328cc042ed6a78</BuildToolsCurrentRef>
- <PgoDataCurrentRef>a2b323a39e7ab7e92d87334260328cc042ed6a78</PgoDataCurrentRef>
+ <BuildToolsCurrentRef>ac4c079ac61d3a69fff717ce7ef9c7b880c4ad6d</BuildToolsCurrentRef>
+ <PgoDataCurrentRef>ac4c079ac61d3a69fff717ce7ef9c7b880c4ad6d</PgoDataCurrentRef>
</PropertyGroup>
<!-- Tests/infrastructure dependency versions. -->
<PropertyGroup>
- <MicrosoftPrivateCoreFxNETCoreAppPackageVersion>4.5.0-preview1-25902-08</MicrosoftPrivateCoreFxNETCoreAppPackageVersion>
- <MicrosoftNETCorePlatformsPackageVersion>2.1.0-preview1-25902-08</MicrosoftNETCorePlatformsPackageVersion>
- <PgoDataPackageVersion>99.99.99-master-20171103-0222</PgoDataPackageVersion>
+ <MicrosoftPrivateCoreFxNETCoreAppPackageVersion>4.5.0-preview1-25907-04</MicrosoftPrivateCoreFxNETCoreAppPackageVersion>
+ <MicrosoftNETCorePlatformsPackageVersion>2.1.0-preview1-25907-04</MicrosoftNETCorePlatformsPackageVersion>
+ <PgoDataPackageVersion>99.99.99-master-20171107-0019</PgoDataPackageVersion>
<MicrosoftNETCoreRuntimeCoreCLRPackageVersion>2.1.0-preview1-25901-06</MicrosoftNETCoreRuntimeCoreCLRPackageVersion>
<XunitPackageVersion>2.2.0-beta2-build3300</XunitPackageVersion>
<XunitConsoleNetcorePackageVersion>1.0.2-prerelease-00177</XunitConsoleNetcorePackageVersion>
@@ -45,7 +45,7 @@
<!-- Package versions used as toolsets -->
<PropertyGroup>
<FeedTasksPackage>Microsoft.DotNet.Build.Tasks.Feed</FeedTasksPackage>
- <FeedTasksPackageVersion>1.0.0-prerelease-02203-01</FeedTasksPackageVersion>
+ <FeedTasksPackageVersion>1.0.0-prerelease-02207-02</FeedTasksPackageVersion>
</PropertyGroup>
<!-- Package dependency verification/auto-upgrade configuration. -->
diff --git a/netci.groovy b/netci.groovy
index 061cc6f18b..7db9f2c60a 100755
--- a/netci.groovy
+++ b/netci.groovy
@@ -81,6 +81,7 @@ class Constants {
'jitstress2_jitstressregs0x1000' : ['COMPlus_JitStress' : '2', 'COMPlus_JitStressRegs' : '0x1000'],
'tailcallstress' : ['COMPlus_TailcallStress' : '1'],
'jitsse2only' : ['COMPlus_EnableAVX' : '0', 'COMPlus_EnableSSE3_4' : '0'],
+ 'jitnosimd' : ['COMPlus_FeatureSIMD' : '0'],
'corefx_baseline' : [ : ], // corefx baseline
'corefx_minopts' : ['COMPlus_JITMinOpts' : '1'],
'corefx_tieredcompilation' : ['COMPlus_EXPERIMENTAL_TieredCompilation' : '1'],
@@ -604,6 +605,7 @@ def static addNonPRTriggers(def job, def branch, def isPR, def architecture, def
case 'jitstress2_jitstressregs0x1000':
case 'tailcallstress':
case 'jitsse2only':
+ case 'jitnosimd':
case 'corefx_baseline':
case 'corefx_minopts':
case 'corefx_jitstress1':
@@ -871,6 +873,7 @@ def static addTriggers(def job, def branch, def isPR, def architecture, def os,
case 'jitstress2_jitstressregs0x1000':
case 'tailcallstress':
case 'jitsse2only':
+ case 'jitnosimd':
case 'gcstress0x3':
case 'gcstress0xc':
case 'zapdisable':
@@ -1046,6 +1049,7 @@ def static addTriggers(def job, def branch, def isPR, def architecture, def os,
case 'jitstress2_jitstressregs0x1000':
case 'tailcallstress':
case 'jitsse2only':
+ case 'jitnosimd':
case 'gcstress0x3':
case 'gcstress0xc':
case 'zapdisable':
@@ -1378,6 +1382,7 @@ def static addTriggers(def job, def branch, def isPR, def architecture, def os,
case 'jitstress2_jitstressregs0x1000':
case 'tailcallstress':
case 'jitsse2only':
+ case 'jitnosimd':
case 'gcstress0x3':
case 'gcstress0xc':
case 'zapdisable':
@@ -1664,7 +1669,7 @@ def static calculateBuildCommands(def newJob, def scenario, def branch, def isPR
def workspaceRelativeFxRoot = "_/fx"
def absoluteFxRoot = "%WORKSPACE%\\_\\fx"
- buildCommands += "python -u %WORKSPACE%\\tests\\scripts\\run-corefx-tests.py -arch ${arch} -build_type ${configuration} -fx_root ${absoluteFxRoot} -fx_branch ${branch} -env_script ${envScriptPath}"
+ buildCommands += "python -u %WORKSPACE%\\tests\\scripts\\run-corefx-tests.py -arch ${arch} -ci_arch ${architecture} -build_type ${configuration} -fx_root ${absoluteFxRoot} -fx_branch ${branch} -env_script ${envScriptPath}"
setTestJobTimeOut(newJob, scenario)
@@ -1819,18 +1824,13 @@ def static calculateBuildCommands(def newJob, def scenario, def branch, def isPR
if (scenario == 'standalone_gc') {
standaloneGc = 'buildstandalonegc'
}
-
- def disablePgo = ''
- if (lowerConfiguration == 'release') {
- disablePgo = 'nopgooptimize'
- }
if (!enableCorefxTesting) {
// We run pal tests on all OS but generate mscorlib (and thus, nuget packages)
// only on supported OS platforms.
def bootstrapRid = Utilities.getBoostrapPublishRid(os)
def bootstrapRidEnv = bootstrapRid != null ? "__PUBLISH_RID=${bootstrapRid} " : ''
- buildCommands += "${bootstrapRidEnv}./build.sh verbose ${lowerConfiguration} ${architecture} ${standaloneGc} ${disablePgo}"
+ buildCommands += "${bootstrapRidEnv}./build.sh verbose ${lowerConfiguration} ${architecture} ${standaloneGc}"
buildCommands += "src/pal/tests/palsuite/runpaltests.sh \${WORKSPACE}/bin/obj/${osGroup}.${architecture}.${configuration} \${WORKSPACE}/bin/paltestout"
// Set time out
@@ -1857,7 +1857,7 @@ def static calculateBuildCommands(def newJob, def scenario, def branch, def isPR
def workspaceRelativeFxRoot = "_/fx"
def absoluteFxRoot = "\$WORKSPACE/${workspaceRelativeFxRoot}"
- buildCommands += "python -u \$WORKSPACE/tests/scripts/run-corefx-tests.py -arch ${architecture} -build_type ${configuration} -fx_root ${absoluteFxRoot} -fx_branch ${branch} -env_script ${scriptFileName}"
+ buildCommands += "python -u \$WORKSPACE/tests/scripts/run-corefx-tests.py -arch ${architecture} -ci_arch ${architecture} -build_type ${configuration} -fx_root ${absoluteFxRoot} -fx_branch ${branch} -env_script ${scriptFileName}"
setTestJobTimeOut(newJob, scenario)
diff --git a/src/inc/clrconfig.h b/src/inc/clrconfig.h
index c15e2eb2f5..bb49dde6a2 100644
--- a/src/inc/clrconfig.h
+++ b/src/inc/clrconfig.h
@@ -60,8 +60,6 @@ public:
// Remove any whitespace at beginning and end of value. (Only applicable for
// *string* configuration values.)
TrimWhiteSpaceFromStringValue = 0x100,
- // If set, check whether a PerformanceDefault is active for this value before using the built-in default
- MayHavePerformanceDefault = 0x200,
// Legacy REGUTIL-style lookup.
REGUTIL_default = IgnoreConfigFiles,
@@ -76,10 +74,6 @@ public:
typedef HRESULT (* GetConfigValueFunction)
(__in_z LPCWSTR /*pKey*/, __deref_out_opt LPCWSTR* /*value*/, BOOL /*systemOnly*/, BOOL /*applicationFirst*/);
- // Function pointer definition used for calling PerformanceDefaults::LookupConfigValue
- typedef BOOL (* GetPerformanceDefaultValueFunction)
- (LPCWSTR /*name*/, DWORD* /*pValue*/);
-
// Struct used to store information about where/how to find a Config DWORD.
// NOTE: Please do NOT create instances of this struct. Use the macros in file:CLRConfigValues.h instead.
typedef struct ConfigDWORDInfo
@@ -195,18 +189,10 @@ public:
// Register EEConfig's GetConfigValueCallback function so CLRConfig can look in config files.
static void RegisterGetConfigValueCallback(GetConfigValueFunction func);
- // Register PerformanceDefaults' LookupConfigValue so CLRConfig can support 'MayHavePerformanceDefault' values
- static void RegisterGetPerformanceDefaultValueCallback(GetPerformanceDefaultValueFunction func);
-
-
-
private:
// Function pointer to EEConfig's GetConfigValueCallback function (can't static bind from utilcode to VM)
static GetConfigValueFunction s_GetConfigValueCallback;
- // Function pointer to PerformanceDefaults' LookupConfigValue function (can't static bind from utilcode to VM)
- static GetPerformanceDefaultValueFunction s_GetPerformanceDefaultValueCallback;
-
// Helper method to translate LookupOptions to REGUTIL::CORConfigLevel
static REGUTIL::CORConfigLevel GetConfigLevel(LookupOptions options);
diff --git a/src/inc/clrconfigvalues.h b/src/inc/clrconfigvalues.h
index e5cbaaa4a2..968aed5b11 100644
--- a/src/inc/clrconfigvalues.h
+++ b/src/inc/clrconfigvalues.h
@@ -1006,7 +1006,6 @@ RETAIL_CONFIG_DWORD_INFO_EX(UNSUPPORTED_IgnoreDllMainReturn, W("IgnoreDllMainRet
CONFIG_STRING_INFO(INTERNAL_InvokeHalt, W("InvokeHalt"), "Throws an assert when the given method is invoked through reflection.")
RETAIL_CONFIG_DWORD_INFO_DIRECT_ACCESS(UNSUPPORTED_legacyNullReferenceExceptionPolicy, W("legacyNullReferenceExceptionPolicy"), "")
RETAIL_CONFIG_DWORD_INFO_DIRECT_ACCESS(UNSUPPORTED_legacyUnhandledExceptionPolicy, W("legacyUnhandledExceptionPolicy"), "")
-RETAIL_CONFIG_DWORD_INFO_DIRECT_ACCESS(INTERNAL_ManagedLogFacility, W("ManagedLogFacility"), "?Log facility for managed code using the log")
CONFIG_DWORD_INFO_DIRECT_ACCESS(INTERNAL_MaxStackDepth, W("MaxStackDepth"), "")
CONFIG_DWORD_INFO_DIRECT_ACCESS(INTERNAL_MaxStubUnwindInfoSegmentSize, W("MaxStubUnwindInfoSegmentSize"), "")
CONFIG_DWORD_INFO_DIRECT_ACCESS(INTERNAL_MaxThreadRecord, W("MaxThreadRecord"), "")
diff --git a/src/inc/eventtracebase.h b/src/inc/eventtracebase.h
index 1b9dc58790..ad6f97395d 100644
--- a/src/inc/eventtracebase.h
+++ b/src/inc/eventtracebase.h
@@ -109,7 +109,7 @@ enum EtwThreadFlags
#define ETWFireEvent(EventName)
#define ETW_TRACING_INITIALIZED(RegHandle) (TRUE)
-#define ETW_EVENT_ENABLED(Context, EventDescriptor) (EventPipeHelper::Enabled() || XplatEventLogger::IsEventLoggingEnabled())
+#define ETW_EVENT_ENABLED(Context, EventDescriptor) (EventPipeHelper::Enabled() || EventEnabled##EventDescriptor())
#define ETW_CATEGORY_ENABLED(Context, Level, Keyword) (EventPipeHelper::Enabled() || XplatEventLogger::IsEventLoggingEnabled())
#define ETW_TRACING_ENABLED(Context, EventDescriptor) (EventEnabled##EventDescriptor())
#define ETW_TRACING_CATEGORY_ENABLED(Context, Level, Keyword) (EventPipeHelper::Enabled() || XplatEventLogger::IsEventLoggingEnabled())
@@ -120,7 +120,7 @@ enum EtwThreadFlags
#define ETWFireEvent(EventName)
#define ETW_TRACING_INITIALIZED(RegHandle) (TRUE)
-#define ETW_EVENT_ENABLED(Context, EventDescriptor) (XplatEventLogger::IsEventLoggingEnabled())
+#define ETW_EVENT_ENABLED(Context, EventDescriptor) (EventEnabled##EventDescriptor())
#define ETW_CATEGORY_ENABLED(Context, Level, Keyword) (XplatEventLogger::IsEventLoggingEnabled())
#define ETW_TRACING_ENABLED(Context, EventDescriptor) (EventEnabled##EventDescriptor())
#define ETW_TRACING_CATEGORY_ENABLED(Context, Level, Keyword) (XplatEventLogger::IsEventLoggingEnabled())
diff --git a/src/inc/perfcounters.h b/src/inc/perfcounters.h
index a27b58da0c..29fc767d63 100644
--- a/src/inc/perfcounters.h
+++ b/src/inc/perfcounters.h
@@ -69,8 +69,6 @@ inline PerfCounterIPCControlBlock *PerfCounters::GetPrivatePerfCounterPtr()
return m_pPrivatePerf;
};
-extern "C" Perf_Contexts * STDMETHODCALLTYPE GetPrivateContextsPerfCounters();
-
#define COUNTER_ONLY(x) x
#define PERF_COUNTER_NUM_OF_ITERATIONS 10
diff --git a/src/jit/assertionprop.cpp b/src/jit/assertionprop.cpp
index 712d7c0473..77899c7482 100644
--- a/src/jit/assertionprop.cpp
+++ b/src/jit/assertionprop.cpp
@@ -509,7 +509,7 @@ void Compiler::optAddCopies()
ASSERT_TP& Compiler::GetAssertionDep(unsigned lclNum)
{
- ExpandArray<ASSERT_TP>& dep = *optAssertionDep;
+ JitExpandArray<ASSERT_TP>& dep = *optAssertionDep;
if (dep[lclNum] == nullptr)
{
dep[lclNum] = BitVecOps::MakeEmpty(apTraits);
@@ -559,7 +559,7 @@ void Compiler::optAssertionInit(bool isLocalProp)
if (optAssertionDep == nullptr)
{
- optAssertionDep = new (this, CMK_AssertionProp) ExpandArray<ASSERT_TP>(getAllocator(), max(1, lvaCount));
+ optAssertionDep = new (this, CMK_AssertionProp) JitExpandArray<ASSERT_TP>(getAllocator(), max(1, lvaCount));
}
optAssertionTraitsInit(optMaxAssertionCount);
@@ -4563,7 +4563,7 @@ ASSERT_TP* Compiler::optInitAssertionDataflowFlags()
}
// Compute the data flow values for all tracked expressions
// IN and OUT never change for the initial basic block B1
- BitVecOps::OldStyleClearD(apTraits, fgFirstBB->bbAssertionIn);
+ BitVecOps::ClearD(apTraits, fgFirstBB->bbAssertionIn);
return jumpDestOut;
}
diff --git a/src/jit/bitset.cpp b/src/jit/bitset.cpp
index 7874ba5c89..6802c1a717 100644
--- a/src/jit/bitset.cpp
+++ b/src/jit/bitset.cpp
@@ -98,31 +98,31 @@ void BitSetSupport::RunTests(Env env)
class TestBitSetTraits
{
public:
- static void* Alloc(IAllocator* alloc, size_t byteSize)
+ static void* Alloc(CompAllocator* alloc, size_t byteSize)
{
return alloc->Alloc(byteSize);
}
- static unsigned GetSize(IAllocator* alloc)
+ static unsigned GetSize(CompAllocator* alloc)
{
return 64;
}
- static unsigned GetArrSize(IAllocator* alloc, unsigned elemSize)
+ static unsigned GetArrSize(CompAllocator* alloc, unsigned elemSize)
{
assert(elemSize == sizeof(size_t));
return (64 / 8) / sizeof(size_t);
}
- static unsigned GetEpoch(IAllocator* alloc)
+ static unsigned GetEpoch(CompAllocator* alloc)
{
return 0;
}
};
-void BitSetSupport::TestSuite(IAllocator* env)
+void BitSetSupport::TestSuite(CompAllocator* env)
{
- BitSetSupport::RunTests<UINT64, BSUInt64, IAllocator*, TestBitSetTraits>(env);
- BitSetSupport::RunTests<BitSetShortLongRep, BSShortLong, IAllocator*, TestBitSetTraits>(env);
- BitSetSupport::RunTests<BitSetUint64<IAllocator*, TestBitSetTraits>, BSUInt64Class, IAllocator*, TestBitSetTraits>(
- env);
+ BitSetSupport::RunTests<UINT64, BSUInt64, CompAllocator*, TestBitSetTraits>(env);
+ BitSetSupport::RunTests<BitSetShortLongRep, BSShortLong, CompAllocator*, TestBitSetTraits>(env);
+ BitSetSupport::RunTests<BitSetUint64<CompAllocator*, TestBitSetTraits>, BSUInt64Class, CompAllocator*,
+ TestBitSetTraits>(env);
}
#endif
diff --git a/src/jit/bitset.h b/src/jit/bitset.h
index 4eae519558..df03dee50e 100644
--- a/src/jit/bitset.h
+++ b/src/jit/bitset.h
@@ -40,7 +40,7 @@ public:
#ifdef DEBUG
// This runs the "TestSuite" method for a few important instantiations of BitSet.
- static void TestSuite(IAllocator* env);
+ static void TestSuite(CompAllocator* env);
#endif
enum Operation
@@ -132,7 +132,7 @@ FORCEINLINE unsigned BitSetSupport::CountBitsInIntegral<unsigned>(unsigned c)
//
// typename BitSetTraits:
// An "adapter" class that provides methods that retrieves things from the Env:
-// static IAllocator* GetAllococator(Env): yields an "IAllocator*" that the BitSet implementation can use.
+// static void* Alloc(Env, size_t byteSize): Allocates memory the BitSet implementation can use.
// static unsigned GetSize(Env): the current size (= # of bits) of this bitset type.
// static unsigned GetArrSize(Env, unsigned elemSize): The number of "elemSize" chunks sufficient to hold
// "GetSize". A given BitSet implementation must call
@@ -202,15 +202,6 @@ class BitSetOps
// be copied into the lhs.
static void AssignNoCopy(Env env, BitSetType& lhs, BitSetValueArgType rhs);
- // Destructively set "bs" to be the empty set. This method is unique, in that it does *not*
- // require "bs" to be a bitset of the current epoch. It ensures that it is after, however.
- // (If the representation is indirect, this requires allocating a new, empty representation.
- // If this is a performance issue, we could provide a new version of OldStyleClearD that assumes/asserts
- // that the rep is for the current epoch -- this would be useful if a given bitset were repeatedly
- // cleared within an epoch.)
- // TODO #11263: delete it.
- static void OldStyleClearD(Env env, BitSetType& bs);
-
// Destructively set "bs" to be the empty set.
static void ClearD(Env env, BitSetType& bs);
@@ -338,11 +329,6 @@ public:
BitSetTraits::GetOpCounter(env)->RecordOp(BitSetSupport::BSOP_AssignNocopy);
BSO::AssignNoCopy(env, lhs, rhs);
}
- static void OldStyleClearD(Env env, BitSetType& bs)
- {
- BitSetTraits::GetOpCounter(env)->RecordOp(BitSetSupport::BSOP_OldStyleClearD);
- BSO::OldStyleClearD(env, bs);
- }
static void ClearD(Env env, BitSetType& bs)
{
BitSetTraits::GetOpCounter(env)->RecordOp(BitSetSupport::BSOP_ClearD);
diff --git a/src/jit/bitsetasshortlong.h b/src/jit/bitsetasshortlong.h
index ef68ba85e9..f11aa8e1c2 100644
--- a/src/jit/bitsetasshortlong.h
+++ b/src/jit/bitsetasshortlong.h
@@ -43,7 +43,6 @@ private:
static void DiffDLong(Env env, BitSetShortLongRep& bs1, BitSetShortLongRep bs2);
static void AddElemDLong(Env env, BitSetShortLongRep& bs, unsigned i);
static void RemoveElemDLong(Env env, BitSetShortLongRep& bs, unsigned i);
- static void OldStyleClearDLong(Env env, BitSetShortLongRep& bs);
static void ClearDLong(Env env, BitSetShortLongRep& bs);
static BitSetShortLongRep MakeUninitArrayBits(Env env);
static BitSetShortLongRep MakeEmptyArrayBits(Env env);
@@ -123,19 +122,6 @@ public:
lhs = rhs;
}
- static void OldStyleClearD(Env env, BitSetShortLongRep& bs)
- {
- if (IsShort(env))
- {
- bs = (BitSetShortLongRep) nullptr;
- }
- else
- {
- assert(bs != UninitVal());
- OldStyleClearDLong(env, bs);
- }
- }
-
static void ClearD(Env env, BitSetShortLongRep& bs)
{
if (IsShort(env))
@@ -675,18 +661,6 @@ template <typename Env, typename BitSetTraits>
void BitSetOps</*BitSetType*/ BitSetShortLongRep,
/*Brand*/ BSShortLong,
/*Env*/ Env,
- /*BitSetTraits*/ BitSetTraits>::OldStyleClearDLong(Env env, BitSetShortLongRep& bs)
-{
- assert(!IsShort(env));
- // Recall that OldStyleClearD does *not* require "bs" to be of the current epoch.
- // Therefore, we must allocate a new representation.
- bs = MakeEmptyArrayBits(env);
-}
-
-template <typename Env, typename BitSetTraits>
-void BitSetOps</*BitSetType*/ BitSetShortLongRep,
- /*Brand*/ BSShortLong,
- /*Env*/ Env,
/*BitSetTraits*/ BitSetTraits>::ClearDLong(Env env, BitSetShortLongRep& bs)
{
assert(!IsShort(env));
diff --git a/src/jit/bitsetasuint64.h b/src/jit/bitsetasuint64.h
index a1acaa5a80..fe439ee937 100644
--- a/src/jit/bitsetasuint64.h
+++ b/src/jit/bitsetasuint64.h
@@ -44,11 +44,6 @@ public:
lhs = rhs;
}
- static void OldStyleClearD(Env env, UINT64& bs)
- {
- bs = 0;
- }
-
static void ClearD(Env env, UINT64& bs)
{
bs = 0;
diff --git a/src/jit/bitsetasuint64inclass.h b/src/jit/bitsetasuint64inclass.h
index 3680f2cf7a..fe5d73ad7e 100644
--- a/src/jit/bitsetasuint64inclass.h
+++ b/src/jit/bitsetasuint64inclass.h
@@ -168,16 +168,6 @@ private:
return res;
}
- inline void OldStyleClearD(Env env)
- {
- // Recall that OldStyleClearD does *not* require "*this" to be of the current epoch.
- Uint64BitSetOps::OldStyleClearD(env, m_bits);
-#ifdef DEBUG
- // But it updates it to of the current epoch.
- m_epoch = BitSetTraits::GetEpoch(env);
-#endif
- }
-
inline void ClearD(Env env)
{
assert(m_epoch == BitSetTraits::GetEpoch(env));
@@ -322,11 +312,6 @@ public:
lhs = rhs;
}
- static void OldStyleClearD(Env env, BST& bs)
- {
- bs.OldStyleClearD(env);
- }
-
static void ClearD(Env env, BST& bs)
{
bs.ClearD(env);
diff --git a/src/jit/block.cpp b/src/jit/block.cpp
index 86760e4962..ab4be46571 100644
--- a/src/jit/block.cpp
+++ b/src/jit/block.cpp
@@ -799,7 +799,7 @@ BasicBlock* BasicBlock::GetUniqueSucc()
// Static vars.
BasicBlock::MemoryPhiArg* BasicBlock::EmptyMemoryPhiDef = (BasicBlock::MemoryPhiArg*)0x1;
-unsigned PtrKeyFuncs<BasicBlock>::GetHashCode(const BasicBlock* ptr)
+unsigned JitPtrKeyFuncs<BasicBlock>::GetHashCode(const BasicBlock* ptr)
{
#ifdef DEBUG
unsigned hash = SsaStressHashHelper();
diff --git a/src/jit/block.h b/src/jit/block.h
index 361b4519e3..354823869a 100644
--- a/src/jit/block.h
+++ b/src/jit/block.h
@@ -27,7 +27,7 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#include "blockset.h"
#include "jitstd.h"
#include "bitvec.h"
-#include "simplerhash.h"
+#include "jithashtable.h"
/*****************************************************************************/
typedef BitVec EXPSET_TP;
@@ -1192,7 +1192,7 @@ public:
};
template <>
-struct PtrKeyFuncs<BasicBlock> : public KeyFuncsDefEquals<const BasicBlock*>
+struct JitPtrKeyFuncs<BasicBlock> : public JitKeyFuncsDefEquals<const BasicBlock*>
{
public:
// Make sure hashing is deterministic and not on "ptr."
@@ -1200,13 +1200,13 @@ public:
};
// A set of blocks.
-typedef SimplerHashTable<BasicBlock*, PtrKeyFuncs<BasicBlock>, bool, JitSimplerHashBehavior> BlkSet;
+typedef JitHashTable<BasicBlock*, JitPtrKeyFuncs<BasicBlock>, bool> BlkSet;
// A map of block -> set of blocks, can be used as sparse block trees.
-typedef SimplerHashTable<BasicBlock*, PtrKeyFuncs<BasicBlock>, BlkSet*, JitSimplerHashBehavior> BlkToBlkSetMap;
+typedef JitHashTable<BasicBlock*, JitPtrKeyFuncs<BasicBlock>, BlkSet*> BlkToBlkSetMap;
// Map from Block to Block. Used for a variety of purposes.
-typedef SimplerHashTable<BasicBlock*, PtrKeyFuncs<BasicBlock>, BasicBlock*, JitSimplerHashBehavior> BlockToBlockMap;
+typedef JitHashTable<BasicBlock*, JitPtrKeyFuncs<BasicBlock>, BasicBlock*> BlockToBlockMap;
// In compiler terminology the control flow between two BasicBlocks
// is typically referred to as an "edge". Most well known are the
diff --git a/src/jit/codegen.h b/src/jit/codegen.h
index 879ee7bfa6..d83993b56a 100644
--- a/src/jit/codegen.h
+++ b/src/jit/codegen.h
@@ -51,18 +51,17 @@ public:
private:
#if defined(_TARGET_XARCH_) && !FEATURE_STACK_FP_X87
// Bit masks used in negating a float or double number.
- // The below gentrees encapsulate the data offset to the bitmasks as GT_CLS_VAR nodes.
// This is to avoid creating more than one data constant for these bitmasks when a
// method has more than one GT_NEG operation on floating point values.
- GenTreePtr negBitmaskFlt;
- GenTreePtr negBitmaskDbl;
+ CORINFO_FIELD_HANDLE negBitmaskFlt;
+ CORINFO_FIELD_HANDLE negBitmaskDbl;
// Bit masks used in computing Math.Abs() of a float or double number.
- GenTreePtr absBitmaskFlt;
- GenTreePtr absBitmaskDbl;
+ CORINFO_FIELD_HANDLE absBitmaskFlt;
+ CORINFO_FIELD_HANDLE absBitmaskDbl;
// Bit mask used in U8 -> double conversion to adjust the result.
- GenTreePtr u8ToDblBitmask;
+ CORINFO_FIELD_HANDLE u8ToDblBitmask;
// Generates SSE2 code for the given tree as "Operand BitWiseOp BitMask"
void genSSE2BitwiseOp(GenTreePtr treeNode);
@@ -282,11 +281,9 @@ protected:
void genExitCode(BasicBlock* block);
- //-------------------------------------------------------------------------
-
+#ifdef LEGACY_BACKEND
GenTreePtr genMakeConst(const void* cnsAddr, var_types cnsType, GenTreePtr cnsTree, bool dblAlign);
-
- //-------------------------------------------------------------------------
+#endif
void genJumpToThrowHlpBlk(emitJumpKind jumpKind, SpecialCodeKind codeKind, GenTreePtr failBlk = nullptr);
diff --git a/src/jit/codegenarm64.cpp b/src/jit/codegenarm64.cpp
index 74ef06d588..f507cebd5f 100644
--- a/src/jit/codegenarm64.cpp
+++ b/src/jit/codegenarm64.cpp
@@ -1461,10 +1461,9 @@ void CodeGen::genSetRegToConst(regNumber targetReg, var_types targetType, GenTre
case GT_CNS_DBL:
{
- emitter* emit = getEmitter();
- emitAttr size = emitActualTypeSize(tree);
- GenTreeDblCon* dblConst = tree->AsDblCon();
- double constValue = dblConst->gtDblCon.gtDconVal;
+ emitter* emit = getEmitter();
+ emitAttr size = emitActualTypeSize(tree);
+ double constValue = tree->AsDblCon()->gtDconVal;
// Make sure we use "movi reg, 0x00" only for positive zero (0.0) and not for negative zero (-0.0)
if (*(__int64*)&constValue == 0)
@@ -1485,7 +1484,7 @@ void CodeGen::genSetRegToConst(regNumber targetReg, var_types targetType, GenTre
// We must load the FP constant from the constant pool
// Emit a data section constant for the float or double constant.
- CORINFO_FIELD_HANDLE hnd = emit->emitFltOrDblConst(dblConst);
+ CORINFO_FIELD_HANDLE hnd = emit->emitFltOrDblConst(constValue, size);
// For long address (default): `adrp + ldr + fmov` will be emitted.
// For short address (proven later), `ldr` will be emitted.
emit->emitIns_R_C(INS_ldr, size, targetReg, addrReg, hnd, 0);
@@ -2997,6 +2996,15 @@ void CodeGen::genCodeForStoreInd(GenTreeStoreInd* tree)
emitAttr attr = emitTypeSize(tree);
instruction ins = ins_Store(targetType);
+#ifdef FEATURE_SIMD
+ // Storing Vector3 of size 12 bytes through indirection
+ if (tree->TypeGet() == TYP_SIMD12)
+ {
+ genStoreIndTypeSIMD12(tree);
+ return;
+ }
+#endif // FEATURE_SIMD
+
GCInfo::WriteBarrierForm writeBarrierForm = gcInfo.gcIsWriteBarrierCandidate(tree, data);
if (writeBarrierForm != GCInfo::WBF_NoBarrier)
{
@@ -4219,11 +4227,17 @@ void CodeGen::genSIMDIntrinsicWiden(GenTreeSIMD* simdNode)
instruction ins = getOpForSIMDIntrinsic(simdNode->gtSIMDIntrinsicID, baseType);
- bool is16B = (simdNode->gtSIMDIntrinsicID == SIMDIntrinsicWidenHi);
- emitAttr attr = is16B ? EA_16BYTE : EA_8BYTE;
- insOpts opt = genGetSimdInsOpt(is16B, baseType);
+ if (varTypeIsFloating(baseType))
+ {
+ getEmitter()->emitIns_R_R(ins, EA_8BYTE, targetReg, op1Reg);
+ }
+ else
+ {
+ bool is16B = (simdNode->gtSIMDIntrinsicID == SIMDIntrinsicWidenHi);
+ insOpts opt = genGetSimdInsOpt(is16B, baseType);
- getEmitter()->emitIns_R_R(ins, attr, targetReg, op1Reg, opt);
+ getEmitter()->emitIns_R_R(ins, is16B ? EA_16BYTE : EA_8BYTE, targetReg, op1Reg, opt);
+ }
genProduceReg(simdNode);
}
@@ -4258,19 +4272,48 @@ void CodeGen::genSIMDIntrinsicNarrow(GenTreeSIMD* simdNode)
assert(genIsValidFloatReg(op2Reg));
assert(genIsValidFloatReg(targetReg));
assert(op2Reg != targetReg);
+ assert(simdNode->gtSIMDSize == 16);
instruction ins = getOpForSIMDIntrinsic(simdNode->gtSIMDIntrinsicID, baseType);
-
assert((ins == INS_fcvtn) || (ins == INS_xtn));
- instruction ins2 = ins == INS_fcvtn ? INS_fcvtn2 : INS_xtn2;
-
- bool is16B = (simdNode->gtSIMDSize > 8);
- emitAttr attr = is16B ? EA_16BYTE : EA_8BYTE;
- insOpts opt = genGetSimdInsOpt(is16B, baseType);
+ if (ins == INS_fcvtn)
+ {
+ getEmitter()->emitIns_R_R(INS_fcvtn, EA_8BYTE, targetReg, op1Reg);
+ getEmitter()->emitIns_R_R(INS_fcvtn2, EA_8BYTE, targetReg, op2Reg);
+ }
+ else
+ {
+ insOpts opt = INS_OPTS_NONE;
+ insOpts opt2 = INS_OPTS_NONE;
- getEmitter()->emitIns_R_R(ins, attr, targetReg, op1Reg, opt);
- getEmitter()->emitIns_R_R(ins2, attr, targetReg, op2Reg, opt);
+ // This is not the same as genGetSimdInsOpt()
+ // Basetype is the soure operand type
+ // However encoding is based on the destination operand type which is 1/2 the basetype.
+ switch (baseType)
+ {
+ case TYP_ULONG:
+ case TYP_LONG:
+ opt = INS_OPTS_2S;
+ opt2 = INS_OPTS_4S;
+ break;
+ case TYP_UINT:
+ case TYP_INT:
+ opt = INS_OPTS_4H;
+ opt2 = INS_OPTS_8H;
+ break;
+ case TYP_CHAR:
+ case TYP_SHORT:
+ opt = INS_OPTS_8B;
+ opt2 = INS_OPTS_16B;
+ break;
+ default:
+ assert(!"Unsupported narrowing element type");
+ unreached();
+ }
+ getEmitter()->emitIns_R_R(INS_xtn, EA_8BYTE, targetReg, op1Reg, opt);
+ getEmitter()->emitIns_R_R(INS_xtn2, EA_16BYTE, targetReg, op2Reg, opt2);
+ }
genProduceReg(simdNode);
}
@@ -4703,6 +4746,89 @@ void CodeGen::genSIMDIntrinsicUpperRestore(GenTreeSIMD* simdNode)
getEmitter()->emitIns_R_R_I_I(INS_mov, EA_8BYTE, lclVarReg, srcReg, 1, 0);
}
+//-----------------------------------------------------------------------------
+// genStoreIndTypeSIMD12: store indirect a TYP_SIMD12 (i.e. Vector3) to memory.
+// Since Vector3 is not a hardware supported write size, it is performed
+// as two writes: 8 byte followed by 4-byte.
+//
+// Arguments:
+// treeNode - tree node that is attempting to store indirect
+//
+//
+// Return Value:
+// None.
+//
+void CodeGen::genStoreIndTypeSIMD12(GenTree* treeNode)
+{
+ assert(treeNode->OperGet() == GT_STOREIND);
+
+ GenTree* addr = treeNode->gtOp.gtOp1;
+ GenTree* data = treeNode->gtOp.gtOp2;
+
+ // addr and data should not be contained.
+ assert(!data->isContained());
+ assert(!addr->isContained());
+
+#ifdef DEBUG
+ // Should not require a write barrier
+ GCInfo::WriteBarrierForm writeBarrierForm = gcInfo.gcIsWriteBarrierCandidate(treeNode, data);
+ assert(writeBarrierForm == GCInfo::WBF_NoBarrier);
+#endif
+
+ genConsumeOperands(treeNode->AsOp());
+
+ // Need an addtional integer register to extract upper 4 bytes from data.
+ regNumber tmpReg = treeNode->GetSingleTempReg();
+ assert(tmpReg != addr->gtRegNum);
+
+ // 8-byte write
+ getEmitter()->emitIns_R_R(ins_Store(TYP_DOUBLE), EA_8BYTE, data->gtRegNum, addr->gtRegNum);
+
+ // Extract upper 4-bytes from data
+ getEmitter()->emitIns_R_R_I(INS_mov, EA_4BYTE, tmpReg, data->gtRegNum, 2);
+
+ // 4-byte write
+ getEmitter()->emitIns_R_R_I(INS_str, EA_4BYTE, tmpReg, addr->gtRegNum, 8);
+}
+
+//-----------------------------------------------------------------------------
+// genLoadIndTypeSIMD12: load indirect a TYP_SIMD12 (i.e. Vector3) value.
+// Since Vector3 is not a hardware supported write size, it is performed
+// as two loads: 8 byte followed by 4-byte.
+//
+// Arguments:
+// treeNode - tree node of GT_IND
+//
+//
+// Return Value:
+// None.
+//
+void CodeGen::genLoadIndTypeSIMD12(GenTree* treeNode)
+{
+ assert(treeNode->OperGet() == GT_IND);
+
+ GenTree* addr = treeNode->gtOp.gtOp1;
+ regNumber targetReg = treeNode->gtRegNum;
+
+ assert(!addr->isContained());
+
+ regNumber operandReg = genConsumeReg(addr);
+
+ // Need an addtional int register to read upper 4 bytes, which is different from targetReg
+ regNumber tmpReg = treeNode->GetSingleTempReg();
+
+ // 8-byte read
+ getEmitter()->emitIns_R_R(ins_Load(TYP_DOUBLE), EA_8BYTE, targetReg, addr->gtRegNum);
+
+ // 4-byte read
+ getEmitter()->emitIns_R_R_I(INS_ldr, EA_4BYTE, tmpReg, addr->gtRegNum, 8);
+
+ // Insert upper 4-bytes into data
+ getEmitter()->emitIns_R_R_I(INS_mov, EA_4BYTE, targetReg, tmpReg, 2);
+
+ genProduceReg(treeNode);
+}
+
#endif // FEATURE_SIMD
/*****************************************************************************
diff --git a/src/jit/codegenarmarch.cpp b/src/jit/codegenarmarch.cpp
index cbc3e4b7f5..758dd0b931 100644
--- a/src/jit/codegenarmarch.cpp
+++ b/src/jit/codegenarmarch.cpp
@@ -1716,6 +1716,15 @@ void CodeGen::genCodeForIndir(GenTreeIndir* tree)
emitAttr attr = emitTypeSize(tree);
instruction ins = ins_Load(targetType);
+#ifdef FEATURE_SIMD
+ // Handling of Vector3 type values loaded through indirection.
+ if (tree->TypeGet() == TYP_SIMD12)
+ {
+ genLoadIndTypeSIMD12(tree);
+ return;
+ }
+#endif // FEATURE_SIMD
+
genConsumeAddress(tree->Addr());
if ((tree->gtFlags & GTF_IND_VOLATILE) != 0)
{
@@ -2833,13 +2842,7 @@ void CodeGen::genIntToIntCast(GenTreePtr treeNode)
emitAttr movSize = emitActualTypeSize(dstType);
bool movRequired = false;
-#ifdef _TARGET_ARM_
- if (varTypeIsLong(srcType))
- {
- genLongToIntCast(treeNode);
- return;
- }
-#endif // _TARGET_ARM_
+ assert(genTypeSize(srcType) <= genTypeSize(TYP_I_IMPL));
regNumber targetReg = treeNode->gtRegNum;
regNumber sourceReg = castOp->gtRegNum;
@@ -3098,7 +3101,7 @@ void CodeGen::genCreateAndStoreGCInfo(unsigned codeSize,
unsigned prologSize,
unsigned epilogSize DEBUGARG(void* codePtr))
{
- IAllocator* allowZeroAlloc = new (compiler, CMK_GC) AllowZeroAllocator(compiler->getAllocatorGC());
+ IAllocator* allowZeroAlloc = new (compiler, CMK_GC) CompIAllocator(compiler->getAllocatorGC());
GcInfoEncoder* gcInfoEncoder = new (compiler, CMK_GC)
GcInfoEncoder(compiler->info.compCompHnd, compiler->info.compMethodInfo, allowZeroAlloc, NOMEM);
assert(gcInfoEncoder != nullptr);
diff --git a/src/jit/codegencommon.cpp b/src/jit/codegencommon.cpp
index ac8c667fba..18b512065f 100644
--- a/src/jit/codegencommon.cpp
+++ b/src/jit/codegencommon.cpp
@@ -10957,6 +10957,7 @@ void CodeGen::genGenerateStackProbe()
}
#endif // STACK_PROBES
+#ifdef LEGACY_BACKEND
/*****************************************************************************
*
* Record the constant and return a tree node that yields its address.
@@ -11000,6 +11001,7 @@ GenTreePtr CodeGen::genMakeConst(const void* cnsAddr, var_types cnsType, GenTree
return new (compiler, GT_CLS_VAR) GenTreeClsVar(cnsType, compiler->eeFindJitDataOffs(cnum), nullptr);
}
+#endif // LEGACY_BACKEND
#if defined(_TARGET_XARCH_) && !FEATURE_STACK_FP_X87
// Save compCalleeFPRegsPushed with the smallest register number saved at [RSP+offset], working
@@ -11221,12 +11223,10 @@ bool Compiler::IsHfa(GenTreePtr tree)
var_types Compiler::GetHfaType(GenTreePtr tree)
{
#ifdef FEATURE_HFA
- if (tree->TypeGet() == TYP_STRUCT)
- {
- return GetHfaType(gtGetStructHandleIfPresent(tree));
- }
-#endif
+ return GetHfaType(gtGetStructHandleIfPresent(tree));
+#else
return TYP_UNDEF;
+#endif
}
unsigned Compiler::GetHfaCount(GenTreePtr tree)
diff --git a/src/jit/codegenlegacy.cpp b/src/jit/codegenlegacy.cpp
index 528ab6efdc..d24e31414b 100644
--- a/src/jit/codegenlegacy.cpp
+++ b/src/jit/codegenlegacy.cpp
@@ -20336,7 +20336,7 @@ void* CodeGen::genCreateAndStoreGCInfoJIT32(unsigned codeSize,
void CodeGen::genCreateAndStoreGCInfoX64(unsigned codeSize, unsigned prologSize DEBUGARG(void* codePtr))
{
- IAllocator* allowZeroAlloc = new (compiler, CMK_GC) AllowZeroAllocator(compiler->getAllocatorGC());
+ IAllocator* allowZeroAlloc = new (compiler, CMK_GC) CompIAllocator(compiler->getAllocatorGC());
GcInfoEncoder* gcInfoEncoder = new (compiler, CMK_GC)
GcInfoEncoder(compiler->info.compCompHnd, compiler->info.compMethodInfo, allowZeroAlloc, NOMEM);
assert(gcInfoEncoder);
diff --git a/src/jit/codegenlinear.cpp b/src/jit/codegenlinear.cpp
index 830183ed5a..de56380922 100644
--- a/src/jit/codegenlinear.cpp
+++ b/src/jit/codegenlinear.cpp
@@ -1891,6 +1891,12 @@ void CodeGen::genCodeForCast(GenTreeOp* tree)
// Casts int32/uint32/int64/uint64 --> float/double
genIntToFloatCast(tree);
}
+#ifndef _TARGET_64BIT_
+ else if (varTypeIsLong(tree->gtOp1))
+ {
+ genLongToIntCast(tree);
+ }
+#endif // !_TARGET_64BIT_
else
{
// Casts int <--> int
diff --git a/src/jit/codegenxarch.cpp b/src/jit/codegenxarch.cpp
index a256c2eb9f..532187fb12 100644
--- a/src/jit/codegenxarch.cpp
+++ b/src/jit/codegenxarch.cpp
@@ -440,7 +440,6 @@ void CodeGen::instGen_Set_Reg_To_Imm(emitAttr size, regNumber reg, ssize_t imm,
*/
void CodeGen::genSetRegToConst(regNumber targetReg, var_types targetType, GenTreePtr tree)
{
-
switch (tree->gtOper)
{
case GT_CNS_INT:
@@ -464,28 +463,20 @@ void CodeGen::genSetRegToConst(regNumber targetReg, var_types targetType, GenTre
case GT_CNS_DBL:
{
- double constValue = tree->gtDblCon.gtDconVal;
+ emitter* emit = getEmitter();
+ emitAttr size = emitTypeSize(targetType);
+ double constValue = tree->gtDblCon.gtDconVal;
// Make sure we use "xorps reg, reg" only for +ve zero constant (0.0) and not for -ve zero (-0.0)
if (*(__int64*)&constValue == 0)
{
// A faster/smaller way to generate 0
- inst_RV_RV(INS_xorps, targetReg, targetReg, targetType);
+ emit->emitIns_R_R(INS_xorps, size, targetReg, targetReg);
}
else
{
- GenTreePtr cns;
- if (targetType == TYP_FLOAT)
- {
- float f = forceCastToFloat(constValue);
- cns = genMakeConst(&f, targetType, tree, false);
- }
- else
- {
- cns = genMakeConst(&constValue, targetType, tree, true);
- }
-
- inst_RV_TT(ins_Load(targetType), targetReg, cns);
+ CORINFO_FIELD_HANDLE hnd = emit->emitFltOrDblConst(constValue, size);
+ emit->emitIns_R_C(ins_Load(targetType), size, targetReg, hnd, 0);
}
}
break;
@@ -6515,14 +6506,7 @@ void CodeGen::genIntToIntCast(GenTreePtr treeNode)
GenTreePtr castOp = treeNode->gtCast.CastOp();
var_types srcType = genActualType(castOp->TypeGet());
noway_assert(genTypeSize(srcType) >= 4);
-
-#ifdef _TARGET_X86_
- if (varTypeIsLong(srcType))
- {
- genLongToIntCast(treeNode);
- return;
- }
-#endif // _TARGET_X86_
+ assert(genTypeSize(srcType) <= genTypeSize(TYP_I_IMPL));
regNumber targetReg = treeNode->gtRegNum;
regNumber sourceReg = castOp->gtRegNum;
@@ -6936,16 +6920,16 @@ void CodeGen::genIntToFloatCast(GenTreePtr treeNode)
// Adjust the result
// result = result + 0x43f00000 00000000
// addsd resultReg, 0x43f00000 00000000
- GenTreePtr* cns = &u8ToDblBitmask;
+ CORINFO_FIELD_HANDLE* cns = &u8ToDblBitmask;
if (*cns == nullptr)
{
double d;
static_assert_no_msg(sizeof(double) == sizeof(__int64));
*((__int64*)&d) = 0x43f0000000000000LL;
- *cns = genMakeConst(&d, dstType, treeNode, true);
+ *cns = getEmitter()->emitFltOrDblConst(d, EA_8BYTE);
}
- inst_RV_TT(INS_addsd, treeNode->gtRegNum, *cns);
+ getEmitter()->emitIns_R_C(INS_addsd, EA_8BYTE, treeNode->gtRegNum, *cns, 0);
genDefineTempLabel(label);
}
@@ -7278,12 +7262,12 @@ void CodeGen::genSSE2BitwiseOp(GenTreePtr treeNode)
var_types targetType = treeNode->TypeGet();
assert(varTypeIsFloating(targetType));
- float f;
- double d;
- GenTreePtr* bitMask = nullptr;
- instruction ins = INS_invalid;
- void* cnsAddr = nullptr;
- bool dblAlign = false;
+ float f;
+ double d;
+ CORINFO_FIELD_HANDLE* bitMask = nullptr;
+ instruction ins = INS_invalid;
+ void* cnsAddr = nullptr;
+ bool dblAlign = false;
switch (treeNode->OperGet())
{
@@ -7346,7 +7330,7 @@ void CodeGen::genSSE2BitwiseOp(GenTreePtr treeNode)
if (*bitMask == nullptr)
{
assert(cnsAddr != nullptr);
- *bitMask = genMakeConst(cnsAddr, targetType, treeNode, dblAlign);
+ *bitMask = getEmitter()->emitAnyConst(cnsAddr, genTypeSize(targetType), dblAlign);
}
// We need an additional register for bitmask.
@@ -7367,7 +7351,7 @@ void CodeGen::genSSE2BitwiseOp(GenTreePtr treeNode)
operandReg = tmpReg;
}
- inst_RV_TT(ins_Load(targetType, false), tmpReg, *bitMask);
+ getEmitter()->emitIns_R_C(ins_Load(targetType, false), emitTypeSize(targetType), tmpReg, *bitMask, 0);
assert(ins != INS_invalid);
inst_RV_RV(ins, targetReg, operandReg, targetType);
}
@@ -8472,7 +8456,7 @@ void* CodeGen::genCreateAndStoreGCInfoJIT32(unsigned codeSize,
#else // !JIT32_GCENCODER
void CodeGen::genCreateAndStoreGCInfoX64(unsigned codeSize, unsigned prologSize DEBUGARG(void* codePtr))
{
- IAllocator* allowZeroAlloc = new (compiler, CMK_GC) AllowZeroAllocator(compiler->getAllocatorGC());
+ IAllocator* allowZeroAlloc = new (compiler, CMK_GC) CompIAllocator(compiler->getAllocatorGC());
GcInfoEncoder* gcInfoEncoder = new (compiler, CMK_GC)
GcInfoEncoder(compiler->info.compCompHnd, compiler->info.compMethodInfo, allowZeroAlloc, NOMEM);
assert(gcInfoEncoder);
diff --git a/src/jit/compiler.cpp b/src/jit/compiler.cpp
index efad4cfd0f..35cfcf6a73 100644
--- a/src/jit/compiler.cpp
+++ b/src/jit/compiler.cpp
@@ -1180,7 +1180,7 @@ struct FileLine
m_condStr = other.m_condStr;
}
- // GetHashCode() and Equals() are needed by SimplerHashTable
+ // GetHashCode() and Equals() are needed by JitHashTable
static unsigned GetHashCode(FileLine fl)
{
@@ -1200,7 +1200,7 @@ struct FileLine
}
};
-typedef SimplerHashTable<FileLine, FileLine, size_t, JitSimplerHashBehavior> FileLineToCountMap;
+typedef JitHashTable<FileLine, FileLine, size_t, HostAllocator> FileLineToCountMap;
FileLineToCountMap* NowayAssertMap;
void Compiler::RecordNowayAssert(const char* filename, unsigned line, const char* condStr)
@@ -1892,13 +1892,15 @@ void Compiler::compInit(ArenaAllocator* pAlloc, InlineInfo* inlineInfo)
{
m_inlineStrategy = nullptr;
compInlineResult = inlineInfo->inlineResult;
- compAsIAllocator = nullptr; // We shouldn't be using the compAsIAllocator for other than the root compiler.
+
+ // We shouldn't be using the compAllocatorGeneric for other than the root compiler.
+ compAllocatorGeneric = nullptr;
#if MEASURE_MEM_ALLOC
- compAsIAllocatorBitset = nullptr;
- compAsIAllocatorGC = nullptr;
- compAsIAllocatorLoopHoist = nullptr;
+ compAllocatorBitset = nullptr;
+ compAllocatorGC = nullptr;
+ compAllocatorLoopHoist = nullptr;
#ifdef DEBUG
- compAsIAllocatorDebugOnly = nullptr;
+ compAllocatorDebugOnly = nullptr;
#endif // DEBUG
#endif // MEASURE_MEM_ALLOC
@@ -1910,18 +1912,19 @@ void Compiler::compInit(ArenaAllocator* pAlloc, InlineInfo* inlineInfo)
{
m_inlineStrategy = new (this, CMK_Inlining) InlineStrategy(this);
compInlineResult = nullptr;
- compAsIAllocator = new (this, CMK_Unknown) CompAllocator(this, CMK_AsIAllocator);
+
+ compAllocatorGeneric = new (this, CMK_Unknown) CompAllocator(this, CMK_Generic);
#if MEASURE_MEM_ALLOC
- compAsIAllocatorBitset = new (this, CMK_Unknown) CompAllocator(this, CMK_bitset);
- compAsIAllocatorGC = new (this, CMK_Unknown) CompAllocator(this, CMK_GC);
- compAsIAllocatorLoopHoist = new (this, CMK_Unknown) CompAllocator(this, CMK_LoopHoist);
+ compAllocatorBitset = new (this, CMK_Unknown) CompAllocator(this, CMK_bitset);
+ compAllocatorGC = new (this, CMK_Unknown) CompAllocator(this, CMK_GC);
+ compAllocatorLoopHoist = new (this, CMK_Unknown) CompAllocator(this, CMK_LoopHoist);
#ifdef DEBUG
- compAsIAllocatorDebugOnly = new (this, CMK_Unknown) CompAllocator(this, CMK_DebugOnly);
+ compAllocatorDebugOnly = new (this, CMK_Unknown) CompAllocator(this, CMK_DebugOnly);
#endif // DEBUG
#endif // MEASURE_MEM_ALLOC
#ifdef LEGACY_BACKEND
- compQMarks = new (this, CMK_Unknown) ExpandArrayStack<GenTreePtr>(getAllocator());
+ compQMarks = new (this, CMK_Unknown) JitExpandArrayStack<GenTreePtr>(getAllocator());
#endif
}
@@ -1961,9 +1964,9 @@ void Compiler::compInit(ArenaAllocator* pAlloc, InlineInfo* inlineInfo)
// If this method were a real constructor for Compiler, these would
// become method initializations.
- impPendingBlockMembers = ExpandArray<BYTE>(getAllocator());
- impSpillCliquePredMembers = ExpandArray<BYTE>(getAllocator());
- impSpillCliqueSuccMembers = ExpandArray<BYTE>(getAllocator());
+ impPendingBlockMembers = JitExpandArray<BYTE>(getAllocator());
+ impSpillCliquePredMembers = JitExpandArray<BYTE>(getAllocator());
+ impSpillCliqueSuccMembers = JitExpandArray<BYTE>(getAllocator());
memset(&lvMemoryPerSsaData, 0, sizeof(PerSsaArray));
lvMemoryPerSsaData.Init(getAllocator());
@@ -2159,19 +2162,6 @@ void Compiler::compDoComponentUnitTestsOnce()
}
#endif // DEBUG
-/******************************************************************************
- *
- * The Emitter uses this callback function to allocate its memory
- */
-
-/* static */
-void* Compiler::compGetMemCallback(void* p, size_t size, CompMemKind cmk)
-{
- assert(p);
-
- return ((Compiler*)p)->compGetMem(size, cmk);
-}
-
/*****************************************************************************
*
* The central memory allocation routine used by the compiler. Normally this
@@ -5186,7 +5176,7 @@ bool Compiler::compQuirkForPPP()
assert((varDscExposedStruct->lvExactSize / TARGET_POINTER_SIZE) == 8);
BYTE* oldGCPtrs = varDscExposedStruct->lvGcLayout;
- BYTE* newGCPtrs = (BYTE*)compGetMemA(8, CMK_LvaTable);
+ BYTE* newGCPtrs = (BYTE*)compGetMem(8, CMK_LvaTable);
for (int i = 0; i < 4; i++)
{
diff --git a/src/jit/compiler.h b/src/jit/compiler.h
index ffaa8cec9d..b71a774493 100644
--- a/src/jit/compiler.h
+++ b/src/jit/compiler.h
@@ -33,14 +33,14 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#include "instr.h"
#include "regalloc.h"
#include "sm.h"
-#include "simplerhash.h"
+#include "jithashtable.h"
#include "cycletimer.h"
#include "blockset.h"
#include "jitstd.h"
#include "arraystack.h"
#include "hashbv.h"
#include "fp.h"
-#include "expandarray.h"
+#include "jitexpandarray.h"
#include "tinyarray.h"
#include "valuenum.h"
#include "reglist.h"
@@ -106,10 +106,6 @@ class Compiler;
// Declare global operator new overloads that use the Compiler::compGetMem() function for allocation.
//
-// Or the more-general IAllocator interface.
-void* __cdecl operator new(size_t n, IAllocator* alloc);
-void* __cdecl operator new[](size_t n, IAllocator* alloc);
-
// I wanted to make the second argument optional, with default = CMK_Unknown, but that
// caused these to be ambiguous with the global placement new operators.
void* __cdecl operator new(size_t n, Compiler* context, CompMemKind cmk);
@@ -201,7 +197,7 @@ public:
}
};
-typedef ExpandArray<LclSsaVarDsc> PerSsaArray;
+typedef JitExpandArray<LclSsaVarDsc> PerSsaArray;
class LclVarDsc
{
@@ -425,7 +421,7 @@ public:
unsigned lvHfaSlots() const
{
assert(lvIsHfa());
- assert(lvType == TYP_STRUCT);
+ assert(varTypeIsStruct(lvType));
#ifdef _TARGET_ARM_
return lvExactSize / sizeof(float);
#else // _TARGET_ARM64_
@@ -1479,39 +1475,11 @@ struct TestLabelAndNum
}
};
-typedef SimplerHashTable<GenTreePtr, PtrKeyFuncs<GenTree>, TestLabelAndNum, JitSimplerHashBehavior> NodeToTestDataMap;
+typedef JitHashTable<GenTreePtr, JitPtrKeyFuncs<GenTree>, TestLabelAndNum> NodeToTestDataMap;
// XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#endif // DEBUG
-// This class implements the "IAllocator" interface, so that we can use
-// utilcode collection classes in the JIT, and have them use the JIT's allocator.
-
-class CompAllocator : public IAllocator
-{
- Compiler* m_comp;
-#if MEASURE_MEM_ALLOC
- CompMemKind m_cmk;
-#endif
-public:
- CompAllocator(Compiler* comp, CompMemKind cmk)
- : m_comp(comp)
-#if MEASURE_MEM_ALLOC
- , m_cmk(cmk)
-#endif
- {
- }
-
- inline void* Alloc(size_t sz);
-
- inline void* ArrayAlloc(size_t elems, size_t elemSize);
-
- // For the compiler's no-release allocator, free operations are no-ops.
- void Free(void* p)
- {
- }
-};
-
/*
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
@@ -1905,8 +1873,7 @@ public:
flowList* BlockPredsWithEH(BasicBlock* blk);
// This table is useful for memoization of the method above.
- typedef SimplerHashTable<BasicBlock*, PtrKeyFuncs<BasicBlock>, flowList*, JitSimplerHashBehavior>
- BlockToFlowListMap;
+ typedef JitHashTable<BasicBlock*, JitPtrKeyFuncs<BasicBlock>, flowList*> BlockToFlowListMap;
BlockToFlowListMap* m_blockToEHPreds;
BlockToFlowListMap* GetBlockToEHPreds()
{
@@ -3266,7 +3233,7 @@ private:
PendingDsc* impPendingFree; // Freed up dscs that can be reused
// We keep a byte-per-block map (dynamically extended) in the top-level Compiler object of a compilation.
- ExpandArray<BYTE> impPendingBlockMembers;
+ JitExpandArray<BYTE> impPendingBlockMembers;
// Return the byte for "b" (allocating/extending impPendingBlockMembers if necessary.)
// Operates on the map in the top-level ancestor.
@@ -3354,8 +3321,8 @@ private:
// When we compute a "spill clique" (see above) these byte-maps are allocated to have a byte per basic
// block, and represent the predecessor and successor members of the clique currently being computed.
// *** Access to these will need to be locked in a parallel compiler.
- ExpandArray<BYTE> impSpillCliquePredMembers;
- ExpandArray<BYTE> impSpillCliqueSuccMembers;
+ JitExpandArray<BYTE> impSpillCliquePredMembers;
+ JitExpandArray<BYTE> impSpillCliqueSuccMembers;
enum SpillCliqueDir
{
@@ -3935,7 +3902,7 @@ public:
// "x", and a def of a new SSA name for "x". The tree only has one local variable for "x", so it has to choose
// whether to treat that as the use or def. It chooses the "use", and thus the old SSA name. This map allows us
// to record/recover the "def" SSA number, given the lcl var node for "x" in such a tree.
- typedef SimplerHashTable<GenTreePtr, PtrKeyFuncs<GenTree>, unsigned, JitSimplerHashBehavior> NodeToUnsignedMap;
+ typedef JitHashTable<GenTreePtr, JitPtrKeyFuncs<GenTree>, unsigned> NodeToUnsignedMap;
NodeToUnsignedMap* m_opAsgnVarDefSsaNums;
NodeToUnsignedMap* GetOpAsgnVarDefSsaNums()
{
@@ -3997,16 +3964,15 @@ public:
{
}
};
- typedef SimplerHashTable<GenTreePtr, PtrKeyFuncs<GenTree>, IndirectAssignmentAnnotation*, JitSimplerHashBehavior>
- NodeToIndirAssignMap;
+ typedef JitHashTable<GenTreePtr, JitPtrKeyFuncs<GenTree>, IndirectAssignmentAnnotation*> NodeToIndirAssignMap;
NodeToIndirAssignMap* m_indirAssignMap;
NodeToIndirAssignMap* GetIndirAssignMap()
{
if (m_indirAssignMap == nullptr)
{
// Create a CompAllocator that labels sub-structure with CMK_IndirAssignMap, and use that for allocation.
- IAllocator* ialloc = new (this, CMK_IndirAssignMap) CompAllocator(this, CMK_IndirAssignMap);
- m_indirAssignMap = new (ialloc) NodeToIndirAssignMap(ialloc);
+ CompAllocator* ialloc = new (this, CMK_IndirAssignMap) CompAllocator(this, CMK_IndirAssignMap);
+ m_indirAssignMap = new (ialloc) NodeToIndirAssignMap(ialloc);
}
return m_indirAssignMap;
}
@@ -4351,11 +4317,10 @@ public:
// The switch block "switchBlk" just had an entry with value "from" modified to the value "to".
// Update "this" as necessary: if "from" is no longer an element of the jump table of "switchBlk",
// remove it from "this", and ensure that "to" is a member. Use "alloc" to do any required allocation.
- void UpdateTarget(IAllocator* alloc, BasicBlock* switchBlk, BasicBlock* from, BasicBlock* to);
+ void UpdateTarget(CompAllocator* alloc, BasicBlock* switchBlk, BasicBlock* from, BasicBlock* to);
};
- typedef SimplerHashTable<BasicBlock*, PtrKeyFuncs<BasicBlock>, SwitchUniqueSuccSet, JitSimplerHashBehavior>
- BlockToSwitchDescMap;
+ typedef JitHashTable<BasicBlock*, JitPtrKeyFuncs<BasicBlock>, SwitchUniqueSuccSet> BlockToSwitchDescMap;
private:
// Maps BasicBlock*'s that end in switch statements to SwitchUniqueSuccSets that allow
@@ -5104,7 +5069,7 @@ protected:
void optHoistLoopCode();
// To represent sets of VN's that have already been hoisted in outer loops.
- typedef SimplerHashTable<ValueNum, SmallPrimitiveKeyFuncs<ValueNum>, bool, JitSimplerHashBehavior> VNToBoolMap;
+ typedef JitHashTable<ValueNum, JitSmallPrimitiveKeyFuncs<ValueNum>, bool> VNToBoolMap;
typedef VNToBoolMap VNSet;
struct LoopHoistContext
@@ -5330,20 +5295,12 @@ public:
int lpLoopVarFPCount; // The register count for the FP LclVars that are read/written inside this loop
int lpVarInOutFPCount; // The register count for the FP LclVars that are alive inside or accross this loop
- typedef SimplerHashTable<CORINFO_FIELD_HANDLE,
- PtrKeyFuncs<struct CORINFO_FIELD_STRUCT_>,
- bool,
- JitSimplerHashBehavior>
- FieldHandleSet;
+ typedef JitHashTable<CORINFO_FIELD_HANDLE, JitPtrKeyFuncs<struct CORINFO_FIELD_STRUCT_>, bool> FieldHandleSet;
FieldHandleSet* lpFieldsModified; // This has entries (mappings to "true") for all static field and object
// instance fields modified
// in the loop.
- typedef SimplerHashTable<CORINFO_CLASS_HANDLE,
- PtrKeyFuncs<struct CORINFO_CLASS_STRUCT_>,
- bool,
- JitSimplerHashBehavior>
- ClassHandleSet;
+ typedef JitHashTable<CORINFO_CLASS_HANDLE, JitPtrKeyFuncs<struct CORINFO_CLASS_STRUCT_>, bool> ClassHandleSet;
ClassHandleSet* lpArrayElemTypesModified; // Bits set indicate the set of sz array element types such that
// arrays of that type are modified
// in the loop.
@@ -5660,7 +5617,7 @@ protected:
CSEdsc** optCSEhash;
CSEdsc** optCSEtab;
- typedef SimplerHashTable<GenTreePtr, PtrKeyFuncs<GenTree>, GenTreePtr, JitSimplerHashBehavior> NodeToNodeMap;
+ typedef JitHashTable<GenTreePtr, JitPtrKeyFuncs<GenTree>, GenTreePtr> NodeToNodeMap;
NodeToNodeMap* optCseCheckedBoundMap; // Maps bound nodes to ancestor compares that should be
// re-numbered with the bound to improve range check elimination
@@ -5780,8 +5737,7 @@ protected:
public:
// VN based copy propagation.
typedef ArrayStack<GenTreePtr> GenTreePtrStack;
- typedef SimplerHashTable<unsigned, SmallPrimitiveKeyFuncs<unsigned>, GenTreePtrStack*, JitSimplerHashBehavior>
- LclNumToGenTreePtrStack;
+ typedef JitHashTable<unsigned, JitSmallPrimitiveKeyFuncs<unsigned>, GenTreePtrStack*> LclNumToGenTreePtrStack;
// Kill set to track variables with intervening definitions.
VARSET_TP optCopyPropKillSet;
@@ -6135,11 +6091,11 @@ protected:
#ifdef DEBUG
GenTreePtr optAssertionPropCurrentTree;
#endif
- AssertionIndex* optComplementaryAssertionMap;
- ExpandArray<ASSERT_TP>* optAssertionDep; // table that holds dependent assertions (assertions
- // using the value of a local var) for each local var
- AssertionDsc* optAssertionTabPrivate; // table that holds info about value assignments
- AssertionIndex optAssertionCount; // total number of assertions in the assertion table
+ AssertionIndex* optComplementaryAssertionMap;
+ JitExpandArray<ASSERT_TP>* optAssertionDep; // table that holds dependent assertions (assertions
+ // using the value of a local var) for each local var
+ AssertionDsc* optAssertionTabPrivate; // table that holds info about value assignments
+ AssertionIndex optAssertionCount; // total number of assertions in the assertion table
AssertionIndex optMaxAssertionCount;
public:
@@ -6155,8 +6111,7 @@ public:
return optAssertionCount;
}
ASSERT_TP* bbJtrueAssertionOut;
- typedef SimplerHashTable<ValueNum, SmallPrimitiveKeyFuncs<ValueNum>, ASSERT_TP, JitSimplerHashBehavior>
- ValueNumToAssertsMap;
+ typedef JitHashTable<ValueNum, JitSmallPrimitiveKeyFuncs<ValueNum>, ASSERT_TP> ValueNumToAssertsMap;
ValueNumToAssertsMap* optValueNumToAsserts;
// Assertion prop helpers.
@@ -7076,8 +7031,7 @@ public:
// whose return type is other than TYP_VOID. 2) GT_CALL node is a frequently used
// structure and IL offset is needed only when generating debuggable code. Therefore
// it is desirable to avoid memory size penalty in retail scenarios.
- typedef SimplerHashTable<GenTreePtr, PtrKeyFuncs<GenTree>, IL_OFFSETX, JitSimplerHashBehavior>
- CallSiteILOffsetTable;
+ typedef JitHashTable<GenTreePtr, JitPtrKeyFuncs<GenTree>, IL_OFFSETX> CallSiteILOffsetTable;
CallSiteILOffsetTable* genCallSite2ILOffsetMap;
unsigned genReturnLocal; // Local number for the return value when applicable.
@@ -7926,8 +7880,8 @@ public:
// the importing is completely finished.
#ifdef LEGACY_BACKEND
- ExpandArrayStack<GenTreePtr>* compQMarks; // The set of QMark nodes created in the current compilation, so
- // we can iterate over these efficiently.
+ JitExpandArrayStack<GenTreePtr>* compQMarks; // The set of QMark nodes created in the current compilation, so
+ // we can iterate over these efficiently.
#endif
#if CPU_USES_BLOCK_MOVE
@@ -8785,10 +8739,7 @@ public:
#endif // LOOP_HOIST_STATS
void* compGetMemArray(size_t numElem, size_t elemSize, CompMemKind cmk = CMK_Unknown);
- void* compGetMemArrayA(size_t numElem, size_t elemSize, CompMemKind cmk = CMK_Unknown);
void* compGetMem(size_t sz, CompMemKind cmk = CMK_Unknown);
- void* compGetMemA(size_t sz, CompMemKind cmk = CMK_Unknown);
- static void* compGetMemCallback(void*, size_t, CompMemKind cmk = CMK_Unknown);
void compFreeMem(void*);
bool compIsForImportOnly();
@@ -8808,13 +8759,24 @@ public:
//-------------------------------------------------------------------------
- typedef ListNode<VarScopeDsc*> VarScopeListNode;
+ struct VarScopeListNode
+ {
+ VarScopeDsc* data;
+ VarScopeListNode* next;
+ static VarScopeListNode* Create(VarScopeDsc* value, CompAllocator* alloc)
+ {
+ VarScopeListNode* node = new (alloc) VarScopeListNode;
+ node->data = value;
+ node->next = nullptr;
+ return node;
+ }
+ };
struct VarScopeMapInfo
{
VarScopeListNode* head;
VarScopeListNode* tail;
- static VarScopeMapInfo* Create(VarScopeListNode* node, IAllocator* alloc)
+ static VarScopeMapInfo* Create(VarScopeListNode* node, CompAllocator* alloc)
{
VarScopeMapInfo* info = new (alloc) VarScopeMapInfo;
info->head = node;
@@ -8826,8 +8788,7 @@ public:
// Max value of scope count for which we would use linear search; for larger values we would use hashtable lookup.
static const unsigned MAX_LINEAR_FIND_LCL_SCOPELIST = 32;
- typedef SimplerHashTable<unsigned, SmallPrimitiveKeyFuncs<unsigned>, VarScopeMapInfo*, JitSimplerHashBehavior>
- VarNumToScopeDscMap;
+ typedef JitHashTable<unsigned, JitSmallPrimitiveKeyFuncs<unsigned>, VarScopeMapInfo*> VarNumToScopeDscMap;
// Map to keep variables' scope indexed by varNum containing it's scope dscs at the index.
VarNumToScopeDscMap* compVarScopeMap;
@@ -8888,16 +8849,13 @@ protected:
ArenaAllocator* compAllocator;
public:
- // This one presents an implementation of the "IAllocator" abstract class that uses "compAllocator",
- // suitable for use by utilcode collection types.
- IAllocator* compAsIAllocator;
-
+ CompAllocator* compAllocatorGeneric; // An allocator that uses the CMK_Generic tracker.
#if MEASURE_MEM_ALLOC
- IAllocator* compAsIAllocatorBitset; // An allocator that uses the CMK_bitset tracker.
- IAllocator* compAsIAllocatorGC; // An allocator that uses the CMK_GC tracker.
- IAllocator* compAsIAllocatorLoopHoist; // An allocator that uses the CMK_LoopHoist tracker.
+ CompAllocator* compAllocatorBitset; // An allocator that uses the CMK_bitset tracker.
+ CompAllocator* compAllocatorGC; // An allocator that uses the CMK_GC tracker.
+ CompAllocator* compAllocatorLoopHoist; // An allocator that uses the CMK_LoopHoist tracker.
#ifdef DEBUG
- IAllocator* compAsIAllocatorDebugOnly; // An allocator that uses the CMK_DebugOnly tracker.
+ CompAllocator* compAllocatorDebugOnly; // An allocator that uses the CMK_DebugOnly tracker.
#endif // DEBUG
#endif // MEASURE_MEM_ALLOC
@@ -8938,46 +8896,46 @@ public:
// Assumes called as part of process shutdown; does any compiler-specific work associated with that.
static void ProcessShutdownWork(ICorStaticInfo* statInfo);
- IAllocator* getAllocator()
+ CompAllocator* getAllocator()
{
- return compAsIAllocator;
+ return compAllocatorGeneric;
}
#if MEASURE_MEM_ALLOC
- IAllocator* getAllocatorBitset()
+ CompAllocator* getAllocatorBitset()
{
- return compAsIAllocatorBitset;
+ return compAllocatorBitset;
}
- IAllocator* getAllocatorGC()
+ CompAllocator* getAllocatorGC()
{
- return compAsIAllocatorGC;
+ return compAllocatorGC;
}
- IAllocator* getAllocatorLoopHoist()
+ CompAllocator* getAllocatorLoopHoist()
{
- return compAsIAllocatorLoopHoist;
+ return compAllocatorLoopHoist;
}
#else // !MEASURE_MEM_ALLOC
- IAllocator* getAllocatorBitset()
+ CompAllocator* getAllocatorBitset()
{
- return compAsIAllocator;
+ return compAllocatorGeneric;
}
- IAllocator* getAllocatorGC()
+ CompAllocator* getAllocatorGC()
{
- return compAsIAllocator;
+ return compAllocatorGeneric;
}
- IAllocator* getAllocatorLoopHoist()
+ CompAllocator* getAllocatorLoopHoist()
{
- return compAsIAllocator;
+ return compAllocatorGeneric;
}
#endif // !MEASURE_MEM_ALLOC
#ifdef DEBUG
- IAllocator* getAllocatorDebugOnly()
+ CompAllocator* getAllocatorDebugOnly()
{
#if MEASURE_MEM_ALLOC
- return compAsIAllocatorDebugOnly;
+ return compAllocatorDebugOnly;
#else // !MEASURE_MEM_ALLOC
- return compAsIAllocator;
+ return compAllocatorGeneric;
#endif // !MEASURE_MEM_ALLOC
}
#endif // DEBUG
@@ -9393,7 +9351,7 @@ public:
return compRoot->m_nodeTestData;
}
- typedef SimplerHashTable<GenTreePtr, PtrKeyFuncs<GenTree>, int, JitSimplerHashBehavior> NodeToIntMap;
+ typedef JitHashTable<GenTreePtr, JitPtrKeyFuncs<GenTree>, int> NodeToIntMap;
// Returns the set (i.e., the domain of the result map) of nodes that are keys in m_nodeTestData, and
// currently occur in the AST graph.
@@ -9423,13 +9381,13 @@ public:
if (compRoot->m_fieldSeqStore == nullptr)
{
// Create a CompAllocator that labels sub-structure with CMK_FieldSeqStore, and use that for allocation.
- IAllocator* ialloc = new (this, CMK_FieldSeqStore) CompAllocator(this, CMK_FieldSeqStore);
+ CompAllocator* ialloc = new (this, CMK_FieldSeqStore) CompAllocator(this, CMK_FieldSeqStore);
compRoot->m_fieldSeqStore = new (ialloc) FieldSeqStore(ialloc);
}
return compRoot->m_fieldSeqStore;
}
- typedef SimplerHashTable<GenTreePtr, PtrKeyFuncs<GenTree>, FieldSeqNode*, JitSimplerHashBehavior> NodeToFieldSeqMap;
+ typedef JitHashTable<GenTreePtr, JitPtrKeyFuncs<GenTree>, FieldSeqNode*> NodeToFieldSeqMap;
// Some nodes of "TYP_BYREF" or "TYP_I_IMPL" actually represent the address of a field within a struct, but since
// the offset of the field is zero, there's no "GT_ADD" node. We normally attach a field sequence to the constant
@@ -9444,8 +9402,8 @@ public:
{
// Create a CompAllocator that labels sub-structure with CMK_ZeroOffsetFieldMap, and use that for
// allocation.
- IAllocator* ialloc = new (this, CMK_ZeroOffsetFieldMap) CompAllocator(this, CMK_ZeroOffsetFieldMap);
- m_zeroOffsetFieldMap = new (ialloc) NodeToFieldSeqMap(ialloc);
+ CompAllocator* ialloc = new (this, CMK_ZeroOffsetFieldMap) CompAllocator(this, CMK_ZeroOffsetFieldMap);
+ m_zeroOffsetFieldMap = new (ialloc) NodeToFieldSeqMap(ialloc);
}
return m_zeroOffsetFieldMap;
}
@@ -9462,8 +9420,7 @@ public:
// CoreRT. Such case is handled same as the default case.
void fgAddFieldSeqForZeroOffset(GenTreePtr op1, FieldSeqNode* fieldSeq);
- typedef SimplerHashTable<const GenTree*, PtrKeyFuncs<GenTree>, ArrayInfo, JitSimplerHashBehavior>
- NodeToArrayInfoMap;
+ typedef JitHashTable<const GenTree*, JitPtrKeyFuncs<GenTree>, ArrayInfo> NodeToArrayInfoMap;
NodeToArrayInfoMap* m_arrayInfoMap;
NodeToArrayInfoMap* GetArrayInfoMap()
@@ -9472,7 +9429,7 @@ public:
if (compRoot->m_arrayInfoMap == nullptr)
{
// Create a CompAllocator that labels sub-structure with CMK_ArrayInfoMap, and use that for allocation.
- IAllocator* ialloc = new (this, CMK_ArrayInfoMap) CompAllocator(this, CMK_ArrayInfoMap);
+ CompAllocator* ialloc = new (this, CMK_ArrayInfoMap) CompAllocator(this, CMK_ArrayInfoMap);
compRoot->m_arrayInfoMap = new (ialloc) NodeToArrayInfoMap(ialloc);
}
return compRoot->m_arrayInfoMap;
@@ -9527,7 +9484,7 @@ public:
if (compRoot->m_memorySsaMap[memoryKind] == nullptr)
{
// Create a CompAllocator that labels sub-structure with CMK_ArrayInfoMap, and use that for allocation.
- IAllocator* ialloc = new (this, CMK_ArrayInfoMap) CompAllocator(this, CMK_ArrayInfoMap);
+ CompAllocator* ialloc = new (this, CMK_ArrayInfoMap) CompAllocator(this, CMK_ArrayInfoMap);
compRoot->m_memorySsaMap[memoryKind] = new (ialloc) NodeToUnsignedMap(ialloc);
}
return compRoot->m_memorySsaMap[memoryKind];
diff --git a/src/jit/compiler.hpp b/src/jit/compiler.hpp
index acc7bb688e..c285c6a7b3 100644
--- a/src/jit/compiler.hpp
+++ b/src/jit/compiler.hpp
@@ -4302,16 +4302,6 @@ __forceinline void* Compiler::compGetMemArray(size_t numElem, size_t elemSize, C
return compGetMem(numElem * elemSize, cmk);
}
-__forceinline void* Compiler::compGetMemArrayA(size_t numElem, size_t elemSize, CompMemKind cmk)
-{
- if (numElem > (MAX_MEMORY_PER_ALLOCATION / elemSize))
- {
- NOMEM();
- }
-
- return compGetMemA(numElem * elemSize, cmk);
-}
-
/******************************************************************************
*
* Roundup the allocated size so that if this memory block is aligned,
@@ -4319,31 +4309,10 @@ __forceinline void* Compiler::compGetMemArrayA(size_t numElem, size_t elemSize,
* The JIT will always try to keep all the blocks aligned.
*/
-inline void* Compiler::compGetMemA(size_t sz, CompMemKind cmk)
-{
- assert(sz);
-
- size_t allocSz = roundUp(sz, sizeof(size_t));
-
-#if MEASURE_MEM_ALLOC
- genMemStats.AddAlloc(allocSz, cmk);
-#endif
-
- void* ptr = compAllocator->allocateMemory(allocSz);
-
- // Verify that the current block is aligned. Only then will the next
- // block allocated be on an aligned boundary.
- assert((size_t(ptr) & (sizeof(size_t) - 1)) == 0);
-
- return ptr;
-}
-
inline void Compiler::compFreeMem(void* ptr)
{
}
-#define compFreeMem(ptr) compFreeMem((void*)ptr)
-
inline bool Compiler::compIsProfilerHookNeeded()
{
#ifdef PROFILING_SUPPORTED
@@ -5112,16 +5081,6 @@ inline void* __cdecl operator new(size_t sz, void* p, const jitstd::placement_t&
return p;
}
-inline void* __cdecl operator new(size_t sz, IAllocator* alloc)
-{
- return alloc->Alloc(sz);
-}
-
-inline void* __cdecl operator new[](size_t sz, IAllocator* alloc)
-{
- return alloc->Alloc(sz);
-}
-
/*****************************************************************************/
#ifdef DEBUG
diff --git a/src/jit/compilerbitsettraits.h b/src/jit/compilerbitsettraits.h
index d0436f4052..0fdcb5110f 100644
--- a/src/jit/compilerbitsettraits.h
+++ b/src/jit/compilerbitsettraits.h
@@ -7,7 +7,6 @@
#include "bitset.h"
#include "compiler.h"
-#include "iallocator.h"
#include "bitsetasshortlong.h"
///////////////////////////////////////////////////////////////////////////////
@@ -17,7 +16,7 @@
// The classes in this file define "BitSetTraits" arguments to the "BitSetOps" type, ones that assume that
// Compiler* is the "Env" type.
//
-// This class just captures the compiler's allocator as an IAllocator.
+// This class just wraps the compiler's allocator.
//
class CompAllocBitSetTraits
{
diff --git a/src/jit/compmemkind.h b/src/jit/compmemkind.h
index b22bf6de1e..0a22bdc4b9 100644
--- a/src/jit/compmemkind.h
+++ b/src/jit/compmemkind.h
@@ -34,7 +34,7 @@ CompMemKindMacro(UnwindInfo)
CompMemKindMacro(hashBv)
CompMemKindMacro(bitset)
CompMemKindMacro(FixedBitVect)
-CompMemKindMacro(AsIAllocator)
+CompMemKindMacro(Generic)
CompMemKindMacro(IndirAssignMap)
CompMemKindMacro(FieldSeqStore)
CompMemKindMacro(ZeroOffsetFieldMap)
@@ -51,6 +51,7 @@ CompMemKindMacro(Codegen)
CompMemKindMacro(LoopOpt)
CompMemKindMacro(LoopHoist)
CompMemKindMacro(Unknown)
+CompMemKindMacro(RangeCheck)
//clang-format on
#undef CompMemKindMacro
diff --git a/src/jit/copyprop.cpp b/src/jit/copyprop.cpp
index 75fc5c48ef..c9699f190c 100644
--- a/src/jit/copyprop.cpp
+++ b/src/jit/copyprop.cpp
@@ -303,7 +303,7 @@ void Compiler::optBlockCopyProp(BasicBlock* block, LclNumToGenTreePtrStack* curS
VarSetOps::Assign(this, compCurLife, block->bbLiveIn);
for (GenTreePtr stmt = block->bbTreeList; stmt; stmt = stmt->gtNext)
{
- VarSetOps::OldStyleClearD(this, optCopyPropKillSet);
+ VarSetOps::ClearD(this, optCopyPropKillSet);
// Walk the tree to find if any local variable can be replaced with current live definitions.
for (GenTreePtr tree = stmt->gtStmt.gtStmtList; tree; tree = tree->gtNext)
diff --git a/src/jit/disasm.h b/src/jit/disasm.h
index 972243e4dc..ed6a3a979d 100644
--- a/src/jit/disasm.h
+++ b/src/jit/disasm.h
@@ -58,19 +58,18 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#ifdef _HOST_64BIT_
template <typename T>
-struct SizeTKeyFuncs : LargePrimitiveKeyFuncs<T>
+struct SizeTKeyFuncs : JitLargePrimitiveKeyFuncs<T>
{
};
#else // !_HOST_64BIT_
template <typename T>
-struct SizeTKeyFuncs : SmallPrimitiveKeyFuncs<T>
+struct SizeTKeyFuncs : JitSmallPrimitiveKeyFuncs<T>
{
};
#endif // _HOST_64BIT_
-typedef SimplerHashTable<size_t, SizeTKeyFuncs<size_t>, CORINFO_METHOD_HANDLE, JitSimplerHashBehavior>
- AddrToMethodHandleMap;
-typedef SimplerHashTable<size_t, SizeTKeyFuncs<size_t>, size_t, JitSimplerHashBehavior> AddrToAddrMap;
+typedef JitHashTable<size_t, SizeTKeyFuncs<size_t>, CORINFO_METHOD_HANDLE> AddrToMethodHandleMap;
+typedef JitHashTable<size_t, SizeTKeyFuncs<size_t>, size_t> AddrToAddrMap;
class Compiler;
diff --git a/src/jit/ee_il_dll.cpp b/src/jit/ee_il_dll.cpp
index 4e65d24b30..45df9390df 100644
--- a/src/jit/ee_il_dll.cpp
+++ b/src/jit/ee_il_dll.cpp
@@ -720,7 +720,7 @@ void Compiler::eeGetVars()
{
// Allocate a bit-array for all the variables and initialize to false
- bool* varInfoProvided = (bool*)compGetMemA(info.compLocalsCount * sizeof(varInfoProvided[0]));
+ bool* varInfoProvided = (bool*)compGetMem(info.compLocalsCount * sizeof(varInfoProvided[0]));
unsigned i;
for (i = 0; i < info.compLocalsCount; i++)
{
diff --git a/src/jit/eeinterface.cpp b/src/jit/eeinterface.cpp
index 5783037f22..6581230978 100644
--- a/src/jit/eeinterface.cpp
+++ b/src/jit/eeinterface.cpp
@@ -149,7 +149,7 @@ const char* Compiler::eeGetMethodFullName(CORINFO_METHOD_HANDLE hnd)
length += param.siglength + 2;
- char* retName = (char*)compGetMemA(length, CMK_DebugOnly);
+ char* retName = (char*)compGetMem(length, CMK_DebugOnly);
/* Now generate the full signature string in the allocated buffer */
diff --git a/src/jit/emit.cpp b/src/jit/emit.cpp
index f9f3d855c9..936481a3d4 100644
--- a/src/jit/emit.cpp
+++ b/src/jit/emit.cpp
@@ -1471,8 +1471,8 @@ void emitter::emitBegProlog()
/* Nothing is live on entry to the prolog */
// These were initialized to Empty at the start of compilation.
- VarSetOps::OldStyleClearD(emitComp, emitInitGCrefVars);
- VarSetOps::OldStyleClearD(emitComp, emitPrevGCrefVars);
+ VarSetOps::ClearD(emitComp, emitInitGCrefVars);
+ VarSetOps::ClearD(emitComp, emitPrevGCrefVars);
emitInitGCrefRegs = RBM_NONE;
emitPrevGCrefRegs = RBM_NONE;
emitInitByrefRegs = RBM_NONE;
@@ -4560,7 +4560,7 @@ unsigned emitter::emitEndCodeGen(Compiler* comp,
/* Assume no live GC ref variables on entry */
- VarSetOps::OldStyleClearD(emitComp, emitThisGCrefVars); // This is initialized to Empty at the start of codegen.
+ VarSetOps::ClearD(emitComp, emitThisGCrefVars); // This is initialized to Empty at the start of codegen.
emitThisGCrefRegs = emitThisByrefRegs = RBM_NONE;
emitThisGCrefVset = true;
@@ -5363,6 +5363,69 @@ UNATIVE_OFFSET emitter::emitDataConst(const void* cnsAddr, unsigned cnsSize, boo
return cnum;
}
+#ifndef LEGACY_BACKEND
+
+//------------------------------------------------------------------------
+// emitAnyConst: Create a data section constant of arbitrary size.
+//
+// Arguments:
+// cnsAddr - pointer to the data to be placed in the data section
+// cnsSize - size of the data
+// dblAlign - whether to align the data section to an 8 byte boundary
+//
+// Return Value:
+// A field handle representing the data offset to access the constant.
+//
+CORINFO_FIELD_HANDLE emitter::emitAnyConst(const void* cnsAddr, unsigned cnsSize, bool dblAlign)
+{
+ UNATIVE_OFFSET cnum = emitDataConst(cnsAddr, cnsSize, dblAlign);
+ return emitComp->eeFindJitDataOffs(cnum);
+}
+
+//------------------------------------------------------------------------
+// emitFltOrDblConst: Create a float or double data section constant.
+//
+// Arguments:
+// constValue - constant value
+// attr - constant size
+//
+// Return Value:
+// A field handle representing the data offset to access the constant.
+//
+// Notes:
+// If attr is EA_4BYTE then the double value is converted to a float value.
+// If attr is EA_8BYTE then 8 byte alignment is automatically requested.
+//
+CORINFO_FIELD_HANDLE emitter::emitFltOrDblConst(double constValue, emitAttr attr)
+{
+ assert((attr == EA_4BYTE) || (attr == EA_8BYTE));
+
+ void* cnsAddr;
+ float f;
+ bool dblAlign;
+
+ if (attr == EA_4BYTE)
+ {
+ f = forceCastToFloat(constValue);
+ cnsAddr = &f;
+ dblAlign = false;
+ }
+ else
+ {
+ cnsAddr = &constValue;
+ dblAlign = true;
+ }
+
+ // Access to inline data is 'abstracted' by a special type of static member
+ // (produced by eeFindJitDataOffs) which the emitter recognizes as being a reference
+ // to constant data, not a real static field.
+
+ UNATIVE_OFFSET cnsSize = (attr == EA_4BYTE) ? 4 : 8;
+ UNATIVE_OFFSET cnum = emitDataConst(cnsAddr, cnsSize, dblAlign);
+ return emitComp->eeFindJitDataOffs(cnum);
+}
+#endif
+
/*****************************************************************************
*
* Output the given data section at the specified address.
diff --git a/src/jit/emit.h b/src/jit/emit.h
index 163c4caa36..f1c3ba5878 100644
--- a/src/jit/emit.h
+++ b/src/jit/emit.h
@@ -1710,8 +1710,8 @@ private:
UNATIVE_OFFSET emitInstCodeSz(instrDesc* id);
#ifndef LEGACY_BACKEND
- CORINFO_FIELD_HANDLE emitLiteralConst(ssize_t cnsValIn, emitAttr attr = EA_8BYTE);
- CORINFO_FIELD_HANDLE emitFltOrDblConst(GenTreeDblCon* tree, emitAttr attr = EA_UNKNOWN);
+ CORINFO_FIELD_HANDLE emitAnyConst(const void* cnsAddr, unsigned cnsSize, bool dblAlign);
+ CORINFO_FIELD_HANDLE emitFltOrDblConst(double constValue, emitAttr attr);
regNumber emitInsBinary(instruction ins, emitAttr attr, GenTree* dst, GenTree* src);
regNumber emitInsTernary(instruction ins, emitAttr attr, GenTree* dst, GenTree* src1, GenTree* src2);
void emitInsLoadInd(instruction ins, emitAttr attr, regNumber dstReg, GenTreeIndir* mem);
diff --git a/src/jit/emitarm64.cpp b/src/jit/emitarm64.cpp
index 56df0424df..9b45d3d589 100644
--- a/src/jit/emitarm64.cpp
+++ b/src/jit/emitarm64.cpp
@@ -3985,8 +3985,16 @@ void emitter::emitIns_R_R(
assert(isValidVectorDatasize(size));
assert(isValidArrangement(size, opt));
elemsize = optGetElemsize(opt);
- assert(size != EA_16BYTE); // Narrowing must start with wide format
- assert(elemsize != EA_1BYTE); // Narrowing must start with more than one byte src
+ // size is determined by instruction
+ if (ins == INS_xtn)
+ {
+ assert(size == EA_8BYTE);
+ }
+ else // ins == INS_xtn2
+ {
+ assert(size == EA_16BYTE);
+ }
+ assert(elemsize != EA_8BYTE); // Narrowing must not end with 8 byte data
fmt = IF_DV_2M;
break;
@@ -4132,23 +4140,13 @@ void emitter::emitIns_R_R(
case INS_fcvtl:
case INS_fcvtl2:
- assert(isVectorRegister(reg1));
- assert(isVectorRegister(reg2));
- assert(isValidVectorDatasize(size));
- assert(isValidArrangement(size, opt));
- elemsize = optGetElemsize(opt);
- assert(elemsize == EA_4BYTE); // Widening from Float to Double, opt should correspond to src layout
- fmt = IF_DV_2G;
- break;
-
case INS_fcvtn:
case INS_fcvtn2:
assert(isVectorRegister(reg1));
assert(isVectorRegister(reg2));
assert(isValidVectorDatasize(size));
- assert(isValidArrangement(size, opt));
- elemsize = optGetElemsize(opt);
- assert(elemsize == EA_8BYTE); // Narrowing from Double to Float, opt should correspond to src layout
+ assert(insOptsNone(opt));
+ assert(size == EA_8BYTE); // Narrowing from Double or Widening to Double (Half not supported)
fmt = IF_DV_2G;
break;
@@ -6278,7 +6276,7 @@ void emitter::emitIns_R_S(instruction ins, emitAttr attr, regNumber reg1, int va
else
{
regNumber rsvdReg = codeGen->rsGetRsvdReg();
- codeGen->instGen_Set_Reg_To_Imm(size, rsvdReg, imm);
+ codeGen->instGen_Set_Reg_To_Imm(EA_PTRSIZE, rsvdReg, imm);
fmt = IF_DR_3A; // add reg1,reg2,rsvdReg
}
}
@@ -6320,7 +6318,7 @@ void emitter::emitIns_R_S(instruction ins, emitAttr attr, regNumber reg1, int va
if (useRegForImm)
{
regNumber rsvdReg = codeGen->rsGetRsvdReg();
- codeGen->instGen_Set_Reg_To_Imm(size, rsvdReg, imm);
+ codeGen->instGen_Set_Reg_To_Imm(EA_PTRSIZE, rsvdReg, imm);
fmt = IF_LS_3A;
}
}
@@ -6360,7 +6358,6 @@ void emitter::emitIns_R_R_S_S(
assert(isGeneralRegisterOrZR(reg2));
assert(offs >= 0);
- emitAttr size = EA_SIZE(attr1);
insFormat fmt = IF_LS_3B;
int disp = 0;
const unsigned scale = 3;
@@ -6401,7 +6398,7 @@ void emitter::emitIns_R_R_S_S(
if (useRegForAdr)
{
regNumber rsvd = codeGen->rsGetRsvdReg();
- emitIns_R_R_Imm(INS_add, EA_8BYTE, rsvd, reg3, imm);
+ emitIns_R_R_Imm(INS_add, EA_PTRSIZE, rsvd, reg3, imm);
reg3 = rsvd;
imm = 0;
}
@@ -6547,7 +6544,7 @@ void emitter::emitIns_S_R(instruction ins, emitAttr attr, regNumber reg1, int va
// The reserved register is not stored in idReg3() since that field overlaps with iiaLclVar.
// It is instead implicit when idSetIsLclVar() is set, with this encoding format.
regNumber rsvdReg = codeGen->rsGetRsvdReg();
- codeGen->instGen_Set_Reg_To_Imm(size, rsvdReg, imm);
+ codeGen->instGen_Set_Reg_To_Imm(EA_PTRSIZE, rsvdReg, imm);
fmt = IF_LS_3A;
}
@@ -6586,7 +6583,6 @@ void emitter::emitIns_S_S_R_R(
assert(isGeneralRegisterOrZR(reg2));
assert(offs >= 0);
- emitAttr size = EA_SIZE(attr1);
insFormat fmt = IF_LS_3B;
int disp = 0;
const unsigned scale = 3;
@@ -6627,7 +6623,7 @@ void emitter::emitIns_S_S_R_R(
if (useRegForAdr)
{
regNumber rsvd = codeGen->rsGetRsvdReg();
- emitIns_R_R_Imm(INS_add, EA_8BYTE, rsvd, reg3, imm);
+ emitIns_R_R_Imm(INS_add, EA_PTRSIZE, rsvd, reg3, imm);
reg3 = rsvd;
imm = 0;
}
@@ -11508,75 +11504,6 @@ void emitter::emitInsLoadStoreOp(instruction ins, emitAttr attr, regNumber dataR
}
}
-// Generates an integer data section constant and returns a field handle representing
-// the data offset to access the constant via a load instruction.
-// This is called during ngen for any relocatable constants
-//
-CORINFO_FIELD_HANDLE emitter::emitLiteralConst(ssize_t cnsValIn, emitAttr attr /*=EA_8BYTE*/)
-{
- ssize_t constValue = cnsValIn;
- void* cnsAddr = &constValue;
- bool dblAlign;
-
- if (attr == EA_4BYTE)
- {
- dblAlign = false;
- }
- else
- {
- assert(attr == EA_8BYTE);
- dblAlign = true;
- }
-
- // Access to inline data is 'abstracted' by a special type of static member
- // (produced by eeFindJitDataOffs) which the emitter recognizes as being a reference
- // to constant data, not a real static field.
-
- UNATIVE_OFFSET cnsSize = (attr == EA_4BYTE) ? 4 : 8;
- UNATIVE_OFFSET cnum = emitDataConst(cnsAddr, cnsSize, dblAlign);
- return emitComp->eeFindJitDataOffs(cnum);
-}
-
-// Generates a float or double data section constant and returns field handle representing
-// the data offset to access the constant. This is called by emitInsBinary() in case
-// of contained float of double constants.
-CORINFO_FIELD_HANDLE emitter::emitFltOrDblConst(GenTreeDblCon* tree, emitAttr attr /*=EA_UNKNOWN*/)
-{
- if (attr == EA_UNKNOWN)
- {
- attr = emitTypeSize(tree->TypeGet());
- }
- else
- {
- assert(emitTypeSize(tree->TypeGet()) == attr);
- }
-
- double constValue = tree->gtDblCon.gtDconVal;
- void* cnsAddr;
- float f;
- bool dblAlign;
-
- if (attr == EA_4BYTE)
- {
- f = forceCastToFloat(constValue);
- cnsAddr = &f;
- dblAlign = false;
- }
- else
- {
- cnsAddr = &constValue;
- dblAlign = true;
- }
-
- // Access to inline data is 'abstracted' by a special type of static member
- // (produced by eeFindJitDataOffs) which the emitter recognizes as being a reference
- // to constant data, not a real static field.
-
- UNATIVE_OFFSET cnsSize = (attr == EA_4BYTE) ? 4 : 8;
- UNATIVE_OFFSET cnum = emitDataConst(cnsAddr, cnsSize, dblAlign);
- return emitComp->eeFindJitDataOffs(cnum);
-}
-
// The callee must call genConsumeReg() for any non-contained srcs
// and genProduceReg() for any non-contained dsts.
diff --git a/src/jit/emitxarch.cpp b/src/jit/emitxarch.cpp
index fef5790d97..aab9bd0d13 100644
--- a/src/jit/emitxarch.cpp
+++ b/src/jit/emitxarch.cpp
@@ -2805,52 +2805,6 @@ void emitter::emitInsStoreLcl(instruction ins, emitAttr attr, GenTreeLclVarCommo
codeGen->genUpdateLife(varNode);
}
-CORINFO_FIELD_HANDLE emitter::emitLiteralConst(ssize_t cnsValIn, emitAttr attr /*= EA_8BYTE*/)
-{
- NYI("emitLiteralConst");
- return nullptr;
-}
-
-// Generates a float or double data section constant and returns field handle representing
-// the data offset to access the constant. This is called by emitInsBinary() in case
-// of contained float of double constants.
-CORINFO_FIELD_HANDLE emitter::emitFltOrDblConst(GenTreeDblCon* tree, emitAttr attr /*=EA_UNKNOWN*/)
-{
- if (attr == EA_UNKNOWN)
- {
- attr = emitTypeSize(tree->TypeGet());
- }
- else
- {
- assert(emitTypeSize(tree->TypeGet()) == attr);
- }
-
- double constValue = tree->gtDblCon.gtDconVal;
- void* cnsAddr;
- float f;
- bool dblAlign;
-
- if (attr == EA_4BYTE)
- {
- f = forceCastToFloat(constValue);
- cnsAddr = &f;
- dblAlign = false;
- }
- else
- {
- cnsAddr = &constValue;
- dblAlign = true;
- }
-
- // Access to inline data is 'abstracted' by a special type of static member
- // (produced by eeFindJitDataOffs) which the emitter recognizes as being a reference
- // to constant data, not a real static field.
-
- UNATIVE_OFFSET cnsSize = (attr == EA_4BYTE) ? 4 : 8;
- UNATIVE_OFFSET cnum = emitDataConst(cnsAddr, cnsSize, dblAlign);
- return emitComp->eeFindJitDataOffs(cnum);
-}
-
// The callee must call genConsumeReg() for all sources, including address registers
// of both source and destination, and genProduceReg() for the destination register, if any.
@@ -2958,7 +2912,7 @@ regNumber emitter::emitInsBinary(instruction ins, emitAttr attr, GenTree* dst, G
else if (dblConst != nullptr)
{
// Emit a data section constant for float or double constant.
- CORINFO_FIELD_HANDLE hnd = emitFltOrDblConst(dblConst);
+ CORINFO_FIELD_HANDLE hnd = emitFltOrDblConst(dblConst->AsDblCon()->gtDconVal, emitTypeSize(dblConst));
emitIns_R_C(ins, attr, dst->gtRegNum, hnd, 0);
}
diff --git a/src/jit/flowgraph.cpp b/src/jit/flowgraph.cpp
index 15f0d5d53c..60d4d06354 100644
--- a/src/jit/flowgraph.cpp
+++ b/src/jit/flowgraph.cpp
@@ -3342,10 +3342,10 @@ Compiler::SwitchUniqueSuccSet Compiler::GetDescriptorForSwitch(BasicBlock* switc
}
}
-void Compiler::SwitchUniqueSuccSet::UpdateTarget(IAllocator* alloc,
- BasicBlock* switchBlk,
- BasicBlock* from,
- BasicBlock* to)
+void Compiler::SwitchUniqueSuccSet::UpdateTarget(CompAllocator* alloc,
+ BasicBlock* switchBlk,
+ BasicBlock* from,
+ BasicBlock* to)
{
assert(switchBlk->bbJumpKind == BBJ_SWITCH); // Precondition.
unsigned jmpTabCnt = switchBlk->bbJumpSwt->bbsCount;
@@ -10422,7 +10422,7 @@ void Compiler::fgCompactBlocks(BasicBlock* block, BasicBlock* bNext)
if (fgDomsComputed && block->bbNum > fgDomBBcount)
{
BlockSetOps::Assign(this, block->bbReach, bNext->bbReach);
- BlockSetOps::OldStyleClearD(this, bNext->bbReach);
+ BlockSetOps::ClearD(this, bNext->bbReach);
block->bbIDom = bNext->bbIDom;
bNext->bbIDom = nullptr;
@@ -14916,7 +14916,15 @@ bool Compiler::fgOptimizeBranch(BasicBlock* bJump)
#if DEBUG
if (verbose)
{
- printf("\nAfter this change in fgOptimizeBranch");
+ // Dump out the newStmtList that we created
+ printf("\nfgOptimizeBranch added these statements(s) at the end of BB%02u:\n", bJump->bbNum);
+ for (stmt = newStmtList->AsStmt(); stmt; stmt = stmt->gtNextStmt)
+ {
+ gtDispTree(stmt);
+ }
+ printf("\nfgOptimizeBranch changed block BB%02u from BBJ_ALWAYS to BBJ_COND.\n", bJump->bbNum);
+
+ printf("\nAfter this change in fgOptimizeBranch the BB graph is:");
fgDispBasicBlocks(verboseTrees);
printf("\n");
}
@@ -16107,7 +16115,7 @@ void Compiler::fgReorderBlocks()
#if DEBUG
if (verbose)
{
- printf("\nAfter this change in fgReorderBlocks");
+ printf("\nAfter this change in fgReorderBlocks the BB graph is:");
fgDispBasicBlocks(verboseTrees);
printf("\n");
}
@@ -19367,7 +19375,7 @@ const char* Compiler::fgProcessEscapes(const char* nameIn, escapeMapping_t* map)
if (subsitutionRequired)
{
- char* newName = (char*)compGetMemA(lengthOut, CMK_DebugOnly);
+ char* newName = (char*)compGetMem(lengthOut, CMK_DebugOnly);
char* pDest;
pDest = newName;
pChar = nameIn;
diff --git a/src/jit/gcencode.cpp b/src/jit/gcencode.cpp
index a48f7451fb..bdea7f173b 100644
--- a/src/jit/gcencode.cpp
+++ b/src/jit/gcencode.cpp
@@ -1910,7 +1910,7 @@ PendingArgsStack::PendingArgsStack(unsigned maxDepth, Compiler* pComp)
/* Do we need an array as well as the mask ? */
if (pasMaxDepth > BITS_IN_pasMask)
- pasTopArray = (BYTE*)pComp->compGetMemA(pasMaxDepth - BITS_IN_pasMask);
+ pasTopArray = (BYTE*)pComp->compGetMem(pasMaxDepth - BITS_IN_pasMask);
}
//-----------------------------------------------------------------------------
@@ -3744,11 +3744,10 @@ void GCInfo::gcFindPtrsInFrame(const void* infoBlock, const void* codeBlock, uns
#else // !JIT32_GCENCODER
#include "gcinfoencoder.h"
-#include "simplerhash.h"
// Do explicit instantiation.
-template class SimplerHashTable<RegSlotIdKey, RegSlotIdKey, GcSlotId, JitSimplerHashBehavior>;
-template class SimplerHashTable<StackSlotIdKey, StackSlotIdKey, GcSlotId, JitSimplerHashBehavior>;
+template class JitHashTable<RegSlotIdKey, RegSlotIdKey, GcSlotId>;
+template class JitHashTable<StackSlotIdKey, StackSlotIdKey, GcSlotId>;
#ifdef DEBUG
diff --git a/src/jit/gentree.cpp b/src/jit/gentree.cpp
index 84743cf619..0423df0051 100644
--- a/src/jit/gentree.cpp
+++ b/src/jit/gentree.cpp
@@ -17563,7 +17563,7 @@ void GenTree::LabelIndex(Compiler* comp, bool isConst)
FieldSeqNode FieldSeqStore::s_notAField(nullptr, nullptr);
// FieldSeqStore methods.
-FieldSeqStore::FieldSeqStore(IAllocator* alloc) : m_alloc(alloc), m_canonMap(new (alloc) FieldSeqNodeCanonMap(alloc))
+FieldSeqStore::FieldSeqStore(CompAllocator* alloc) : m_alloc(alloc), m_canonMap(new (alloc) FieldSeqNodeCanonMap(alloc))
{
}
diff --git a/src/jit/gentree.h b/src/jit/gentree.h
index 830da20554..09ce220871 100644
--- a/src/jit/gentree.h
+++ b/src/jit/gentree.h
@@ -24,7 +24,7 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#include "ssaconfig.h" // For "SsaConfig::RESERVED_SSA_NUM"
#include "reglist.h"
#include "valuenumtype.h"
-#include "simplerhash.h"
+#include "jithashtable.h"
#include "nodeinfo.h"
#include "simd.h"
#include "namedintrinsiclist.h"
@@ -259,10 +259,9 @@ struct FieldSeqNode
// This class canonicalizes field sequences.
class FieldSeqStore
{
- typedef SimplerHashTable<FieldSeqNode, /*KeyFuncs*/ FieldSeqNode, FieldSeqNode*, JitSimplerHashBehavior>
- FieldSeqNodeCanonMap;
+ typedef JitHashTable<FieldSeqNode, /*KeyFuncs*/ FieldSeqNode, FieldSeqNode*> FieldSeqNodeCanonMap;
- IAllocator* m_alloc;
+ CompAllocator* m_alloc;
FieldSeqNodeCanonMap* m_canonMap;
static FieldSeqNode s_notAField; // No value, just exists to provide an address.
@@ -272,7 +271,7 @@ class FieldSeqStore
static int ConstantIndexPseudoFieldStruct;
public:
- FieldSeqStore(IAllocator* alloc);
+ FieldSeqStore(CompAllocator* alloc);
// Returns the (canonical in the store) singleton field sequence for the given handle.
FieldSeqNode* CreateSingleton(CORINFO_FIELD_HANDLE fieldHnd);
@@ -932,7 +931,14 @@ public:
#define GTF_CALL_POP_ARGS 0x04000000 // GT_CALL -- caller pop arguments?
#define GTF_CALL_HOISTABLE 0x02000000 // GT_CALL -- call is hoistable
#ifdef LEGACY_BACKEND
+#ifdef _TARGET_ARM_
+// The GTF_CALL_REG_SAVE flag indicates that the call preserves all integer registers. This is used for
+// the PollGC helper. However, since the PollGC helper on ARM follows the standard calling convention,
+// for that target we don't use this flag.
+#define GTF_CALL_REG_SAVE 0x00000000
+#else
#define GTF_CALL_REG_SAVE 0x01000000 // GT_CALL -- This call preserves all integer regs
+#endif // _TARGET_ARM_
#endif // LEGACY_BACKEND
// For additional flags for GT_CALL node see GTF_CALL_M_*
diff --git a/src/jit/hostallocator.h b/src/jit/hostallocator.h
index c48ed45b8c..39a32ef49b 100644
--- a/src/jit/hostallocator.h
+++ b/src/jit/hostallocator.h
@@ -2,7 +2,9 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
-class HostAllocator : public IAllocator
+#pragma once
+
+class HostAllocator final
{
private:
static HostAllocator s_hostAllocator;
@@ -12,11 +14,23 @@ private:
}
public:
- void* Alloc(size_t size) override;
+ void* Alloc(size_t size);
- void* ArrayAlloc(size_t elemSize, size_t numElems) override;
+ void* ArrayAlloc(size_t elemSize, size_t numElems);
- void Free(void* p) override;
+ void Free(void* p);
static HostAllocator* getHostAllocator();
};
+
+// Global operator new overloads that work with HostAllocator
+
+inline void* __cdecl operator new(size_t n, HostAllocator* alloc)
+{
+ return alloc->Alloc(n);
+}
+
+inline void* __cdecl operator new[](size_t n, HostAllocator* alloc)
+{
+ return alloc->Alloc(n);
+}
diff --git a/src/jit/importer.cpp b/src/jit/importer.cpp
index b5df87b0ec..e1c96cd5be 100644
--- a/src/jit/importer.cpp
+++ b/src/jit/importer.cpp
@@ -17169,7 +17169,7 @@ void Compiler::verInitBBEntryState(BasicBlock* block, EntryState* srcState)
return;
}
- block->bbEntryState = (EntryState*)compGetMemA(sizeof(EntryState));
+ block->bbEntryState = (EntryState*)compGetMem(sizeof(EntryState));
// block->bbEntryState.esRefcount = 1;
diff --git a/src/jit/instr.cpp b/src/jit/instr.cpp
index f83bd45719..2ed581c38f 100644
--- a/src/jit/instr.cpp
+++ b/src/jit/instr.cpp
@@ -3122,9 +3122,11 @@ instruction CodeGen::ins_Move_Extend(var_types srcType, bool srcInReg)
// TODO-CQ: based on whether src type is aligned use movaps instead
return (srcInReg) ? INS_movaps : INS_movups;
-#else // !defined(_TARGET_XARCH_) || defined(LEGACY_BACKEND)
+#elif defined(_TARGET_ARM64_)
+ return (srcInReg) ? INS_mov : ins_Load(srcType);
+#else // !defined(_TARGET_ARM64_) && !(defined(_TARGET_XARCH_) && !defined(LEGACY_BACKEND))
assert(!"unhandled SIMD type");
-#endif // !defined(_TARGET_XARCH_) || defined(LEGACY_BACKEND)
+#endif // !defined(_TARGET_ARM64_) && !(defined(_TARGET_XARCH_) && !defined(LEGACY_BACKEND))
}
#if defined(_TARGET_XARCH_) && !defined(LEGACY_BACKEND)
diff --git a/src/jit/jit.h b/src/jit/jit.h
index 140d26395b..00f5cb2fee 100644
--- a/src/jit/jit.h
+++ b/src/jit/jit.h
@@ -698,7 +698,7 @@ inline size_t unsigned_abs(ssize_t x)
class Histogram
{
public:
- Histogram(IAllocator* allocator, const unsigned* const sizeTable);
+ Histogram(HostAllocator* allocator, const unsigned* const sizeTable);
~Histogram();
void dump(FILE* output);
@@ -707,7 +707,7 @@ public:
private:
void ensureAllocated();
- IAllocator* m_allocator;
+ HostAllocator* m_allocator;
unsigned m_sizeCount;
const unsigned* const m_sizeTable;
unsigned* m_counts;
@@ -822,6 +822,10 @@ const int MIN_SHORT_AS_INT = -32768;
/*****************************************************************************/
+// CompMemKind values are used to tag memory allocations performed via
+// the compiler's allocator so that the memory usage of various compiler
+// components can be tracked separately (when MEASURE_MEM_ALLOC is defined).
+
enum CompMemKind
{
#define CompMemKindMacro(kind) CMK_##kind,
@@ -830,6 +834,98 @@ enum CompMemKind
};
class Compiler;
+
+// Allows general purpose code (e.g. collection classes) to allocate memory
+// of a pre-determined kind via the compiler's allocator.
+
+class CompAllocator
+{
+ Compiler* const m_comp;
+#if MEASURE_MEM_ALLOC
+ CompMemKind const m_cmk;
+#endif
+public:
+ CompAllocator(Compiler* comp, CompMemKind cmk)
+ : m_comp(comp)
+#if MEASURE_MEM_ALLOC
+ , m_cmk(cmk)
+#endif
+ {
+ }
+
+ // Allocates a block of memory at least `sz` in size.
+ // Zero-length allocation are not allowed.
+ inline void* Alloc(size_t sz);
+
+ // Allocates a block of memory at least `elems * elemSize` in size.
+ // Zero-length allocation are not allowed.
+ inline void* ArrayAlloc(size_t elems, size_t elemSize);
+
+ // For the compiler's ArenaAllocator, free operations are no-ops.
+ void Free(void* p)
+ {
+ }
+};
+
+// Global operator new overloads that work with CompAllocator
+
+inline void* __cdecl operator new(size_t n, CompAllocator* alloc)
+{
+ return alloc->Alloc(n);
+}
+
+inline void* __cdecl operator new[](size_t n, CompAllocator* alloc)
+{
+ return alloc->Alloc(n);
+}
+
+// A CompAllocator wrapper that implements IAllocator and allows zero-length
+// memory allocations (the compiler's ArenAllocator does not support zero-length
+// allocation).
+
+class CompIAllocator : public IAllocator
+{
+ CompAllocator* const m_alloc;
+ char m_zeroLenAllocTarg;
+
+public:
+ CompIAllocator(CompAllocator* alloc) : m_alloc(alloc)
+ {
+ }
+
+ // Allocates a block of memory at least `sz` in size.
+ virtual void* Alloc(size_t sz) override
+ {
+ if (sz == 0)
+ {
+ return &m_zeroLenAllocTarg;
+ }
+ else
+ {
+ return m_alloc->Alloc(sz);
+ }
+ }
+
+ // Allocates a block of memory at least `elems * elemSize` in size.
+ virtual void* ArrayAlloc(size_t elemSize, size_t numElems) override
+ {
+ if ((elemSize == 0) || (numElems == 0))
+ {
+ return &m_zeroLenAllocTarg;
+ }
+ else
+ {
+ return m_alloc->ArrayAlloc(elemSize, numElems);
+ }
+ }
+
+ // Frees the block of memory pointed to by p.
+ virtual void Free(void* p) override
+ {
+ m_alloc->Free(p);
+ }
+};
+
class JitTls
{
#ifdef DEBUG
diff --git a/src/jit/jitexpandarray.h b/src/jit/jitexpandarray.h
new file mode 100644
index 0000000000..03d81f50f3
--- /dev/null
+++ b/src/jit/jitexpandarray.h
@@ -0,0 +1,409 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+#pragma once
+
+// An array of T that expands automatically (and never shrinks) to accomodate
+// any index access. Elements added as a result of automatic expansion are
+// value-initialized (that is, they are assigned T()).
+template <class T>
+class JitExpandArray
+{
+protected:
+ CompAllocator* m_alloc; // The allocator object that should be used to allocate members.
+ T* m_members; // Pointer to the element array.
+ unsigned m_size; // The size of the element array.
+ unsigned m_minSize; // The minimum size of the element array.
+
+ // Ensure that the element array is large enough for the specified index to be valid.
+ void EnsureCoversInd(unsigned idx);
+
+ //------------------------------------------------------------------------
+ // InitializeRange: Value-initialize the specified range of elements.
+ //
+ // Arguments:
+ // low - inclusive lower bound of the range to initialize
+ // high - exclusive upper bound of the range to initialize
+ //
+ // Assumptions:
+ // Assumes that the element array has aready been allocated
+ // and that low and high are valid indices. The array is not
+ // expanded to accomodate invalid indices.
+ //
+ void InitializeRange(unsigned low, unsigned high)
+ {
+ assert(m_members != nullptr);
+ assert((low <= high) && (high <= m_size));
+ for (unsigned i = low; i < high; i++)
+ {
+ m_members[i] = T();
+ }
+ }
+
+public:
+ //------------------------------------------------------------------------
+ // JitExpandArray: Construct an empty JitExpandArray object.
+ //
+ // Arguments:
+ // alloc - the allocator used to allocate the element array
+ // minSize - the initial size of the element array
+ //
+ // Notes:
+ // Initially no memory is allocated for the element array. The first
+ // time an array element (having index `idx`) is accessed, an array
+ // of size max(`minSize`, `idx`) is allocated.
+ //
+ JitExpandArray(CompAllocator* alloc, unsigned minSize = 1)
+ : m_alloc(alloc), m_members(nullptr), m_size(0), m_minSize(minSize)
+ {
+ assert(minSize > 0);
+ }
+
+ //------------------------------------------------------------------------
+ // ~JitExpandArray: Destruct the JitExpandArray object.
+ //
+ // Notes:
+ // Frees the element array. Destructors of elements stored in the
+ // array are NOT invoked.
+ //
+ ~JitExpandArray()
+ {
+ if (m_members != nullptr)
+ {
+ m_alloc->Free(m_members);
+ }
+ }
+
+ //------------------------------------------------------------------------
+ // Init: Re-initialize the array to the empty state.
+ //
+ // Arguments:
+ // alloc - the allocator used to allocate the element array
+ // minSize - the initial size of the element array
+ //
+ // Notes:
+ // This is equivalent to calling the destructor and then constructing
+ // the array again.
+ //
+ void Init(CompAllocator* alloc, unsigned minSize = 1)
+ {
+ if (m_members != nullptr)
+ {
+ m_alloc->Free(m_members);
+ }
+ m_alloc = alloc;
+ m_members = nullptr;
+ m_size = 0;
+ m_minSize = minSize;
+ }
+
+ //------------------------------------------------------------------------
+ // Reset: Change the minimum size and value-initialize all the elements.
+ //
+ // Arguments:
+ // minSize - the initial size of the element array
+ //
+ // Notes:
+ // Ensures that an element array of at least `minSize` elements
+ // has been allocated.
+ //
+ void Reset(unsigned minSize)
+ {
+ m_minSize = minSize;
+ Reset();
+ }
+
+ //------------------------------------------------------------------------
+ // Reset: Value-initialize all the array elements.
+ //
+ // Notes:
+ // Ensures that an element array of at least `m_minSize` elements
+ // has been allocated.
+ //
+ void Reset()
+ {
+ if (m_minSize > m_size)
+ {
+ EnsureCoversInd(m_minSize - 1);
+ }
+ InitializeRange(0, m_size);
+ }
+
+ //------------------------------------------------------------------------
+ // Get: Get a copy of the element at index `idx`.
+ //
+ // Arguments:
+ // idx - the element index
+ //
+ // Return Value:
+ // A copy of the element at index `idx`.
+ //
+ // Notes:
+ // Expands the element array, if necessary, to contain `idx`.
+ // The result will be a value-initialized T if a value wasn't
+ // previously assigned to the specififed index.
+ //
+ T Get(unsigned idx)
+ {
+ EnsureCoversInd(idx);
+ return m_members[idx];
+ }
+
+ //------------------------------------------------------------------------
+ // GetRef: Get a reference to the element at index `idx`.
+ //
+ // Arguments:
+ // idx - the element index
+ //
+ // Return Value:
+ // A reference to the element at index `idx`.
+ //
+ // Notes:
+ // Like `Get`, but returns a reference, so suitable for use as
+ // the LHS of an assignment.
+ //
+ T& GetRef(unsigned idx)
+ {
+ EnsureCoversInd(idx);
+ return m_members[idx];
+ }
+
+ //------------------------------------------------------------------------
+ // Set: Assign a copy of `val` to the element at index `idx`.
+ //
+ // Arguments:
+ // idx - the element index
+ // val - the value to assign
+ //
+ // Notes:
+ // Expands the element array, if necessary, to contain `idx`.
+ //
+ void Set(unsigned idx, T val)
+ {
+ EnsureCoversInd(idx);
+ m_members[idx] = val;
+ }
+
+ //------------------------------------------------------------------------
+ // operator[]: Get a reference to the element at index `idx`.
+ //
+ // Arguments:
+ // idx - the element index
+ //
+ // Return Value:
+ // A reference to the element at index `idx`.
+ //
+ // Notes:
+ // Same as `GetRef`.
+ //
+ T& operator[](unsigned idx)
+ {
+ EnsureCoversInd(idx);
+ return m_members[idx];
+ }
+};
+
+template <class T>
+class JitExpandArrayStack : public JitExpandArray<T>
+{
+ unsigned m_used; // The stack depth
+
+public:
+ //------------------------------------------------------------------------
+ // JitExpandArrayStack: Construct an empty JitExpandArrayStack object.
+ //
+ // Arguments:
+ // alloc - the allocator used to allocate the element array
+ // minSize - the initial size of the element array
+ //
+ // Notes:
+ // See JitExpandArray constructor notes.
+ //
+ JitExpandArrayStack(CompAllocator* alloc, unsigned minSize = 1) : JitExpandArray<T>(alloc, minSize), m_used(0)
+ {
+ }
+
+ //------------------------------------------------------------------------
+ // Set: Assign value a copy of `val` to the element at index `idx`.
+ //
+ // Arguments:
+ // idx - the index of element
+ // val - the value to assign
+ //
+ // Notes:
+ // Expands the element array, if necessary, to contain `idx`.
+ // If `idx` is larger than the current stack depth then this
+ // is the equivalent of series of Push(T()) followed by a Push(val).
+ //
+ void Set(unsigned idx, T val)
+ {
+ JitExpandArray<T>::Set(idx, val);
+ m_used = max((idx + 1), m_used);
+ }
+
+ //------------------------------------------------------------------------
+ // Reset: Remove all the elements from the stack.
+ //
+ void Reset()
+ {
+ JitExpandArray<T>::Reset();
+ m_used = 0;
+ }
+
+ //------------------------------------------------------------------------
+ // Push: Push a copy of the specified value onto the stack.
+ //
+ // Arguments:
+ // val - the value
+ //
+ // Return Value:
+ // The index of the pushed value.
+ //
+ unsigned Push(T val)
+ {
+ unsigned res = m_used;
+ JitExpandArray<T>::Set(m_used, val);
+ m_used++;
+ return res;
+ }
+
+ //------------------------------------------------------------------------
+ // Pop: Remove the top element of the stack.
+ //
+ // Return Value:
+ // A copy of the removed element.
+ //
+ // Assumptions:
+ // The stack must not be empty.
+ //
+ T Pop()
+ {
+ assert(Size() > 0);
+ m_used--;
+ return this->m_members[m_used];
+ }
+
+ //------------------------------------------------------------------------
+ // Top: Get a copy of the top element.
+ //
+ // Return Value:
+ // A copy of the top element.
+ //
+ // Assumptions:
+ // The stack must not be empty.
+ //
+ T Top()
+ {
+ assert(Size() > 0);
+ return this->m_members[m_used - 1];
+ }
+
+ //------------------------------------------------------------------------
+ // TopRef: Get a reference to the top element.
+ //
+ // Return Value:
+ // A reference to the top element.
+ //
+ // Assumptions:
+ // The stack must not be empty.
+ //
+ T& TopRef()
+ {
+ assert(Size() > 0);
+ return this->m_members[m_used - 1];
+ }
+
+ //------------------------------------------------------------------------
+ // GetNoExpand: Get a copy of the element at index `idx`.
+ //
+ // Arguments:
+ // idx - the element index
+ //
+ // Return Value:
+ // A copy of the element at index `idx`.
+ //
+ // Notes:
+ // Unlike `Get` this does not expand the array if the index is not valid.
+ //
+ // Assumptions:
+ // The element index does not exceed the current stack depth.
+ //
+ T GetNoExpand(unsigned idx)
+ {
+ assert(idx < m_used);
+ return this->m_members[idx];
+ }
+
+ //------------------------------------------------------------------------
+ // Remove: Remove the element at index `idx`.
+ //
+ // Arguments:
+ // idx - the element index
+ //
+ // Notes:
+ // Shifts contents of the array beyond `idx`, if any, to occupy the free
+ // slot created at `idx`. O(n) worst case operation, no memory is allocated.
+ // Elements are bitwise copied, copy constructors are NOT invoked.
+ //
+ // Assumptions:
+ // The element index does not exceed the current stack depth.
+ //
+ void Remove(unsigned idx)
+ {
+ assert(idx < m_used);
+ if (idx < m_used - 1)
+ {
+ memmove(&this->m_members[idx], &this->m_members[idx + 1], (m_used - idx - 1) * sizeof(T));
+ }
+ m_used--;
+ }
+
+ //------------------------------------------------------------------------
+ // Size: Get the current stack depth.
+ //
+ // Return Value:
+ // The stack depth.
+ //
+ unsigned Size()
+ {
+ return m_used;
+ }
+};
+
+//------------------------------------------------------------------------
+// EnsureCoversInd: Ensure that the array is large enough for the specified
+// index to be valid.
+//
+// Arguments:
+// idx - the element index
+//
+// Notes:
+// If the array is expanded then
+// - the existing elements are bitwise copied (copy constructors are NOT invoked)
+// - the newly added elements are value-initialized
+//
+template <class T>
+void JitExpandArray<T>::EnsureCoversInd(unsigned idx)
+{
+ if (idx >= m_size)
+ {
+ unsigned oldSize = m_size;
+ T* oldMembers = m_members;
+ m_size = max(idx + 1, max(m_minSize, m_size * 2));
+ if (sizeof(T) < sizeof(int))
+ {
+ m_members = (T*)m_alloc->ArrayAlloc(ALIGN_UP(m_size * sizeof(T), sizeof(int)), sizeof(BYTE));
+ }
+ else
+ {
+ m_members = (T*)m_alloc->ArrayAlloc(m_size, sizeof(T));
+ }
+ if (oldMembers != nullptr)
+ {
+ memcpy(m_members, oldMembers, oldSize * sizeof(T));
+ m_alloc->Free(oldMembers);
+ }
+ InitializeRange(oldSize, m_size);
+ }
+}
diff --git a/src/jit/jitgcinfo.h b/src/jit/jitgcinfo.h
index b2a8eb063a..57f107321c 100644
--- a/src/jit/jitgcinfo.h
+++ b/src/jit/jitgcinfo.h
@@ -68,11 +68,11 @@ struct StackSlotIdKey
}
};
-typedef SimplerHashTable<RegSlotIdKey, RegSlotIdKey, GcSlotId, JitSimplerHashBehavior> RegSlotMap;
-typedef SimplerHashTable<StackSlotIdKey, StackSlotIdKey, GcSlotId, JitSimplerHashBehavior> StackSlotMap;
+typedef JitHashTable<RegSlotIdKey, RegSlotIdKey, GcSlotId> RegSlotMap;
+typedef JitHashTable<StackSlotIdKey, StackSlotIdKey, GcSlotId> StackSlotMap;
#endif
-typedef SimplerHashTable<GenTreePtr, PtrKeyFuncs<GenTree>, VARSET_TP*, JitSimplerHashBehavior> NodeToVarsetPtrMap;
+typedef JitHashTable<GenTreePtr, JitPtrKeyFuncs<GenTree>, VARSET_TP*> NodeToVarsetPtrMap;
class GCInfo
{
diff --git a/src/jit/jithashtable.h b/src/jit/jithashtable.h
new file mode 100644
index 0000000000..52d61a679b
--- /dev/null
+++ b/src/jit/jithashtable.h
@@ -0,0 +1,823 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+#pragma once
+
+// JitHashTable implements a mapping from a Key type to a Value type,
+// via a hash table.
+
+// JitHashTable takes four template parameters:
+// Key, KeyFuncs, Value, Allocator and Behavior.
+// We don't assume that Key has hash or equality functions specific names;
+// rather, we assume that KeyFuncs has the following static methods
+// int GetHashCode(Key)
+// bool Equals(Key, Key)
+// and use those. An instantiator can thus make a small "adaptor class"
+// to invoke existing instance method hash and/or equality functions.
+// If the implementor of a candidate Key class K understands this convention,
+// these static methods can be implemented by K, so that K can be used
+// as the actual arguments for the both Key and KeyFuncs template parameters.
+//
+// The "Behavior" parameter must provide the following static members:
+//
+// s_growth_factor_numerator
+// s_growth_factor_denominator Factor to grow allocation (numerator/denominator).
+// Typically inherited from default traits (3/2)
+//
+// s_density_factor_numerator
+// s_density_factor_denominator Maxium occupied density of table before growth
+// occurs (num/denom). Typically inherited (3/4).
+//
+// s_minimum_allocation Minimum table allocation count (size on first growth.) It is
+// probably preferable to call Reallocate on initialization rather
+// than override this from the default traits.
+//
+// NoMemory() Called when the hash table is unable to grow due to potential
+// overflow or the lack of a sufficiently large prime.
+
+class JitHashTableBehavior
+{
+public:
+ static const unsigned s_growth_factor_numerator = 3;
+ static const unsigned s_growth_factor_denominator = 2;
+
+ static const unsigned s_density_factor_numerator = 3;
+ static const unsigned s_density_factor_denominator = 4;
+
+ static const unsigned s_minimum_allocation = 7;
+
+ inline static void DECLSPEC_NORETURN NoMemory()
+ {
+ NOMEM();
+ }
+};
+
+// Stores info about primes, including the magic number and shift amount needed
+// to implement a divide without using the divide instruction
+class JitPrimeInfo
+{
+public:
+ JitPrimeInfo() : prime(0), magic(0), shift(0)
+ {
+ }
+ JitPrimeInfo(unsigned p, unsigned m, unsigned s) : prime(p), magic(m), shift(s)
+ {
+ }
+ unsigned prime;
+ unsigned magic;
+ unsigned shift;
+
+ // Compute `numerator` / `prime` using magic division
+ unsigned magicNumberDivide(unsigned numerator) const
+ {
+ unsigned __int64 num = numerator;
+ unsigned __int64 mag = magic;
+ unsigned __int64 product = (num * mag) >> (32 + shift);
+ return (unsigned)product;
+ }
+
+ // Compute `numerator` % `prime` using magic division
+ unsigned magicNumberRem(unsigned numerator) const
+ {
+ unsigned div = magicNumberDivide(numerator);
+ unsigned result = numerator - (div * prime);
+ assert(result == numerator % prime);
+ return result;
+ }
+};
+
+// Table of primes and their magic-number-divide constant.
+// For more info see the book "Hacker's Delight" chapter 10.9 "Unsigned Division by Divisors >= 1"
+// These were selected by looking for primes, each roughly twice as big as the next, having
+// 32-bit magic numbers, (because the algorithm for using 33-bit magic numbers is slightly slower).
+
+// clang-format off
+SELECTANY const JitPrimeInfo jitPrimeInfo[]
+{
+ JitPrimeInfo(9, 0x38e38e39, 1),
+ JitPrimeInfo(23, 0xb21642c9, 4),
+ JitPrimeInfo(59, 0x22b63cbf, 3),
+ JitPrimeInfo(131, 0xfa232cf3, 7),
+ JitPrimeInfo(239, 0x891ac73b, 7),
+ JitPrimeInfo(433, 0x975a751, 4),
+ JitPrimeInfo(761, 0x561e46a5, 8),
+ JitPrimeInfo(1399, 0xbb612aa3, 10),
+ JitPrimeInfo(2473, 0x6a009f01, 10),
+ JitPrimeInfo(4327, 0xf2555049, 12),
+ JitPrimeInfo(7499, 0x45ea155f, 11),
+ JitPrimeInfo(12973, 0x1434f6d3, 10),
+ JitPrimeInfo(22433, 0x2ebe18db, 12),
+ JitPrimeInfo(46559, 0xb42bebd5, 15),
+ JitPrimeInfo(96581, 0xadb61b1b, 16),
+ JitPrimeInfo(200341, 0x29df2461, 15),
+ JitPrimeInfo(415517, 0xa181c46d, 18),
+ JitPrimeInfo(861719, 0x4de0bde5, 18),
+ JitPrimeInfo(1787021, 0x9636c46f, 20),
+ JitPrimeInfo(3705617, 0x4870adc1, 20),
+ JitPrimeInfo(7684087, 0x8bbc5b83, 22),
+ JitPrimeInfo(15933877, 0x86c65361, 23),
+ JitPrimeInfo(33040633, 0x40fec79b, 23),
+ JitPrimeInfo(68513161, 0x7d605cd1, 25),
+ JitPrimeInfo(142069021, 0xf1da390b, 27),
+ JitPrimeInfo(294594427, 0x74a2507d, 27),
+ JitPrimeInfo(733045421, 0x5dbec447, 28),
+};
+// clang-format on
+
+// Hash table class definition
+
+template <typename Key,
+ typename KeyFuncs,
+ typename Value,
+ typename Allocator = CompAllocator,
+ typename Behavior = JitHashTableBehavior>
+class JitHashTable
+{
+public:
+ class KeyIterator;
+
+ //------------------------------------------------------------------------
+ // JitHashTable: Construct an empty JitHashTable object.
+ //
+ // Arguments:
+ // alloc - the allocator to be used by the new JitHashTable object
+ //
+ // Notes:
+ // JitHashTable always starts out empty, with no allocation overhead.
+ // Call Reallocate to prime with an initial size if desired.
+ //
+ JitHashTable(Allocator* alloc) : m_alloc(alloc), m_table(nullptr), m_tableSizeInfo(), m_tableCount(0), m_tableMax(0)
+ {
+ assert(m_alloc != nullptr);
+
+#ifndef __GNUC__ // these crash GCC
+ static_assert_no_msg(Behavior::s_growth_factor_numerator > Behavior::s_growth_factor_denominator);
+ static_assert_no_msg(Behavior::s_density_factor_numerator < Behavior::s_density_factor_denominator);
+#endif
+ }
+
+ //------------------------------------------------------------------------
+ // ~JitHashTable: Destruct the JitHashTable object.
+ //
+ // Notes:
+ // Destructs all keys and values stored in the table and frees all
+ // owned memory.
+ //
+ ~JitHashTable()
+ {
+ RemoveAll();
+ }
+
+ //------------------------------------------------------------------------
+ // Lookup: Get the value associated to the specified key, if any.
+ //
+ // Arguments:
+ // k - the key
+ // pVal - pointer to a location used to store the associated value
+ //
+ // Return Value:
+ // `true` if the key exists, `false` otherwise
+ //
+ // Notes:
+ // If the key does not exist *pVal is not updated. pVal may be nullptr
+ // so this function can be used to simply check if the key exists.
+ //
+ bool Lookup(Key k, Value* pVal = nullptr) const
+ {
+ Node* pN = FindNode(k);
+
+ if (pN != nullptr)
+ {
+ if (pVal != nullptr)
+ {
+ *pVal = pN->m_val;
+ }
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ //------------------------------------------------------------------------
+ // Lookup: Get a pointer to the value associated to the specified key.
+ // if any.
+ //
+ // Arguments:
+ // k - the key
+ //
+ // Return Value:
+ // A pointer to the value associated with the specified key or nullptr
+ // if the key is not found
+ //
+ // Notes:
+ // This is similar to `Lookup` but avoids copying the value and allows
+ // updating the value without using `Set`.
+ //
+ Value* LookupPointer(Key k) const
+ {
+ Node* pN = FindNode(k);
+
+ if (pN != nullptr)
+ {
+ return &(pN->m_val);
+ }
+ else
+ {
+ return nullptr;
+ }
+ }
+
+ //------------------------------------------------------------------------
+ // Set: Associate the specified value with the specified key.
+ //
+ // Arguments:
+ // k - the key
+ // v - the value
+ //
+ // Return Value:
+ // `true` if the key already exists, `false` otherwise.
+ //
+ // Notes:
+ // If the key already exists then its associated value is updated to
+ // the new value.
+ //
+ bool Set(Key k, Value v)
+ {
+ CheckGrowth();
+
+ assert(m_tableSizeInfo.prime != 0);
+
+ unsigned index = GetIndexForKey(k);
+
+ Node* pN = m_table[index];
+ while ((pN != nullptr) && !KeyFuncs::Equals(k, pN->m_key))
+ {
+ pN = pN->m_next;
+ }
+ if (pN != nullptr)
+ {
+ pN->m_val = v;
+ return true;
+ }
+ else
+ {
+ Node* pNewNode = new (m_alloc) Node(k, v, m_table[index]);
+ m_table[index] = pNewNode;
+ m_tableCount++;
+ return false;
+ }
+ }
+
+ //------------------------------------------------------------------------
+ // Remove: Remove the specified key and its associated value.
+ //
+ // Arguments:
+ // k - the key
+ //
+ // Return Value:
+ // `true` if the key exists, `false` otherwise.
+ //
+ // Notes:
+ // Removing a inexistent key is not an error.
+ //
+ bool Remove(Key k)
+ {
+ unsigned index = GetIndexForKey(k);
+
+ Node* pN = m_table[index];
+ Node** ppN = &m_table[index];
+ while ((pN != nullptr) && !KeyFuncs::Equals(k, pN->m_key))
+ {
+ ppN = &pN->m_next;
+ pN = pN->m_next;
+ }
+ if (pN != nullptr)
+ {
+ *ppN = pN->m_next;
+ m_tableCount--;
+ Node::operator delete(pN, m_alloc);
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+ }
+
+ //------------------------------------------------------------------------
+ // RemoveAll: Remove all keys and their associated values.
+ //
+ // Notes:
+ // This also frees all the memory owned by the table.
+ //
+ void RemoveAll()
+ {
+ for (unsigned i = 0; i < m_tableSizeInfo.prime; i++)
+ {
+ for (Node* pN = m_table[i]; pN != nullptr;)
+ {
+ Node* pNext = pN->m_next;
+ Node::operator delete(pN, m_alloc);
+ pN = pNext;
+ }
+ }
+ m_alloc->Free(m_table);
+
+ m_table = nullptr;
+ m_tableSizeInfo = JitPrimeInfo();
+ m_tableCount = 0;
+ m_tableMax = 0;
+
+ return;
+ }
+
+ // Get an iterator to the first key in the table.
+ KeyIterator Begin() const
+ {
+ KeyIterator i(this, TRUE);
+ return i;
+ }
+
+ // Get an iterator following the last key in the table.
+ KeyIterator End() const
+ {
+ return KeyIterator(this, FALSE);
+ }
+
+ // Get the number of keys currently stored in the table.
+ unsigned GetCount() const
+ {
+ return m_tableCount;
+ }
+
+private:
+ struct Node;
+
+ //------------------------------------------------------------------------
+ // GetIndexForKey: Get the bucket index for the specified key.
+ //
+ // Arguments:
+ // k - the key
+ //
+ // Return Value:
+ // A bucket index
+ //
+ unsigned GetIndexForKey(Key k) const
+ {
+ unsigned hash = KeyFuncs::GetHashCode(k);
+
+ unsigned index = m_tableSizeInfo.magicNumberRem(hash);
+
+ return index;
+ }
+
+ //------------------------------------------------------------------------
+ // FindNode: Return a pointer to the node having the specified key, if any.
+ //
+ // Arguments:
+ // k - the key
+ //
+ // Return Value:
+ // A pointer to the node or `nullptr` if the key is not found.
+ //
+ Node* FindNode(Key k) const
+ {
+ if (m_tableSizeInfo.prime == 0)
+ {
+ return nullptr;
+ }
+
+ unsigned index = GetIndexForKey(k);
+
+ Node* pN = m_table[index];
+ if (pN == nullptr)
+ {
+ return nullptr;
+ }
+
+ // Otherwise...
+ while ((pN != nullptr) && !KeyFuncs::Equals(k, pN->m_key))
+ {
+ pN = pN->m_next;
+ }
+
+ assert((pN == nullptr) || KeyFuncs::Equals(k, pN->m_key));
+
+ // If pN != nullptr, it's the node for the key, else the key isn't mapped.
+ return pN;
+ }
+
+ //------------------------------------------------------------------------
+ // Grow: Increase the size of the bucket table.
+ //
+ // Notes:
+ // The new size is computed based on the current population, growth factor,
+ // and maximum density factor.
+ //
+ void Grow()
+ {
+ unsigned newSize =
+ (unsigned)(m_tableCount * Behavior::s_growth_factor_numerator / Behavior::s_growth_factor_denominator *
+ Behavior::s_density_factor_denominator / Behavior::s_density_factor_numerator);
+
+ if (newSize < Behavior::s_minimum_allocation)
+ {
+ newSize = Behavior::s_minimum_allocation;
+ }
+
+ // handle potential overflow
+ if (newSize < m_tableCount)
+ {
+ Behavior::NoMemory();
+ }
+
+ Reallocate(newSize);
+ }
+
+ //------------------------------------------------------------------------
+ // CheckGrowth: Check if the maximum hashtable density has been reached
+ // and increase the size of the bucket table if necessary.
+ //
+ void CheckGrowth()
+ {
+ if (m_tableCount == m_tableMax)
+ {
+ Grow();
+ }
+ }
+
+public:
+ //------------------------------------------------------------------------
+ // CheckGrowth: Replace the bucket table with a larger one and copy all nodes
+ // from the existing bucket table.
+ //
+ // Notes:
+ // The new size must be large enough to hold all existing keys in
+ // the table without exceeding the density. Note that the actual
+ // table size must always be a prime number; the specified size
+ // will be increased to the next prime if necessary.
+ //
+ void Reallocate(unsigned newTableSize)
+ {
+ assert(newTableSize >=
+ (GetCount() * Behavior::s_density_factor_denominator / Behavior::s_density_factor_numerator));
+
+ // Allocation size must be a prime number. This is necessary so that hashes uniformly
+ // distribute to all indices, and so that chaining will visit all indices in the hash table.
+ JitPrimeInfo newPrime = NextPrime(newTableSize);
+ newTableSize = newPrime.prime;
+
+ Node** newTable = (Node**)m_alloc->ArrayAlloc(newTableSize, sizeof(Node*));
+
+ for (unsigned i = 0; i < newTableSize; i++)
+ {
+ newTable[i] = nullptr;
+ }
+
+ // Move all entries over to new table (re-using the Node structures.)
+
+ for (unsigned i = 0; i < m_tableSizeInfo.prime; i++)
+ {
+ Node* pN = m_table[i];
+ while (pN != nullptr)
+ {
+ Node* pNext = pN->m_next;
+
+ unsigned newIndex = newPrime.magicNumberRem(KeyFuncs::GetHashCode(pN->m_key));
+ pN->m_next = newTable[newIndex];
+ newTable[newIndex] = pN;
+
+ pN = pNext;
+ }
+ }
+
+ if (m_table != nullptr)
+ {
+ m_alloc->Free(m_table);
+ }
+
+ m_table = newTable;
+ m_tableSizeInfo = newPrime;
+ m_tableMax =
+ (unsigned)(newTableSize * Behavior::s_density_factor_numerator / Behavior::s_density_factor_denominator);
+ }
+
+ // For iteration, we use a pattern similar to the STL "forward
+ // iterator" pattern. It basically consists of wrapping an
+ // "iteration variable" in an object, and providing pointer-like
+ // operators on the iterator. Example usage:
+ //
+ // for (JitHashTable::KeyIterator iter = foo->Begin(), end = foo->End(); !iter.Equal(end); iter++)
+ // {
+ // // use foo, iter.
+ // }
+ // iter.Get() will yield (a reference to) the
+ // current key. It will assert the equivalent of "iter != end."
+ class KeyIterator
+ {
+ private:
+ friend class JitHashTable;
+
+ Node** m_table;
+ Node* m_node;
+ unsigned m_tableSize;
+ unsigned m_index;
+
+ public:
+ //------------------------------------------------------------------------
+ // KeyIterator: Construct an iterator for the specified JitHashTable.
+ //
+ // Arguments:
+ // hash - the hashtable
+ // begin - `true` to construct an "begin" iterator,
+ // `false` to construct an "end" iterator
+ //
+ KeyIterator(const JitHashTable* hash, BOOL begin)
+ : m_table(hash->m_table)
+ , m_node(nullptr)
+ , m_tableSize(hash->m_tableSizeInfo.prime)
+ , m_index(begin ? 0 : m_tableSize)
+ {
+ if (begin && (hash->m_tableCount > 0))
+ {
+ assert(m_table != nullptr);
+ while ((m_index < m_tableSize) && (m_table[m_index] == nullptr))
+ {
+ m_index++;
+ }
+
+ if (m_index >= m_tableSize)
+ {
+ return;
+ }
+ else
+ {
+ m_node = m_table[m_index];
+ }
+ assert(m_node != nullptr);
+ }
+ }
+
+ //------------------------------------------------------------------------
+ // Get: Get a reference to this iterator's key.
+ //
+ // Return Value:
+ // A reference to this iterator's key.
+ //
+ // Assumptions:
+ // This must not be the "end" iterator.
+ //
+ const Key& Get() const
+ {
+ assert(m_node != nullptr);
+
+ return m_node->m_key;
+ }
+
+ //------------------------------------------------------------------------
+ // GetValue: Get a reference to this iterator's value.
+ //
+ // Return Value:
+ // A reference to this iterator's value.
+ //
+ // Assumptions:
+ // This must not be the "end" iterator.
+ //
+ const Value& GetValue() const
+ {
+ assert(m_node != nullptr);
+
+ return m_node->m_val;
+ }
+
+ //------------------------------------------------------------------------
+ // SetValue: Assign a new value to this iterator's key
+ //
+ // Arguments:
+ // value - the value to assign
+ //
+ // Assumptions:
+ // This must not be the "end" iterator.
+ //
+ void SetValue(const Value& value) const
+ {
+ assert(m_node != nullptr);
+
+ m_node->m_val = value;
+ }
+
+ //------------------------------------------------------------------------
+ // Next: Advance the iterator to the next node.
+ //
+ // Notes:
+ // Advancing the end iterator has no effect.
+ //
+ void Next()
+ {
+ if (m_node != nullptr)
+ {
+ m_node = m_node->m_next;
+ if (m_node != nullptr)
+ {
+ return;
+ }
+
+ // Otherwise...
+ m_index++;
+ }
+ while ((m_index < m_tableSize) && (m_table[m_index] == nullptr))
+ {
+ m_index++;
+ }
+
+ if (m_index >= m_tableSize)
+ {
+ m_node = nullptr;
+ return;
+ }
+ else
+ {
+ m_node = m_table[m_index];
+ }
+ assert(m_node != nullptr);
+ }
+
+ // Return `true` if the specified iterator has the same position as this iterator
+ bool Equal(const KeyIterator& i) const
+ {
+ return i.m_node == m_node;
+ }
+
+ // Advance the iterator to the next node
+ void operator++()
+ {
+ Next();
+ }
+
+ // Advance the iterator to the next node
+ void operator++(int)
+ {
+ Next();
+ }
+ };
+
+ //------------------------------------------------------------------------
+ // operator[]: Get a reference to the value associated with the specified key.
+ //
+ // Arguments:
+ // k - the key
+ //
+ // Return Value:
+ // A reference to the value associated with the specified key.
+ //
+ // Notes:
+ // The specified key must exist.
+ //
+ Value& operator[](Key k) const
+ {
+ Value* p = LookupPointer(k);
+ assert(p);
+ return *p;
+ }
+
+private:
+ //------------------------------------------------------------------------
+ // NextPrime: Get a prime number greater than or equal to the specified number.
+ //
+ // Arguments:
+ // number - the minimum value
+ //
+ // Return Value:
+ // A prime number.
+ //
+ static JitPrimeInfo NextPrime(unsigned number)
+ {
+ for (int i = 0; i < (int)(sizeof(jitPrimeInfo) / sizeof(jitPrimeInfo[0])); i++)
+ {
+ if (jitPrimeInfo[i].prime >= number)
+ {
+ return jitPrimeInfo[i];
+ }
+ }
+
+ // overflow
+ Behavior::NoMemory();
+ }
+
+ // The node type.
+ struct Node
+ {
+ Node* m_next; // Assume that the alignment requirement of Key and Value are no greater than Node*,
+ // so put m_next first to avoid unnecessary padding.
+ Key m_key;
+ Value m_val;
+
+ Node(Key k, Value v, Node* next) : m_next(next), m_key(k), m_val(v)
+ {
+ }
+
+ void* operator new(size_t sz, Allocator* alloc)
+ {
+ return alloc->Alloc(sz);
+ }
+
+ void operator delete(void* p, Allocator* alloc)
+ {
+ alloc->Free(p);
+ }
+ };
+
+ // Instance members
+ Allocator* m_alloc; // Allocator to use in this table.
+ Node** m_table; // pointer to table
+ JitPrimeInfo m_tableSizeInfo; // size of table (a prime) and information about it
+ unsigned m_tableCount; // number of elements in table
+ unsigned m_tableMax; // maximum occupied count
+};
+
+// Commonly used KeyFuncs types:
+
+// Base class for types whose equality function is the same as their "==".
+template <typename T>
+struct JitKeyFuncsDefEquals
+{
+ static bool Equals(const T& x, const T& y)
+ {
+ return x == y;
+ }
+};
+
+template <typename T>
+struct JitPtrKeyFuncs : public JitKeyFuncsDefEquals<const T*>
+{
+public:
+ static unsigned GetHashCode(const T* ptr)
+ {
+ // Using the lower 32 bits of a pointer as a hashcode should be good enough.
+ // In fact, this should result in an unique hash code unless we allocate
+ // more than 4 gigabytes or if the virtual address space is fragmented.
+ return static_cast<unsigned>(reinterpret_cast<uintptr_t>(ptr));
+ }
+};
+
+template <typename T> // Must be coercible to "unsigned" with no loss of information.
+struct JitSmallPrimitiveKeyFuncs : public JitKeyFuncsDefEquals<T>
+{
+ static unsigned GetHashCode(const T& val)
+ {
+ return static_cast<unsigned>(val);
+ }
+};
+
+template <typename T> // Assumed to be of size sizeof(UINT64).
+struct JitLargePrimitiveKeyFuncs : public JitKeyFuncsDefEquals<T>
+{
+ static unsigned GetHashCode(const T val)
+ {
+ // A static cast when T is a float or a double converts the value (i.e. 0.25 converts to 0)
+ //
+ // Instead we want to use all of the bits of a float to create the hash value
+ // So we cast the address of val to a pointer to an equivalent sized unsigned int
+ // This allows us to read the actual bit representation of a float type
+ //
+ // We can't read beyond the end of val, so we use sizeof(T) to determine
+ // exactly how many bytes to read
+ //
+ if (sizeof(T) == 8)
+ {
+ // cast &val to (UINT64 *) then deref to get the bits
+ UINT64 asUINT64 = *(reinterpret_cast<const UINT64*>(&val));
+
+ // Get the upper and lower 32-bit values from the 64-bit value
+ UINT32 upper32 = static_cast<UINT32>(asUINT64 >> 32);
+ UINT32 lower32 = static_cast<UINT32>(asUINT64 & 0xFFFFFFFF);
+
+ // Exclusive-Or the upper32 and the lower32 values
+ return static_cast<unsigned>(upper32 ^ lower32);
+ }
+ else if (sizeof(T) == 4)
+ {
+ // cast &val to (UINT32 *) then deref to get the bits
+ UINT32 asUINT32 = *(reinterpret_cast<const UINT32*>(&val));
+
+ // Just return the 32-bit value
+ return static_cast<unsigned>(asUINT32);
+ }
+ else if ((sizeof(T) == 2) || (sizeof(T) == 1))
+ {
+ // For small sizes we must have an integer type
+ // so we can just use the static_cast.
+ //
+ return static_cast<unsigned>(val);
+ }
+ else
+ {
+ // Only support Hashing for types that are 8,4,2 or 1 bytes in size
+ assert(!"Unsupported size");
+ return static_cast<unsigned>(val); // compile-time error here when we have a illegal size
+ }
+ }
+};
diff --git a/src/jit/jitstd/allocator.h b/src/jit/jitstd/allocator.h
index 2bd33daa98..f370af8e9d 100644
--- a/src/jit/jitstd/allocator.h
+++ b/src/jit/jitstd/allocator.h
@@ -2,26 +2,8 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
-// ==++==
-//
-
-//
-
-//
-// ==--==
-
-/*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-XX XX
-XX allocator<T> XX
-XX XX
-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-*/
-
#pragma once
-#include "iallocator.h"
#include "new.h"
namespace jitstd
@@ -50,7 +32,7 @@ private:
allocator();
public:
- inline allocator(IAllocator* pAlloc);
+ inline allocator(CompAllocator* pAlloc);
template <typename U>
inline allocator(const allocator<U>& alloc);
@@ -61,12 +43,12 @@ public:
inline allocator& operator=(const allocator<U>& alloc);
private:
- IAllocator* m_pAlloc;
+ CompAllocator* m_pAlloc;
template <typename U>
friend class allocator;
};
-allocator<void>::allocator(IAllocator* pAlloc)
+allocator<void>::allocator(CompAllocator* pAlloc)
: m_pAlloc(pAlloc)
{
}
@@ -104,7 +86,7 @@ public:
private:
allocator();
public:
- allocator(IAllocator* pAlloc);
+ allocator(CompAllocator* pAlloc);
template <typename U>
allocator(const allocator<U>& alloc);
@@ -128,7 +110,7 @@ public:
};
private:
- IAllocator* m_pAlloc;
+ CompAllocator* m_pAlloc;
template <typename U>
friend class allocator;
};
@@ -140,7 +122,7 @@ namespace jitstd
{
template <typename T>
-allocator<T>::allocator(IAllocator* pAlloc)
+allocator<T>::allocator(CompAllocator* pAlloc)
: m_pAlloc(pAlloc)
{
}
diff --git a/src/jit/lclvars.cpp b/src/jit/lclvars.cpp
index c7f15d8908..d7d1f6e872 100644
--- a/src/jit/lclvars.cpp
+++ b/src/jit/lclvars.cpp
@@ -2215,7 +2215,7 @@ void Compiler::lvaSetVarDoNotEnregister(unsigned varNum DEBUGARG(DoNotEnregister
// Returns true if this local var is a multireg struct
bool Compiler::lvaIsMultiregStruct(LclVarDsc* varDsc)
{
- if (varDsc->TypeGet() == TYP_STRUCT)
+ if (varTypeIsStruct(varDsc->TypeGet()))
{
CORINFO_CLASS_HANDLE clsHnd = varDsc->lvVerTypeInfo.GetClassHandleForValueClass();
structPassingKind howToPassStruct;
@@ -2265,7 +2265,7 @@ void Compiler::lvaSetStruct(unsigned varNum, CORINFO_CLASS_HANDLE typeHnd, bool
size_t lvSize = varDsc->lvSize();
assert((lvSize % sizeof(void*)) ==
0); // The struct needs to be a multiple of sizeof(void*) bytes for getClassGClayout() to be valid.
- varDsc->lvGcLayout = (BYTE*)compGetMemA((lvSize / sizeof(void*)) * sizeof(BYTE), CMK_LvaTable);
+ varDsc->lvGcLayout = (BYTE*)compGetMem((lvSize / sizeof(void*)) * sizeof(BYTE), CMK_LvaTable);
unsigned numGCVars;
var_types simdBaseType = TYP_UNKNOWN;
varDsc->lvType = impNormStructType(typeHnd, varDsc->lvGcLayout, &numGCVars, &simdBaseType);
diff --git a/src/jit/loopcloning.cpp b/src/jit/loopcloning.cpp
index d4a161866f..ccd12ee2be 100644
--- a/src/jit/loopcloning.cpp
+++ b/src/jit/loopcloning.cpp
@@ -76,13 +76,10 @@ GenTreePtr LC_Ident::ToGenTree(Compiler* comp)
switch (type)
{
case Const:
-#ifdef _TARGET_64BIT_
- return comp->gtNewLconNode(constant);
-#else
- return comp->gtNewIconNode((ssize_t)constant);
-#endif
+ assert(constant <= INT32_MAX);
+ return comp->gtNewIconNode(constant);
case Var:
- return comp->gtNewLclvNode((unsigned)constant, comp->lvaTable[constant].lvType);
+ return comp->gtNewLclvNode(constant, comp->lvaTable[constant].lvType);
case ArrLen:
return arrLen.ToGenTree(comp);
case Null:
@@ -111,12 +108,6 @@ GenTreePtr LC_Expr::ToGenTree(Compiler* comp)
{
case Ident:
return ident.ToGenTree(comp);
- case IdentPlusConst:
-#ifdef _TARGET_64BIT_
- return comp->gtNewOperNode(GT_ADD, TYP_LONG, ident.ToGenTree(comp), comp->gtNewLconNode(constant));
-#else
- return comp->gtNewOperNode(GT_ADD, TYP_INT, ident.ToGenTree(comp), comp->gtNewIconNode((ssize_t)constant));
-#endif
default:
assert(!"Could not convert LC_Expr to GenTree");
unreached();
@@ -135,7 +126,10 @@ GenTreePtr LC_Expr::ToGenTree(Compiler* comp)
//
GenTreePtr LC_Condition::ToGenTree(Compiler* comp)
{
- return comp->gtNewOperNode(oper, TYP_INT, op1.ToGenTree(comp), op2.ToGenTree(comp));
+ GenTree* op1Tree = op1.ToGenTree(comp);
+ GenTree* op2Tree = op2.ToGenTree(comp);
+ assert(genTypeSize(genActualType(op1Tree->TypeGet())) == genTypeSize(genActualType(op2Tree->TypeGet())));
+ return comp->gtNewOperNode(oper, TYP_INT, op1Tree, op2Tree);
}
//--------------------------------------------------------------------------------------------------
@@ -227,7 +221,7 @@ bool LC_Condition::Combines(const LC_Condition& cond, LC_Condition* newCond)
// Return Values:
// Return the optInfo array member. The method doesn't allocate memory.
//
-ExpandArrayStack<LcOptInfo*>* LoopCloneContext::GetLoopOptInfo(unsigned loopNum)
+JitExpandArrayStack<LcOptInfo*>* LoopCloneContext::GetLoopOptInfo(unsigned loopNum)
{
return optInfo[loopNum];
}
@@ -262,11 +256,11 @@ void LoopCloneContext::CancelLoopOptInfo(unsigned loopNum)
// Return Values:
// The array of optimization candidates for the loop.
//
-ExpandArrayStack<LcOptInfo*>* LoopCloneContext::EnsureLoopOptInfo(unsigned loopNum)
+JitExpandArrayStack<LcOptInfo*>* LoopCloneContext::EnsureLoopOptInfo(unsigned loopNum)
{
if (optInfo[loopNum] == nullptr)
{
- optInfo[loopNum] = new (alloc) ExpandArrayStack<LcOptInfo*>(alloc, 4);
+ optInfo[loopNum] = new (alloc) JitExpandArrayStack<LcOptInfo*>(alloc, 4);
}
return optInfo[loopNum];
}
@@ -281,11 +275,11 @@ ExpandArrayStack<LcOptInfo*>* LoopCloneContext::EnsureLoopOptInfo(unsigned loopN
// Return Values:
// The array of cloning conditions for the loop.
//
-ExpandArrayStack<LC_Condition>* LoopCloneContext::EnsureConditions(unsigned loopNum)
+JitExpandArrayStack<LC_Condition>* LoopCloneContext::EnsureConditions(unsigned loopNum)
{
if (conditions[loopNum] == nullptr)
{
- conditions[loopNum] = new (alloc) ExpandArrayStack<LC_Condition>(alloc, 4);
+ conditions[loopNum] = new (alloc) JitExpandArrayStack<LC_Condition>(alloc, 4);
}
return conditions[loopNum];
}
@@ -299,7 +293,7 @@ ExpandArrayStack<LC_Condition>* LoopCloneContext::EnsureConditions(unsigned loop
// Return Values:
// The array of cloning conditions for the loop.
//
-ExpandArrayStack<LC_Condition>* LoopCloneContext::GetConditions(unsigned loopNum)
+JitExpandArrayStack<LC_Condition>* LoopCloneContext::GetConditions(unsigned loopNum)
{
return conditions[loopNum];
}
@@ -313,11 +307,11 @@ ExpandArrayStack<LC_Condition>* LoopCloneContext::GetConditions(unsigned loopNum
// Return Values:
// The array of dereferences for the loop.
//
-ExpandArrayStack<LC_Array>* LoopCloneContext::EnsureDerefs(unsigned loopNum)
+JitExpandArrayStack<LC_Array>* LoopCloneContext::EnsureDerefs(unsigned loopNum)
{
if (derefs[loopNum] == nullptr)
{
- derefs[loopNum] = new (alloc) ExpandArrayStack<LC_Array>(alloc, 4);
+ derefs[loopNum] = new (alloc) JitExpandArrayStack<LC_Array>(alloc, 4);
}
return derefs[loopNum];
}
@@ -333,7 +327,7 @@ ExpandArrayStack<LC_Array>* LoopCloneContext::EnsureDerefs(unsigned loopNum)
//
bool LoopCloneContext::HasBlockConditions(unsigned loopNum)
{
- ExpandArrayStack<ExpandArrayStack<LC_Condition>*>* levelCond = blockConditions[loopNum];
+ JitExpandArrayStack<JitExpandArrayStack<LC_Condition>*>* levelCond = blockConditions[loopNum];
if (levelCond == nullptr)
{
return false;
@@ -359,7 +353,7 @@ bool LoopCloneContext::HasBlockConditions(unsigned loopNum)
// Return Values:
// Return block conditions.
//
-ExpandArrayStack<ExpandArrayStack<LC_Condition>*>* LoopCloneContext::GetBlockConditions(unsigned loopNum)
+JitExpandArrayStack<JitExpandArrayStack<LC_Condition>*>* LoopCloneContext::GetBlockConditions(unsigned loopNum)
{
assert(HasBlockConditions(loopNum));
return blockConditions[loopNum];
@@ -376,17 +370,18 @@ ExpandArrayStack<ExpandArrayStack<LC_Condition>*>* LoopCloneContext::GetBlockCon
// Return Values:
// Return block conditions.
//
-ExpandArrayStack<ExpandArrayStack<LC_Condition>*>* LoopCloneContext::EnsureBlockConditions(unsigned loopNum,
- unsigned condBlocks)
+JitExpandArrayStack<JitExpandArrayStack<LC_Condition>*>* LoopCloneContext::EnsureBlockConditions(unsigned loopNum,
+ unsigned condBlocks)
{
if (blockConditions[loopNum] == nullptr)
{
- blockConditions[loopNum] = new (alloc) ExpandArrayStack<ExpandArrayStack<LC_Condition>*>(alloc, condBlocks);
+ blockConditions[loopNum] =
+ new (alloc) JitExpandArrayStack<JitExpandArrayStack<LC_Condition>*>(alloc, condBlocks);
}
- ExpandArrayStack<ExpandArrayStack<LC_Condition>*>* levelCond = blockConditions[loopNum];
+ JitExpandArrayStack<JitExpandArrayStack<LC_Condition>*>* levelCond = blockConditions[loopNum];
for (unsigned i = 0; i < condBlocks; ++i)
{
- levelCond->Set(i, new (alloc) ExpandArrayStack<LC_Condition>(alloc));
+ levelCond->Set(i, new (alloc) JitExpandArrayStack<LC_Condition>(alloc));
}
return levelCond;
}
@@ -394,7 +389,7 @@ ExpandArrayStack<ExpandArrayStack<LC_Condition>*>* LoopCloneContext::EnsureBlock
#ifdef DEBUG
void LoopCloneContext::PrintBlockConditions(unsigned loopNum)
{
- ExpandArrayStack<ExpandArrayStack<LC_Condition>*>* levelCond = blockConditions[loopNum];
+ JitExpandArrayStack<JitExpandArrayStack<LC_Condition>*>* levelCond = blockConditions[loopNum];
if (levelCond == nullptr || levelCond->Size() == 0)
{
JITDUMP("No block conditions\n");
@@ -445,7 +440,7 @@ void LoopCloneContext::EvaluateConditions(unsigned loopNum, bool* pAllTrue, bool
bool allTrue = true;
bool anyFalse = false;
- ExpandArrayStack<LC_Condition>& conds = *conditions[loopNum];
+ JitExpandArrayStack<LC_Condition>& conds = *conditions[loopNum];
JITDUMP("Evaluating %d loop cloning conditions for loop %d\n", conds.Size(), loopNum);
@@ -502,7 +497,7 @@ void LoopCloneContext::EvaluateConditions(unsigned loopNum, bool* pAllTrue, bool
//
// Sometimes, two conditions will combine together to yield a single condition, then remove a
// duplicate condition.
-void LoopCloneContext::OptimizeConditions(ExpandArrayStack<LC_Condition>& conds)
+void LoopCloneContext::OptimizeConditions(JitExpandArrayStack<LC_Condition>& conds)
{
for (unsigned i = 0; i < conds.Size(); ++i)
{
@@ -574,7 +569,7 @@ void LoopCloneContext::OptimizeBlockConditions(unsigned loopNum DEBUGARG(bool ve
{
return;
}
- ExpandArrayStack<ExpandArrayStack<LC_Condition>*>* levelCond = blockConditions[loopNum];
+ JitExpandArrayStack<JitExpandArrayStack<LC_Condition>*>* levelCond = blockConditions[loopNum];
for (unsigned i = 0; i < levelCond->Size(); ++i)
{
OptimizeConditions(*((*levelCond)[i]));
@@ -612,7 +607,7 @@ void LoopCloneContext::OptimizeConditions(unsigned loopNum DEBUGARG(bool verbose
printf("\n");
}
#endif
- ExpandArrayStack<LC_Condition>& conds = *conditions[loopNum];
+ JitExpandArrayStack<LC_Condition>& conds = *conditions[loopNum];
OptimizeConditions(conds);
#ifdef DEBUG
@@ -673,10 +668,10 @@ void LoopCloneContext::PrintConditions(unsigned loopNum)
// Return Values:
// None.
//
-void LoopCloneContext::CondToStmtInBlock(Compiler* comp,
- ExpandArrayStack<LC_Condition>& conds,
- BasicBlock* block,
- bool reverse)
+void LoopCloneContext::CondToStmtInBlock(Compiler* comp,
+ JitExpandArrayStack<LC_Condition>& conds,
+ BasicBlock* block,
+ bool reverse)
{
noway_assert(conds.Size() > 0);
@@ -752,7 +747,7 @@ bool LC_Deref::HasChildren()
// Return Values:
// None
//
-void LC_Deref::DeriveLevelConditions(ExpandArrayStack<ExpandArrayStack<LC_Condition>*>* conds)
+void LC_Deref::DeriveLevelConditions(JitExpandArrayStack<JitExpandArrayStack<LC_Condition>*>* conds)
{
if (level == 0)
{
@@ -789,16 +784,16 @@ void LC_Deref::DeriveLevelConditions(ExpandArrayStack<ExpandArrayStack<LC_Condit
// EnsureChildren - Create an array of child nodes if nullptr.
//
// Arguments:
-// alloc IAllocator instance
+// alloc CompAllocator instance
//
// Return Values:
// None
//
-void LC_Deref::EnsureChildren(IAllocator* alloc)
+void LC_Deref::EnsureChildren(CompAllocator* alloc)
{
if (children == nullptr)
{
- children = new (alloc) ExpandArrayStack<LC_Deref*>(alloc);
+ children = new (alloc) JitExpandArrayStack<LC_Deref*>(alloc);
}
}
@@ -828,7 +823,7 @@ LC_Deref* LC_Deref::Find(unsigned lcl)
//
// static
-LC_Deref* LC_Deref::Find(ExpandArrayStack<LC_Deref*>* children, unsigned lcl)
+LC_Deref* LC_Deref::Find(JitExpandArrayStack<LC_Deref*>* children, unsigned lcl)
{
if (children == nullptr)
{
diff --git a/src/jit/loopcloning.h b/src/jit/loopcloning.h
index 20ad6ddb40..aefb6f4eb0 100644
--- a/src/jit/loopcloning.h
+++ b/src/jit/loopcloning.h
@@ -99,13 +99,13 @@ class Compiler;
*/
struct ArrIndex
{
- unsigned arrLcl; // The array base local num
- ExpandArrayStack<unsigned> indLcls; // The indices local nums
- ExpandArrayStack<GenTree*> bndsChks; // The bounds checks nodes along each dimension.
- unsigned rank; // Rank of the array
- BasicBlock* useBlock; // Block where the [] occurs
+ unsigned arrLcl; // The array base local num
+ JitExpandArrayStack<unsigned> indLcls; // The indices local nums
+ JitExpandArrayStack<GenTree*> bndsChks; // The bounds checks nodes along each dimension.
+ unsigned rank; // Rank of the array
+ BasicBlock* useBlock; // Block where the [] occurs
- ArrIndex(IAllocator* alloc) : arrLcl(BAD_VAR_NUM), indLcls(alloc), bndsChks(alloc), rank(0), useBlock(nullptr)
+ ArrIndex(CompAllocator* alloc) : arrLcl(BAD_VAR_NUM), indLcls(alloc), bndsChks(alloc), rank(0), useBlock(nullptr)
{
}
@@ -186,7 +186,7 @@ struct LcMdArrayOptInfo : public LcOptInfo
{
}
- ArrIndex* GetArrIndexForDim(IAllocator* alloc)
+ ArrIndex* GetArrIndexForDim(CompAllocator* alloc)
{
if (index == nullptr)
{
@@ -327,7 +327,7 @@ struct LC_Ident
Null,
};
- INT64 constant; // The constant value if this node is of type "Const", or the lcl num if "Var"
+ unsigned constant; // The constant value if this node is of type "Const", or the lcl num if "Var"
LC_Array arrLen; // The LC_Array if the type is "ArrLen"
IdentType type; // The type of this object
@@ -355,7 +355,7 @@ struct LC_Ident
switch (type)
{
case Const:
- printf("%I64d", constant);
+ printf("%u", constant);
break;
case Var:
printf("V%02d", constant);
@@ -376,7 +376,7 @@ struct LC_Ident
LC_Ident() : type(Invalid)
{
}
- LC_Ident(INT64 constant, IdentType type) : constant(constant), type(type)
+ LC_Ident(unsigned constant, IdentType type) : constant(constant), type(type)
{
}
explicit LC_Ident(IdentType type) : type(type)
@@ -392,7 +392,7 @@ struct LC_Ident
/**
*
- * Symbolic representation of an expr that involves an "LC_Ident" or an "LC_Ident - constant"
+ * Symbolic representation of an expr that involves an "LC_Ident"
*/
struct LC_Expr
{
@@ -400,11 +400,9 @@ struct LC_Expr
{
Invalid,
Ident,
- IdentPlusConst
};
LC_Ident ident;
- INT64 constant;
ExprType type;
// Equality operator
@@ -418,12 +416,6 @@ struct LC_Expr
return false;
}
- // If the type involves arithmetic, the constant should match.
- if (type == IdentPlusConst && constant != that.constant)
- {
- return false;
- }
-
// Check if the ident match.
return (ident == that.ident);
}
@@ -431,13 +423,7 @@ struct LC_Expr
#ifdef DEBUG
void Print()
{
- if (type == IdentPlusConst)
- {
- printf("(%I64d - ", constant);
- ident.Print();
- printf(")");
- }
- else
+ if (type == Ident)
{
ident.Print();
}
@@ -450,9 +436,6 @@ struct LC_Expr
explicit LC_Expr(const LC_Ident& ident) : ident(ident), type(Ident)
{
}
- LC_Expr(const LC_Ident& ident, INT64 constant) : ident(ident), constant(constant), type(IdentPlusConst)
- {
- }
// Convert LC_Expr into a tree node.
GenTreePtr ToGenTree(Compiler* comp);
@@ -516,8 +499,8 @@ struct LC_Condition
*/
struct LC_Deref
{
- const LC_Array array;
- ExpandArrayStack<LC_Deref*>* children;
+ const LC_Array array;
+ JitExpandArrayStack<LC_Deref*>* children;
unsigned level;
@@ -530,10 +513,10 @@ struct LC_Deref
unsigned Lcl();
bool HasChildren();
- void EnsureChildren(IAllocator* alloc);
- static LC_Deref* Find(ExpandArrayStack<LC_Deref*>* children, unsigned lcl);
+ void EnsureChildren(CompAllocator* alloc);
+ static LC_Deref* Find(JitExpandArrayStack<LC_Deref*>* children, unsigned lcl);
- void DeriveLevelConditions(ExpandArrayStack<ExpandArrayStack<LC_Condition>*>* len);
+ void DeriveLevelConditions(JitExpandArrayStack<JitExpandArrayStack<LC_Condition>*>* len);
#ifdef DEBUG
void Print(unsigned indent = 0)
{
@@ -551,7 +534,7 @@ struct LC_Deref
#ifdef _MSC_VER
(*children)[i]->Print(indent + 1);
#else // _MSC_VER
- (*((ExpandArray<LC_Deref*>*)children))[i]->Print(indent + 1);
+ (*((JitExpandArray<LC_Deref*>*)children))[i]->Print(indent + 1);
#endif // _MSC_VER
}
}
@@ -577,22 +560,24 @@ struct LC_Deref
*/
struct LoopCloneContext
{
- IAllocator* alloc; // The allocator
- ExpandArrayStack<LcOptInfo*>** optInfo; // The array of optimization opportunities found in each loop. (loop x
- // optimization-opportunities)
- ExpandArrayStack<LC_Condition>** conditions; // The array of conditions that influence which path to take for each
- // loop. (loop x cloning-conditions)
- ExpandArrayStack<LC_Array>** derefs; // The array of dereference conditions found in each loop. (loop x
- // deref-conditions)
- ExpandArrayStack<ExpandArrayStack<LC_Condition>*>** blockConditions; // The array of block levels of conditions for
- // each loop. (loop x level x conditions)
-
- LoopCloneContext(unsigned loopCount, IAllocator* alloc) : alloc(alloc)
- {
- optInfo = new (alloc) ExpandArrayStack<LcOptInfo*>*[loopCount];
- conditions = new (alloc) ExpandArrayStack<LC_Condition>*[loopCount];
- derefs = new (alloc) ExpandArrayStack<LC_Array>*[loopCount];
- blockConditions = new (alloc) ExpandArrayStack<ExpandArrayStack<LC_Condition>*>*[loopCount];
+ CompAllocator* alloc; // The allocator
+ JitExpandArrayStack<LcOptInfo*>** optInfo; // The array of optimization opportunities found in each loop. (loop x
+ // optimization-opportunities)
+ JitExpandArrayStack<LC_Condition>** conditions; // The array of conditions that influence which path to take for
+ // each
+ // loop. (loop x cloning-conditions)
+ JitExpandArrayStack<LC_Array>** derefs; // The array of dereference conditions found in each loop. (loop x
+ // deref-conditions)
+ JitExpandArrayStack<JitExpandArrayStack<LC_Condition>*>** blockConditions; // The array of block levels of
+ // conditions for
+ // each loop. (loop x level x conditions)
+
+ LoopCloneContext(unsigned loopCount, CompAllocator* alloc) : alloc(alloc)
+ {
+ optInfo = new (alloc) JitExpandArrayStack<LcOptInfo*>*[loopCount];
+ conditions = new (alloc) JitExpandArrayStack<LC_Condition>*[loopCount];
+ derefs = new (alloc) JitExpandArrayStack<LC_Array>*[loopCount];
+ blockConditions = new (alloc) JitExpandArrayStack<JitExpandArrayStack<LC_Condition>*>*[loopCount];
for (unsigned i = 0; i < loopCount; ++i)
{
optInfo[i] = nullptr;
@@ -603,15 +588,15 @@ struct LoopCloneContext
}
// Evaluate conditions into a JTRUE stmt and put it in the block. Reverse condition if 'reverse' is true.
- void CondToStmtInBlock(Compiler* comp, ExpandArrayStack<LC_Condition>& conds, BasicBlock* block, bool reverse);
+ void CondToStmtInBlock(Compiler* comp, JitExpandArrayStack<LC_Condition>& conds, BasicBlock* block, bool reverse);
// Get all the optimization information for loop "loopNum"; This information is held in "optInfo" array.
// If NULL this allocates the optInfo[loopNum] array for "loopNum"
- ExpandArrayStack<LcOptInfo*>* EnsureLoopOptInfo(unsigned loopNum);
+ JitExpandArrayStack<LcOptInfo*>* EnsureLoopOptInfo(unsigned loopNum);
// Get all the optimization information for loop "loopNum"; This information is held in "optInfo" array.
// If NULL this does not allocate the optInfo[loopNum] array for "loopNum"
- ExpandArrayStack<LcOptInfo*>* GetLoopOptInfo(unsigned loopNum);
+ JitExpandArrayStack<LcOptInfo*>* GetLoopOptInfo(unsigned loopNum);
// Cancel all optimizations for loop "loopNum" by clearing out the "conditions" member if non-null
// and setting the optInfo to "null.", If "null", then the user of this class is not supposed to
@@ -619,19 +604,20 @@ struct LoopCloneContext
void CancelLoopOptInfo(unsigned loopNum);
// Get the conditions that decide which loop to take for "loopNum." If NULL allocate an empty array.
- ExpandArrayStack<LC_Condition>* EnsureConditions(unsigned loopNum);
+ JitExpandArrayStack<LC_Condition>* EnsureConditions(unsigned loopNum);
// Get the conditions for loop. No allocation is performed.
- ExpandArrayStack<LC_Condition>* GetConditions(unsigned loopNum);
+ JitExpandArrayStack<LC_Condition>* GetConditions(unsigned loopNum);
// Ensure that the "deref" conditions array is allocated.
- ExpandArrayStack<LC_Array>* EnsureDerefs(unsigned loopNum);
+ JitExpandArrayStack<LC_Array>* EnsureDerefs(unsigned loopNum);
// Get block conditions for each loop, no allocation is performed.
- ExpandArrayStack<ExpandArrayStack<LC_Condition>*>* GetBlockConditions(unsigned loopNum);
+ JitExpandArrayStack<JitExpandArrayStack<LC_Condition>*>* GetBlockConditions(unsigned loopNum);
// Ensure that the block condition is present, if not allocate space.
- ExpandArrayStack<ExpandArrayStack<LC_Condition>*>* EnsureBlockConditions(unsigned loopNum, unsigned totalBlocks);
+ JitExpandArrayStack<JitExpandArrayStack<LC_Condition>*>* EnsureBlockConditions(unsigned loopNum,
+ unsigned totalBlocks);
// Print the block conditions for the loop.
void PrintBlockConditions(unsigned loopNum);
@@ -653,7 +639,7 @@ struct LoopCloneContext
void EvaluateConditions(unsigned loopNum, bool* pAllTrue, bool* pAnyFalse DEBUGARG(bool verbose));
private:
- void OptimizeConditions(ExpandArrayStack<LC_Condition>& conds);
+ void OptimizeConditions(JitExpandArrayStack<LC_Condition>& conds);
public:
// Optimize conditions to remove redundant conditions.
diff --git a/src/jit/lower.cpp b/src/jit/lower.cpp
index f62efd1fb3..ce99e4d5b5 100644
--- a/src/jit/lower.cpp
+++ b/src/jit/lower.cpp
@@ -2481,54 +2481,6 @@ GenTree* Lowering::LowerCompare(GenTree* cmp)
}
#endif
-#ifdef _TARGET_64BIT_
- if (cmp->gtGetOp1()->TypeGet() != cmp->gtGetOp2()->TypeGet())
- {
- bool op1Is64Bit = (genTypeSize(cmp->gtGetOp1()->TypeGet()) == 8);
- bool op2Is64Bit = (genTypeSize(cmp->gtGetOp2()->TypeGet()) == 8);
-
- if (op1Is64Bit != op2Is64Bit)
- {
- //
- // Normally this should not happen. IL allows comparing int32 to native int but the importer
- // automatically inserts a cast from int32 to long on 64 bit architectures. However, the JIT
- // accidentally generates int/long comparisons internally:
- // - loop cloning compares int (and even small int) index limits against long constants
- //
- // TODO-Cleanup: The above mentioned issues should be fixed and then the code below may be
- // replaced with an assert or at least simplified. The special casing of constants in code
- // below is only necessary to prevent worse code generation for switches and loop cloning.
- //
-
- GenTree* longOp = op1Is64Bit ? cmp->gtOp.gtOp1 : cmp->gtOp.gtOp2;
- GenTree** smallerOpUse = op2Is64Bit ? &cmp->gtOp.gtOp1 : &cmp->gtOp.gtOp2;
-#ifdef _TARGET_AMD64_
- var_types smallerType = (*smallerOpUse)->TypeGet();
-#elif defined(_TARGET_ARM64_)
- var_types smallerType = genActualType((*smallerOpUse)->TypeGet());
-#endif // _TARGET_AMD64_
-
- assert(genTypeSize(smallerType) < 8);
-
- if (longOp->IsCnsIntOrI() && genTypeCanRepresentValue(smallerType, longOp->AsIntCon()->IconValue()))
- {
- longOp->gtType = smallerType;
- }
- else if ((*smallerOpUse)->IsCnsIntOrI())
- {
- (*smallerOpUse)->gtType = TYP_LONG;
- }
- else
- {
- GenTree* cast = comp->gtNewCastNode(TYP_LONG, *smallerOpUse, TYP_LONG);
- *smallerOpUse = cast;
- BlockRange().InsertAfter(cast->gtGetOp1(), cast);
- ContainCheckCast(cast->AsCast());
- }
- }
- }
-#endif // _TARGET_64BIT_
-
#if defined(_TARGET_XARCH_) || defined(_TARGET_ARM64_)
if (cmp->gtGetOp2()->IsIntegralConst())
{
diff --git a/src/jit/lowerarmarch.cpp b/src/jit/lowerarmarch.cpp
index 2213960c11..6526117bdd 100644
--- a/src/jit/lowerarmarch.cpp
+++ b/src/jit/lowerarmarch.cpp
@@ -563,6 +563,20 @@ void Lowering::ContainCheckIndir(GenTreeIndir* indirNode)
return;
}
+#ifdef FEATURE_SIMD
+ // If indirTree is of TYP_SIMD12, don't mark addr as contained
+ // so that it always get computed to a register. This would
+ // mean codegen side logic doesn't need to handle all possible
+ // addr expressions that could be contained.
+ //
+ // TODO-ARM64-CQ: handle other addr mode expressions that could be marked
+ // as contained.
+ if (indirNode->TypeGet() == TYP_SIMD12)
+ {
+ return;
+ }
+#endif // FEATURE_SIMD
+
GenTree* addr = indirNode->Addr();
bool makeContained = true;
if ((addr->OperGet() == GT_LEA) && IsSafeToContainMem(indirNode, addr))
@@ -665,12 +679,6 @@ void Lowering::ContainCheckStoreLoc(GenTreeLclVarCommon* storeLoc)
#ifdef FEATURE_SIMD
if (varTypeIsSIMD(storeLoc))
{
- if (op1->IsCnsIntOrI())
- {
- // For an InitBlk we want op1 to be contained; otherwise we want it to
- // be evaluated into an xmm register.
- MakeSrcContained(storeLoc, op1);
- }
return;
}
#endif // FEATURE_SIMD
diff --git a/src/jit/lsra.cpp b/src/jit/lsra.cpp
index 6b9cde5acc..382eb512a1 100644
--- a/src/jit/lsra.cpp
+++ b/src/jit/lsra.cpp
@@ -721,9 +721,9 @@ void LinearScan::applyCalleeSaveHeuristics(RefPosition* rp)
Interval* theInterval = rp->getInterval();
#ifdef DEBUG
- regMaskTP calleeSaveMask = calleeSaveRegs(getRegisterType(theInterval, rp));
if (doReverseCallerCallee())
{
+ regMaskTP calleeSaveMask = calleeSaveRegs(theInterval->registerType);
rp->registerAssignment =
getConstrainedRegMask(rp->registerAssignment, calleeSaveMask, rp->minRegCandidateCount);
}
@@ -1119,7 +1119,7 @@ LinearScanInterface* getLinearScanAllocator(Compiler* comp)
LinearScan::LinearScan(Compiler* theCompiler)
: compiler(theCompiler)
#if MEASURE_MEM_ALLOC
- , lsraIAllocator(nullptr)
+ , lsraAllocator(nullptr)
#endif // MEASURE_MEM_ALLOC
, intervals(LinearScanMemoryAllocatorInterval(theCompiler))
, refPositions(LinearScanMemoryAllocatorRefPosition(theCompiler))
@@ -1131,7 +1131,6 @@ LinearScan::LinearScan(Compiler* theCompiler)
// Get the value of the environment variable that controls stress for register allocation
lsraStressMask = JitConfig.JitStressRegs();
#if 0
-#ifdef DEBUG
if (lsraStressMask != 0)
{
// The code in this #if can be used to debug JitStressRegs issues according to
@@ -1163,10 +1162,7 @@ LinearScan::LinearScan(Compiler* theCompiler)
printf(""); // in our logic this causes a flush
}
}
-#endif // DEBUG
-#endif
-
- dumpTerse = (JitConfig.JitDumpTerseLsra() != 0);
+#endif // 0
#endif // DEBUG
enregisterLocalVars = ((compiler->opts.compFlags & CLFLG_REGVAR) != 0) && compiler->lvaTrackedCount > 0;
@@ -3029,7 +3025,7 @@ bool LinearScan::buildKillPositionsForNode(GenTree* tree, LsraLocation currentLo
// CORINFO_HELP_ASSIGN_BYREF helper, which kills callee-saved RSI and RDI, if
// LSRA doesn't assign RSI/RDI, they wouldn't get marked as modified until codegen,
// which is too late.
- compiler->codeGen->regSet.rsSetRegsModified(killMask DEBUGARG(dumpTerse));
+ compiler->codeGen->regSet.rsSetRegsModified(killMask DEBUGARG(true));
addRefsForPhysRegMask(killMask, currentLoc, RefTypeKill, true);
@@ -6153,8 +6149,15 @@ bool LinearScan::isSpillCandidate(Interval* current,
#endif
{
RefPosition* nextPhysRegPosition = physRegRecord->getNextRefPosition();
- assert((nextPhysRegPosition->nodeLocation == refLocation && candidateBit != refPosition->registerAssignment)
- ARM64_ONLY(|| (physRegRecord->regNum == REG_IP0) || (physRegRecord->regNum == REG_IP1)));
+#ifdef _TARGET_ARM64_
+ // On ARM64, we may need to actually allocate IP0 and IP1 in some cases, but we don't include it in
+ // the allocation order for tryAllocateFreeReg.
+ if ((physRegRecord->regNum != REG_IP0) && (physRegRecord->regNum != REG_IP1))
+#endif // _TARGET_ARM64_
+ {
+ assert((nextPhysRegPosition != nullptr) && (nextPhysRegPosition->nodeLocation == refLocation) &&
+ (candidateBit != refPosition->registerAssignment));
+ }
return false;
}
@@ -6635,7 +6638,7 @@ void LinearScan::checkAndAssignInterval(RegRecord* regRec, Interval* interval)
void LinearScan::assignPhysReg(RegRecord* regRec, Interval* interval)
{
regMaskTP assignedRegMask = genRegMask(regRec->regNum);
- compiler->codeGen->regSet.rsSetRegsModified(assignedRegMask DEBUGARG(dumpTerse));
+ compiler->codeGen->regSet.rsSetRegsModified(assignedRegMask DEBUGARG(true));
checkAndAssignInterval(regRec, interval);
interval->assignedReg = regRec;
@@ -6941,15 +6944,6 @@ void LinearScan::unassignPhysReg(RegRecord* regRec, RefPosition* spillRefPositio
}
#endif // _TARGET_ARM_
-#ifdef DEBUG
- if (VERBOSE && !dumpTerse)
- {
- printf("unassigning %s: ", getRegName(regRec->regNum));
- assignedInterval->dump();
- printf("\n");
- }
-#endif // DEBUG
-
RefPosition* nextRefPosition = nullptr;
if (spillRefPosition != nullptr)
{
@@ -7807,12 +7801,11 @@ void LinearScan::allocateRegisters()
printf("\n\nAllocating Registers\n"
"--------------------\n");
- if (dumpTerse)
- {
- dumpRegRecordHeader();
- // Now print an empty indent
- printf(indentFormat, "");
- }
+ // Start with a small set of commonly used registers, so that we don't keep having to print a new title.
+ registersToDump = LsraLimitSmallIntSet | LsraLimitSmallFPSet;
+ dumpRegRecordHeader();
+ // Now print an empty "RefPosition", since we complete the dump of the regs at the beginning of the loop.
+ printf(indentFormat, "");
}
#endif // DEBUG
@@ -7838,16 +7831,9 @@ void LinearScan::allocateRegisters()
activeRefPosition = nullptr;
if (VERBOSE)
{
- if (dumpTerse)
- {
- // We're really dumping the RegRecords "after" the previous RefPosition, but it's more convenient
- // to do this here, since there are a number of "continue"s in this loop.
- dumpRegRecords();
- }
- else
- {
- printf("\n");
- }
+ // We're really dumping the RegRecords "after" the previous RefPosition, but it's more convenient
+ // to do this here, since there are a number of "continue"s in this loop.
+ dumpRegRecords();
}
#endif // DEBUG
@@ -7912,6 +7898,10 @@ void LinearScan::allocateRegisters()
assert((refType == RefTypeBB) || (refType == RefTypeKillGCRefs));
}
+#ifdef DEBUG
+ activeRefPosition = currentRefPosition;
+#endif // DEBUG
+
// For the purposes of register resolution, we handle the DummyDefs before
// the block boundary - so the RefTypeBB is after all the DummyDefs.
// However, for the purposes of allocation, we want to handle the block
@@ -7929,36 +7919,15 @@ void LinearScan::allocateRegisters()
if (currentBlock == nullptr)
{
currentBlock = startBlockSequence();
+ INDEBUG(dumpLsraAllocationEvent(LSRA_EVENT_START_BB, nullptr, REG_NA, compiler->fgFirstBB));
}
else
{
processBlockEndAllocation(currentBlock);
currentBlock = moveToNextBlock();
}
-#ifdef DEBUG
- if (VERBOSE && currentBlock != nullptr && !dumpTerse)
- {
- currentBlock->dspBlockHeader(compiler);
- printf("\n");
- }
-#endif // DEBUG
}
-#ifdef DEBUG
- activeRefPosition = currentRefPosition;
- if (VERBOSE)
- {
- if (dumpTerse)
- {
- dumpRefPositionShort(currentRefPosition, currentBlock);
- }
- else
- {
- currentRefPosition->dump();
- }
- }
-#endif // DEBUG
-
if (refType == RefTypeBB)
{
handledBlockEnd = false;
@@ -8014,12 +7983,6 @@ void LinearScan::allocateRegisters()
{
currentInterval = currentRefPosition->getInterval();
assignedRegister = currentInterval->physReg;
-#if DEBUG
- if (VERBOSE && !dumpTerse)
- {
- currentInterval->dump();
- }
-#endif // DEBUG
// Identify the special cases where we decide up-front not to allocate
bool allocate = true;
@@ -8442,11 +8405,11 @@ void LinearScan::allocateRegisters()
if (currentInterval->isConstant && (currentRefPosition->treeNode != nullptr) &&
currentRefPosition->treeNode->IsReuseRegVal())
{
- dumpLsraAllocationEvent(LSRA_EVENT_REUSE_REG, nullptr, assignedRegister, currentBlock);
+ dumpLsraAllocationEvent(LSRA_EVENT_REUSE_REG, currentInterval, assignedRegister, currentBlock);
}
else
{
- dumpLsraAllocationEvent(LSRA_EVENT_ALLOC_REG, nullptr, assignedRegister, currentBlock);
+ dumpLsraAllocationEvent(LSRA_EVENT_ALLOC_REG, currentInterval, assignedRegister, currentBlock);
}
}
}
@@ -8533,12 +8496,9 @@ void LinearScan::allocateRegisters()
#ifdef DEBUG
if (VERBOSE)
{
- if (dumpTerse)
- {
- // Dump the RegRecords after the last RefPosition is handled.
- dumpRegRecords();
- printf("\n");
- }
+ // Dump the RegRecords after the last RefPosition is handled.
+ dumpRegRecords();
+ printf("\n");
dumpRefPositions("AFTER ALLOCATION");
dumpVarRefPositions("AFTER ALLOCATION");
@@ -11022,7 +10982,7 @@ void LinearScan::resolveEdge(BasicBlock* fromBlock,
}
else
{
- compiler->codeGen->regSet.rsSetRegsModified(genRegMask(tempReg) DEBUGARG(dumpTerse));
+ compiler->codeGen->regSet.rsSetRegsModified(genRegMask(tempReg) DEBUGARG(true));
#ifdef _TARGET_ARM_
if (sourceIntervals[fromReg]->registerType == TYP_DOUBLE)
{
@@ -12130,358 +12090,173 @@ void LinearScan::dumpLsraAllocationEvent(LsraDumpEvent event,
{
return;
}
+ if ((interval != nullptr) && (reg != REG_NA) && (reg != REG_STK))
+ {
+ registersToDump |= genRegMask(reg);
+ dumpRegRecordTitleIfNeeded();
+ }
+
switch (event)
{
// Conflicting def/use
case LSRA_EVENT_DEFUSE_CONFLICT:
- if (!dumpTerse)
- {
- printf(" Def and Use have conflicting register requirements:");
- }
- else
- {
- printf("DUconflict ");
- dumpRegRecords();
- }
- break;
- case LSRA_EVENT_DEFUSE_FIXED_DELAY_USE:
- if (!dumpTerse)
- {
- printf(" Can't change useAssignment ");
- }
+ dumpRefPositionShort(activeRefPosition, currentBlock);
+ printf("DUconflict ");
+ dumpRegRecords();
break;
case LSRA_EVENT_DEFUSE_CASE1:
- if (!dumpTerse)
- {
- printf(" case #1, use the defRegAssignment\n");
- }
- else
- {
- printf(indentFormat, " case #1 use defRegAssignment");
- dumpRegRecords();
- dumpEmptyRefPosition();
- }
+ printf(indentFormat, " Case #1 use defRegAssignment");
+ dumpRegRecords();
break;
case LSRA_EVENT_DEFUSE_CASE2:
- if (!dumpTerse)
- {
- printf(" case #2, use the useRegAssignment\n");
- }
- else
- {
- printf(indentFormat, " case #2 use useRegAssignment");
- dumpRegRecords();
- dumpEmptyRefPosition();
- }
+ printf(indentFormat, " Case #2 use useRegAssignment");
+ dumpRegRecords();
break;
case LSRA_EVENT_DEFUSE_CASE3:
- if (!dumpTerse)
- {
- printf(" case #3, change the defRegAssignment to the use regs\n");
- }
- else
- {
- printf(indentFormat, " case #3 use useRegAssignment");
- dumpRegRecords();
- dumpEmptyRefPosition();
- }
+ printf(indentFormat, " Case #3 use useRegAssignment");
+ dumpRegRecords();
+ dumpRegRecords();
break;
case LSRA_EVENT_DEFUSE_CASE4:
- if (!dumpTerse)
- {
- printf(" case #4, change the useRegAssignment to the def regs\n");
- }
- else
- {
- printf(indentFormat, " case #4 use defRegAssignment");
- dumpRegRecords();
- dumpEmptyRefPosition();
- }
+ printf(indentFormat, " Case #4 use defRegAssignment");
+ dumpRegRecords();
break;
case LSRA_EVENT_DEFUSE_CASE5:
- if (!dumpTerse)
- {
- printf(" case #5, Conflicting Def and Use single-register requirements require copies - set def to all "
- "regs of the appropriate type\n");
- }
- else
- {
- printf(indentFormat, " case #5 set def to all regs");
- dumpRegRecords();
- dumpEmptyRefPosition();
- }
+ printf(indentFormat, " Case #5 set def to all regs");
+ dumpRegRecords();
break;
case LSRA_EVENT_DEFUSE_CASE6:
- if (!dumpTerse)
- {
- printf(" case #6, Conflicting Def and Use register requirements require a copy\n");
- }
- else
- {
- printf(indentFormat, " case #6 need a copy");
- dumpRegRecords();
- dumpEmptyRefPosition();
- }
+ printf(indentFormat, " Case #6 need a copy");
+ dumpRegRecords();
break;
case LSRA_EVENT_SPILL:
- if (!dumpTerse)
- {
- printf("Spilled:\n");
- interval->dump();
- }
- else
- {
- assert(interval != nullptr && interval->assignedReg != nullptr);
- printf("Spill %-4s ", getRegName(interval->assignedReg->regNum));
- dumpRegRecords();
- dumpEmptyRefPosition();
- }
- break;
- case LSRA_EVENT_SPILL_EXTENDED_LIFETIME:
- if (!dumpTerse)
- {
- printf(" Spilled extended lifetime var V%02u at last use; not marked for actual spill.",
- interval->intervalIndex);
- }
+ dumpRefPositionShort(activeRefPosition, currentBlock);
+ assert(interval != nullptr && interval->assignedReg != nullptr);
+ printf("Spill %-4s ", getRegName(interval->assignedReg->regNum));
+ dumpRegRecords();
break;
// Restoring the previous register
case LSRA_EVENT_RESTORE_PREVIOUS_INTERVAL_AFTER_SPILL:
assert(interval != nullptr);
- if (!dumpTerse)
- {
- printf(" Assign register %s to previous interval Ivl:%d after spill\n", getRegName(reg),
- interval->intervalIndex);
- }
- else
- {
- // If we spilled, then the dump is already pre-indented, but we need to pre-indent for the subsequent
- // allocation
- // with a dumpEmptyRefPosition().
- printf("SRstr %-4s ", getRegName(reg));
- dumpRegRecords();
- dumpEmptyRefPosition();
- }
+ dumpRefPositionShort(activeRefPosition, currentBlock);
+ printf("SRstr %-4s ", getRegName(reg));
+ dumpRegRecords();
break;
+
case LSRA_EVENT_RESTORE_PREVIOUS_INTERVAL:
assert(interval != nullptr);
- if (!dumpTerse)
+ if (activeRefPosition == nullptr)
{
- printf(" Assign register %s to previous interval Ivl:%d\n", getRegName(reg), interval->intervalIndex);
+ printf(emptyRefPositionFormat, "");
}
else
{
- if (activeRefPosition == nullptr)
- {
- printf(emptyRefPositionFormat, "");
- }
- printf("Restr %-4s ", getRegName(reg));
- dumpRegRecords();
- if (activeRefPosition != nullptr)
- {
- printf(emptyRefPositionFormat, "");
- }
+ dumpRefPositionShort(activeRefPosition, currentBlock);
+ }
+ printf("Restr %-4s ", getRegName(reg));
+ dumpRegRecords();
+ if (activeRefPosition != nullptr)
+ {
+ printf(emptyRefPositionFormat, "");
}
break;
// Done with GC Kills
case LSRA_EVENT_DONE_KILL_GC_REFS:
- printf("DoneKillGC ");
+ printf(indentFormat, " DoneKillGC ");
break;
// Block boundaries
case LSRA_EVENT_START_BB:
assert(currentBlock != nullptr);
- if (!dumpTerse)
- {
- printf("\n\n Live Vars(Regs) at start of BB%02u (from pred BB%02u):", currentBlock->bbNum,
- blockInfo[currentBlock->bbNum].predBBNum);
- dumpVarToRegMap(inVarToRegMaps[currentBlock->bbNum]);
- }
- break;
- case LSRA_EVENT_END_BB:
- if (!dumpTerse)
- {
- printf("\n\n Live Vars(Regs) after BB%02u:", currentBlock->bbNum);
- dumpVarToRegMap(outVarToRegMaps[currentBlock->bbNum]);
- }
+ dumpRefPositionShort(activeRefPosition, currentBlock);
break;
- case LSRA_EVENT_FREE_REGS:
- if (!dumpTerse)
- {
- printf("Freeing registers:\n");
- }
- break;
-
- // Characteristics of the current RefPosition
- case LSRA_EVENT_INCREMENT_RANGE_END:
- if (!dumpTerse)
- {
- printf(" Incrementing nextPhysRegLocation for %s\n", getRegName(reg));
- }
- // else ???
- break;
- case LSRA_EVENT_LAST_USE:
- if (!dumpTerse)
- {
- printf(" Last use, marked to be freed\n");
- }
- break;
- case LSRA_EVENT_LAST_USE_DELAYED:
- if (!dumpTerse)
- {
- printf(" Last use, marked to be freed (delayed)\n");
- }
- break;
+ // Allocation decisions
case LSRA_EVENT_NEEDS_NEW_REG:
- if (!dumpTerse)
- {
- printf(" Needs new register; mark %s to be freed\n", getRegName(reg));
- }
- else
- {
- printf("Free %-4s ", getRegName(reg));
- dumpRegRecords();
- dumpEmptyRefPosition();
- }
+ dumpRefPositionShort(activeRefPosition, currentBlock);
+ printf("Free %-4s ", getRegName(reg));
+ dumpRegRecords();
break;
- // Allocation decisions
- case LSRA_EVENT_FIXED_REG:
- case LSRA_EVENT_EXP_USE:
- if (!dumpTerse)
- {
- printf("No allocation\n");
- }
- else
- {
- printf("Keep %-4s ", getRegName(reg));
- }
- break;
case LSRA_EVENT_ZERO_REF:
assert(interval != nullptr && interval->isLocalVar);
- if (!dumpTerse)
- {
- printf("Marking V%02u as last use there are no actual references\n", interval->varNum);
- }
- else
- {
- printf("NoRef ");
- dumpRegRecords();
- dumpEmptyRefPosition();
- }
+ dumpRefPositionShort(activeRefPosition, currentBlock);
+ printf("NoRef ");
+ dumpRegRecords();
break;
+
+ case LSRA_EVENT_FIXED_REG:
+ case LSRA_EVENT_EXP_USE:
case LSRA_EVENT_KEPT_ALLOCATION:
- if (!dumpTerse)
- {
- printf("already allocated %4s\n", getRegName(reg));
- }
- else
- {
- printf("Keep %-4s ", getRegName(reg));
- }
+ dumpRefPositionShort(activeRefPosition, currentBlock);
+ printf("Keep %-4s ", getRegName(reg));
break;
+
case LSRA_EVENT_COPY_REG:
assert(interval != nullptr && interval->recentRefPosition != nullptr);
- if (!dumpTerse)
- {
- printf("allocated %s as copyReg\n\n", getRegName(reg));
- }
- else
- {
- printf("Copy %-4s ", getRegName(reg));
- }
+ dumpRefPositionShort(activeRefPosition, currentBlock);
+ printf("Copy %-4s ", getRegName(reg));
break;
+
case LSRA_EVENT_MOVE_REG:
assert(interval != nullptr && interval->recentRefPosition != nullptr);
- if (!dumpTerse)
- {
- printf(" needs a new register; marked as moveReg\n");
- }
- else
- {
- printf("Move %-4s ", getRegName(reg));
- dumpRegRecords();
- dumpEmptyRefPosition();
- }
+ dumpRefPositionShort(activeRefPosition, currentBlock);
+ printf("Move %-4s ", getRegName(reg));
+ dumpRegRecords();
break;
+
case LSRA_EVENT_ALLOC_REG:
- if (!dumpTerse)
- {
- printf("allocated %s\n", getRegName(reg));
- }
- else
- {
- printf("Alloc %-4s ", getRegName(reg));
- }
+ dumpRefPositionShort(activeRefPosition, currentBlock);
+ printf("Alloc %-4s ", getRegName(reg));
break;
+
case LSRA_EVENT_REUSE_REG:
- if (!dumpTerse)
- {
- printf("reused constant in %s\n", getRegName(reg));
- }
- else
- {
- printf("Reuse %-4s ", getRegName(reg));
- }
+ dumpRefPositionShort(activeRefPosition, currentBlock);
+ printf("Reuse %-4s ", getRegName(reg));
break;
+
case LSRA_EVENT_ALLOC_SPILLED_REG:
- if (!dumpTerse)
- {
- printf("allocated spilled register %s\n", getRegName(reg));
- }
- else
- {
- printf("Steal %-4s ", getRegName(reg));
- }
+ dumpRefPositionShort(activeRefPosition, currentBlock);
+ printf("Steal %-4s ", getRegName(reg));
break;
+
case LSRA_EVENT_NO_ENTRY_REG_ALLOCATED:
assert(interval != nullptr && interval->isLocalVar);
- if (!dumpTerse)
- {
- printf("Not allocating an entry register for V%02u due to low ref count\n", interval->varNum);
- }
- else
- {
- printf("LoRef ");
- }
+ dumpRefPositionShort(activeRefPosition, currentBlock);
+ printf("LoRef ");
break;
+
case LSRA_EVENT_NO_REG_ALLOCATED:
- if (!dumpTerse)
- {
- printf("no register allocated\n");
- }
- else
- {
- printf("NoReg ");
- }
+ dumpRefPositionShort(activeRefPosition, currentBlock);
+ printf("NoReg ");
break;
+
case LSRA_EVENT_RELOAD:
- if (!dumpTerse)
- {
- printf(" Marked for reload\n");
- }
- else
- {
- printf("ReLod %-4s ", getRegName(reg));
- dumpRegRecords();
- dumpEmptyRefPosition();
- }
+ dumpRefPositionShort(activeRefPosition, currentBlock);
+ printf("ReLod %-4s ", getRegName(reg));
+ dumpRegRecords();
break;
+
case LSRA_EVENT_SPECIAL_PUTARG:
- if (!dumpTerse)
- {
- printf(" Special case of putArg - using lclVar that's in the expected reg\n");
- }
- else
- {
- printf("PtArg %-4s ", getRegName(reg));
- }
+ dumpRefPositionShort(activeRefPosition, currentBlock);
+ printf("PtArg %-4s ", getRegName(reg));
break;
- default:
+
+ // We currently don't dump anything for these events.
+ case LSRA_EVENT_DEFUSE_FIXED_DELAY_USE:
+ case LSRA_EVENT_SPILL_EXTENDED_LIFETIME:
+ case LSRA_EVENT_END_BB:
+ case LSRA_EVENT_FREE_REGS:
+ case LSRA_EVENT_INCREMENT_RANGE_END:
+ case LSRA_EVENT_LAST_USE:
+ case LSRA_EVENT_LAST_USE_DELAYED:
break;
+
+ default:
+ unreached();
}
}
@@ -12601,23 +12376,27 @@ void LinearScan::dumpRegRecordHeader()
sprintf_s(legendFormat, MAX_LEGEND_FORMAT_CHARS, "%%-%d.%ds%%-%d.%ds%%-%ds%%s", nodeLocationWidth + 1,
nodeLocationWidth + 1, refPositionWidth + 2, refPositionWidth + 2, regColumnWidth + 1);
- // Finally, print a "title row" including the legend and the reg names
- dumpRegRecordTitle();
+ // Print a "title row" including the legend and the reg names.
+ lastDumpedRegisters = RBM_NONE;
+ dumpRegRecordTitleIfNeeded();
}
-int LinearScan::getLastUsedRegNumIndex()
+void LinearScan::dumpRegRecordTitleIfNeeded()
{
- int lastUsedRegNumIndex = 0;
- regMaskTP usedRegsMask = compiler->codeGen->regSet.rsGetModifiedRegsMask();
- int lastRegNumIndex = compiler->compFloatingPointUsed ? REG_FP_LAST : REG_INT_LAST;
- for (int regNumIndex = 0; regNumIndex <= lastRegNumIndex; regNumIndex++)
+ if ((lastDumpedRegisters != registersToDump) || (rowCountSinceLastTitle > MAX_ROWS_BETWEEN_TITLES))
{
- if ((usedRegsMask & genRegMask((regNumber)regNumIndex)) != 0)
+ lastUsedRegNumIndex = 0;
+ int lastRegNumIndex = compiler->compFloatingPointUsed ? REG_FP_LAST : REG_INT_LAST;
+ for (int regNumIndex = 0; regNumIndex <= lastRegNumIndex; regNumIndex++)
{
- lastUsedRegNumIndex = regNumIndex;
+ if ((registersToDump & genRegMask((regNumber)regNumIndex)) != 0)
+ {
+ lastUsedRegNumIndex = regNumIndex;
+ }
}
+ dumpRegRecordTitle();
+ lastDumpedRegisters = registersToDump;
}
- return lastUsedRegNumIndex;
}
void LinearScan::dumpRegRecordTitleLines()
@@ -12626,13 +12405,16 @@ void LinearScan::dumpRegRecordTitleLines()
{
printf("%s", line);
}
- int lastUsedRegNumIndex = getLastUsedRegNumIndex();
for (int regNumIndex = 0; regNumIndex <= lastUsedRegNumIndex; regNumIndex++)
{
- printf("%s", middleBox);
- for (int i = 0; i < regColumnWidth; i++)
+ regNumber regNum = (regNumber)regNumIndex;
+ if (shouldDumpReg(regNum))
{
- printf("%s", line);
+ printf("%s", middleBox);
+ for (int i = 0; i < regColumnWidth; i++)
+ {
+ printf("%s", line);
+ }
}
}
printf("%s\n", rightBox);
@@ -12647,12 +12429,14 @@ void LinearScan::dumpRegRecordTitle()
// Print out the register name column headers
char columnFormatArray[MAX_FORMAT_CHARS];
sprintf_s(columnFormatArray, MAX_FORMAT_CHARS, "%s%%-%d.%ds", columnSeparator, regColumnWidth, regColumnWidth);
- int lastUsedRegNumIndex = getLastUsedRegNumIndex();
for (int regNumIndex = 0; regNumIndex <= lastUsedRegNumIndex; regNumIndex++)
{
- regNumber regNum = (regNumber)regNumIndex;
- const char* regName = getRegName(regNum);
- printf(columnFormatArray, regName);
+ regNumber regNum = (regNumber)regNumIndex;
+ if (shouldDumpReg(regNum))
+ {
+ const char* regName = getRegName(regNum);
+ printf(columnFormatArray, regName);
+ }
}
printf("%s\n", columnSeparator);
@@ -12664,41 +12448,32 @@ void LinearScan::dumpRegRecordTitle()
void LinearScan::dumpRegRecords()
{
static char columnFormatArray[18];
- int lastUsedRegNumIndex = getLastUsedRegNumIndex();
- regMaskTP usedRegsMask = compiler->codeGen->regSet.rsGetModifiedRegsMask();
for (int regNumIndex = 0; regNumIndex <= lastUsedRegNumIndex; regNumIndex++)
{
- printf("%s", columnSeparator);
- RegRecord& regRecord = physRegs[regNumIndex];
- Interval* interval = regRecord.assignedInterval;
- if (interval != nullptr)
- {
- dumpIntervalName(interval);
- char activeChar = interval->isActive ? 'a' : 'i';
- printf("%c", activeChar);
- }
- else if (regRecord.isBusyUntilNextKill)
- {
- printf(columnFormatArray, "Busy");
- }
- else if ((usedRegsMask & genRegMask((regNumber)regNumIndex)) == 0)
+ if (shouldDumpReg((regNumber)regNumIndex))
{
- sprintf_s(columnFormatArray, MAX_FORMAT_CHARS, "%%-%ds", regColumnWidth);
- printf(columnFormatArray, "----");
- }
- else
- {
- sprintf_s(columnFormatArray, MAX_FORMAT_CHARS, "%%-%ds", regColumnWidth);
- printf(columnFormatArray, "");
+ printf("%s", columnSeparator);
+ RegRecord& regRecord = physRegs[regNumIndex];
+ Interval* interval = regRecord.assignedInterval;
+ if (interval != nullptr)
+ {
+ dumpIntervalName(interval);
+ char activeChar = interval->isActive ? 'a' : 'i';
+ printf("%c", activeChar);
+ }
+ else if (regRecord.isBusyUntilNextKill)
+ {
+ printf(columnFormatArray, "Busy");
+ }
+ else
+ {
+ sprintf_s(columnFormatArray, MAX_FORMAT_CHARS, "%%-%ds", regColumnWidth);
+ printf(columnFormatArray, "");
+ }
}
}
printf("%s\n", columnSeparator);
-
- if (rowCountSinceLastTitle > MAX_ROWS_BETWEEN_TITLES)
- {
- dumpRegRecordTitle();
- }
rowCountSinceLastTitle++;
}
@@ -12727,7 +12502,14 @@ void LinearScan::dumpEmptyRefPosition()
//
void LinearScan::dumpRefPositionShort(RefPosition* refPosition, BasicBlock* currentBlock)
{
- BasicBlock* block = currentBlock;
+ BasicBlock* block = currentBlock;
+ static RefPosition* lastPrintedRefPosition = nullptr;
+ if (refPosition == lastPrintedRefPosition)
+ {
+ dumpEmptyRefPosition();
+ return;
+ }
+ lastPrintedRefPosition = refPosition;
if (refPosition->refType == RefTypeBB)
{
// Always print a title row before a RefTypeBB (except for the first, because we
@@ -12886,18 +12668,15 @@ void LinearScan::verifyFinalAllocation()
Interval* interval = nullptr;
RegRecord* regRecord = nullptr;
regNumber regNum = REG_NA;
+ activeRefPosition = currentRefPosition;
+
if (currentRefPosition->refType == RefTypeBB)
{
regsToFree |= delayRegsToFree;
delayRegsToFree = RBM_NONE;
- // For BB RefPositions, wait until we dump the "end of block" info before dumping the basic RefPosition
- // info.
}
else
{
- // For other RefPosition types, we can dump the basic RefPosition info now.
- DBEXEC(VERBOSE, dumpRefPositionShort(currentRefPosition, currentBlock));
-
if (currentRefPosition->isPhysRegRef)
{
regRecord = currentRefPosition->getReg();
diff --git a/src/jit/lsra.h b/src/jit/lsra.h
index 65a23b3ca6..00ce7ee9d2 100644
--- a/src/jit/lsra.h
+++ b/src/jit/lsra.h
@@ -951,8 +951,7 @@ private:
unsigned fromBBNum;
unsigned toBBNum;
};
- typedef SimplerHashTable<unsigned, SmallPrimitiveKeyFuncs<unsigned>, SplitEdgeInfo, JitSimplerHashBehavior>
- SplitBBNumToTargetBBNumMap;
+ typedef JitHashTable<unsigned, JitSmallPrimitiveKeyFuncs<unsigned>, SplitEdgeInfo> SplitBBNumToTargetBBNumMap;
SplitBBNumToTargetBBNumMap* splitBBNumToTargetBBNumMap;
SplitBBNumToTargetBBNumMap* getSplitBBNumToTargetBBNumMap()
{
@@ -1004,7 +1003,6 @@ private:
GenTree* operand, bool& first, LsraTupleDumpMode mode, char* operandString, const unsigned operandStringLength);
void TupleStyleDump(LsraTupleDumpMode mode);
- bool dumpTerse;
LsraLocation maxNodeLocation;
// Width of various fields - used to create a streamlined dump during allocation that shows the
@@ -1031,11 +1029,19 @@ private:
// How many rows have we printed since last printing a "title row"?
static const int MAX_ROWS_BETWEEN_TITLES = 50;
int rowCountSinceLastTitle;
+ // Current mask of registers being printed in the dump.
+ regMaskTP lastDumpedRegisters;
+ regMaskTP registersToDump;
+ int lastUsedRegNumIndex;
+ bool shouldDumpReg(regNumber regNum)
+ {
+ return (registersToDump & genRegMask(regNum)) != 0;
+ }
void dumpRegRecordHeader();
void dumpRegRecordTitle();
+ void dumpRegRecordTitleIfNeeded();
void dumpRegRecordTitleLines();
- int getLastUsedRegNumIndex();
void dumpRegRecords();
// An abbreviated RefPosition dump for printing with column-based register state
void dumpRefPositionShort(RefPosition* refPosition, BasicBlock* currentBlock);
@@ -1044,8 +1050,7 @@ private:
// A dump of Referent, in exactly regColumnWidth characters
void dumpIntervalName(Interval* interval);
- // Events during the allocation phase that cause some dump output, which differs depending
- // upon whether dumpTerse is set:
+ // Events during the allocation phase that cause some dump output
enum LsraDumpEvent{
// Conflicting def/use
LSRA_EVENT_DEFUSE_CONFLICT, LSRA_EVENT_DEFUSE_FIXED_DELAY_USE, LSRA_EVENT_DEFUSE_CASE1, LSRA_EVENT_DEFUSE_CASE2,
@@ -1100,17 +1105,17 @@ private:
private:
#if MEASURE_MEM_ALLOC
- IAllocator* lsraIAllocator;
+ CompAllocator* lsraAllocator;
#endif
- IAllocator* getAllocator(Compiler* comp)
+ CompAllocator* getAllocator(Compiler* comp)
{
#if MEASURE_MEM_ALLOC
- if (lsraIAllocator == nullptr)
+ if (lsraAllocator == nullptr)
{
- lsraIAllocator = new (comp, CMK_LSRA) CompAllocator(comp, CMK_LSRA);
+ lsraAllocator = new (comp, CMK_LSRA) CompAllocator(comp, CMK_LSRA);
}
- return lsraIAllocator;
+ return lsraAllocator;
#else
return comp->getAllocator();
#endif
diff --git a/src/jit/lsraarmarch.cpp b/src/jit/lsraarmarch.cpp
index b13362d5be..74f063c4b0 100644
--- a/src/jit/lsraarmarch.cpp
+++ b/src/jit/lsraarmarch.cpp
@@ -216,6 +216,18 @@ void LinearScan::TreeNodeInfoInitIndir(GenTreeIndir* indirTree)
info->internalIntCount++;
}
}
+
+#ifdef FEATURE_SIMD
+ if (indirTree->TypeGet() == TYP_SIMD12)
+ {
+ // If indirTree is of TYP_SIMD12, addr is not contained. See comment in LowerIndir().
+ assert(!indirTree->Addr()->isContained());
+
+ // Vector3 is read/written as two reads/writes: 8 byte and 4 byte.
+ // To assemble the vector properly we would need an additional int register
+ info->internalIntCount = 1;
+ }
+#endif // FEATURE_SIMD
}
//------------------------------------------------------------------------
diff --git a/src/jit/morph.cpp b/src/jit/morph.cpp
index a881d34dfb..6a421c60a3 100644
--- a/src/jit/morph.cpp
+++ b/src/jit/morph.cpp
@@ -4788,7 +4788,7 @@ void Compiler::fgMorphMultiregStructArgs(GenTreeCall* call)
GenTreePtr arg = argx;
- if (arg->TypeGet() == TYP_STRUCT)
+ if (varTypeIsStruct(arg->TypeGet()))
{
foundStructArg = true;
@@ -4843,7 +4843,7 @@ void Compiler::fgMorphMultiregStructArgs(GenTreeCall* call)
//
GenTreePtr Compiler::fgMorphMultiregStructArg(GenTreePtr arg, fgArgTabEntryPtr fgEntryPtr)
{
- assert(arg->TypeGet() == TYP_STRUCT);
+ assert(varTypeIsStruct(arg->TypeGet()));
#ifndef _TARGET_ARMARCH_
NYI("fgMorphMultiregStructArg requires implementation for this target");
@@ -4990,7 +4990,7 @@ GenTreePtr Compiler::fgMorphMultiregStructArg(GenTreePtr arg, fgArgTabEntryPtr f
}
}
// We should still have a TYP_STRUCT
- assert(argValue->TypeGet() == TYP_STRUCT);
+ assert(varTypeIsStruct(argValue->TypeGet()));
GenTreeFieldList* newArg = nullptr;
@@ -11253,6 +11253,8 @@ GenTree* Compiler::fgMorphRecognizeBoxNullable(GenTree* compare)
compare->gtOp.gtOp2 = newOp;
}
+ opCns->gtType = TYP_INT;
+
return compare;
}
diff --git a/src/jit/optimizer.cpp b/src/jit/optimizer.cpp
index 87221fde58..54ab3b5560 100644
--- a/src/jit/optimizer.cpp
+++ b/src/jit/optimizer.cpp
@@ -4624,8 +4624,8 @@ bool Compiler::optDeriveLoopCloningConditions(unsigned loopNum, LoopCloneContext
JITDUMP("------------------------------------------------------------\n");
JITDUMP("Deriving cloning conditions for L%02u\n", loopNum);
- LoopDsc* loop = &optLoopTable[loopNum];
- ExpandArrayStack<LcOptInfo*>* optInfos = context->GetLoopOptInfo(loopNum);
+ LoopDsc* loop = &optLoopTable[loopNum];
+ JitExpandArrayStack<LcOptInfo*>* optInfos = context->GetLoopOptInfo(loopNum);
if (loop->lpTestOper() == GT_LT)
{
@@ -4669,7 +4669,7 @@ bool Compiler::optDeriveLoopCloningConditions(unsigned loopNum, LoopCloneContext
JITDUMP("> limit %d is invalid\n", limit);
return false;
}
- ident = LC_Ident(limit, LC_Ident::Const);
+ ident = LC_Ident(static_cast<unsigned>(limit), LC_Ident::Const);
}
else if (loop->lpFlags & LPFLG_VAR_LIMIT)
{
@@ -4852,11 +4852,11 @@ bool Compiler::optDeriveLoopCloningConditions(unsigned loopNum, LoopCloneContext
//
bool Compiler::optComputeDerefConditions(unsigned loopNum, LoopCloneContext* context)
{
- ExpandArrayStack<LC_Deref*> nodes(getAllocator());
- int maxRank = -1;
+ JitExpandArrayStack<LC_Deref*> nodes(getAllocator());
+ int maxRank = -1;
// Get the dereference-able arrays.
- ExpandArrayStack<LC_Array>* deref = context->EnsureDerefs(loopNum);
+ JitExpandArrayStack<LC_Array>* deref = context->EnsureDerefs(loopNum);
// For each array in the dereference list, construct a tree,
// where the nodes are array and index variables and an edge 'u-v'
@@ -4927,7 +4927,8 @@ bool Compiler::optComputeDerefConditions(unsigned loopNum, LoopCloneContext* con
}
// Derive conditions into an 'array of level x array of conditions' i.e., levelCond[levels][conds]
- ExpandArrayStack<ExpandArrayStack<LC_Condition>*>* levelCond = context->EnsureBlockConditions(loopNum, condBlocks);
+ JitExpandArrayStack<JitExpandArrayStack<LC_Condition>*>* levelCond =
+ context->EnsureBlockConditions(loopNum, condBlocks);
for (unsigned i = 0; i < nodes.Size(); ++i)
{
nodes[i]->DeriveLevelConditions(levelCond);
@@ -4983,7 +4984,7 @@ void Compiler::optDebugLogLoopCloning(BasicBlock* block, GenTreePtr insertBefore
//
void Compiler::optPerformStaticOptimizations(unsigned loopNum, LoopCloneContext* context DEBUGARG(bool dynamicPath))
{
- ExpandArrayStack<LcOptInfo*>* optInfos = context->GetLoopOptInfo(loopNum);
+ JitExpandArrayStack<LcOptInfo*>* optInfos = context->GetLoopOptInfo(loopNum);
for (unsigned i = 0; i < optInfos->Size(); ++i)
{
LcOptInfo* optInfo = optInfos->GetRef(i);
@@ -5133,7 +5134,7 @@ void Compiler::optCloneLoops()
// For each loop, derive cloning conditions for the optimization candidates.
for (unsigned i = 0; i < optLoopCount; ++i)
{
- ExpandArrayStack<LcOptInfo*>* optInfos = context.GetLoopOptInfo(i);
+ JitExpandArrayStack<LcOptInfo*>* optInfos = context.GetLoopOptInfo(i);
if (optInfos == nullptr)
{
continue;
@@ -5457,8 +5458,8 @@ BasicBlock* Compiler::optInsertLoopChoiceConditions(LoopCloneContext* context,
JITDUMP("Inserting loop cloning conditions\n");
assert(context->HasBlockConditions(loopNum));
- BasicBlock* curCond = head;
- ExpandArrayStack<ExpandArrayStack<LC_Condition>*>* levelCond = context->GetBlockConditions(loopNum);
+ BasicBlock* curCond = head;
+ JitExpandArrayStack<JitExpandArrayStack<LC_Condition>*>* levelCond = context->GetBlockConditions(loopNum);
for (unsigned i = 0; i < levelCond->Size(); ++i)
{
bool isHeaderBlock = (curCond == head);
@@ -6648,7 +6649,7 @@ void Compiler::optHoistThisLoop(unsigned lnum, LoopHoistContext* hoistCtxt)
// Find the set of definitely-executed blocks.
// Ideally, the definitely-executed blocks are the ones that post-dominate the entry block.
// Until we have post-dominators, we'll special-case for single-exit blocks.
- ExpandArrayStack<BasicBlock*> defExec(getAllocatorLoopHoist());
+ JitExpandArrayStack<BasicBlock*> defExec(getAllocatorLoopHoist());
if (pLoopDsc->lpFlags & LPFLG_ONE_EXIT)
{
assert(pLoopDsc->lpExit != nullptr);
diff --git a/src/jit/rangecheck.cpp b/src/jit/rangecheck.cpp
index 6dd2956811..337e99e4dc 100644
--- a/src/jit/rangecheck.cpp
+++ b/src/jit/rangecheck.cpp
@@ -17,9 +17,11 @@ static const int MAX_VISIT_BUDGET = 8192;
RangeCheck::RangeCheck(Compiler* pCompiler)
: m_pOverflowMap(nullptr)
, m_pRangeMap(nullptr)
+ , m_pSearchPath(nullptr)
, m_fMappedDefs(false)
, m_pDefTable(nullptr)
, m_pCompiler(pCompiler)
+ , m_alloc(pCompiler, CMK_RangeCheck)
, m_nVisitBudget(MAX_VISIT_BUDGET)
{
}
@@ -34,7 +36,7 @@ RangeCheck::RangeMap* RangeCheck::GetRangeMap()
{
if (m_pRangeMap == nullptr)
{
- m_pRangeMap = new (m_pCompiler->getAllocator()) RangeMap(m_pCompiler->getAllocator());
+ m_pRangeMap = new (&m_alloc) RangeMap(&m_alloc);
}
return m_pRangeMap;
}
@@ -44,7 +46,7 @@ RangeCheck::OverflowMap* RangeCheck::GetOverflowMap()
{
if (m_pOverflowMap == nullptr)
{
- m_pOverflowMap = new (m_pCompiler->getAllocator()) OverflowMap(m_pCompiler->getAllocator());
+ m_pOverflowMap = new (&m_alloc) OverflowMap(&m_alloc);
}
return m_pOverflowMap;
}
@@ -233,7 +235,7 @@ void RangeCheck::OptimizeRangeCheck(BasicBlock* block, GenTreePtr stmt, GenTreeP
}
JITDUMP("ArrSize for lengthVN:%03X = %d\n", arrLenVn, arrSize);
- if (m_pCompiler->vnStore->IsVNConstant(idxVn) && arrSize > 0)
+ if (m_pCompiler->vnStore->IsVNConstant(idxVn) && (arrSize > 0))
{
ssize_t idxVal = -1;
unsigned iconFlags = 0;
@@ -244,7 +246,7 @@ void RangeCheck::OptimizeRangeCheck(BasicBlock* block, GenTreePtr stmt, GenTreeP
JITDUMP("[RangeCheck::OptimizeRangeCheck] Is index %d in <0, arrLenVn VN%X sz:%d>.\n", idxVal, arrLenVn,
arrSize);
- if (arrSize > 0 && idxVal < arrSize && idxVal >= 0)
+ if ((idxVal < arrSize) && (idxVal >= 0))
{
JITDUMP("Removing range check\n");
m_pCompiler->optRemoveRangeCheck(treeParent, stmt);
@@ -254,11 +256,10 @@ void RangeCheck::OptimizeRangeCheck(BasicBlock* block, GenTreePtr stmt, GenTreeP
GetRangeMap()->RemoveAll();
GetOverflowMap()->RemoveAll();
+ m_pSearchPath = new (&m_alloc) SearchPath(&m_alloc);
// Get the range for this index.
- SearchPath* path = new (m_pCompiler->getAllocator()) SearchPath(m_pCompiler->getAllocator());
-
- Range range = GetRange(block, stmt, treeIndex, path, false DEBUGARG(0));
+ Range range = GetRange(block, treeIndex, false DEBUGARG(0));
// If upper or lower limit is found to be unknown (top), or it was found to
// be unknown because of over budget or a deep search, then return early.
@@ -269,15 +270,15 @@ void RangeCheck::OptimizeRangeCheck(BasicBlock* block, GenTreePtr stmt, GenTreeP
return;
}
- if (DoesOverflow(block, stmt, treeIndex, path))
+ if (DoesOverflow(block, treeIndex))
{
JITDUMP("Method determined to overflow.\n");
return;
}
JITDUMP("Range value %s\n", range.ToString(m_pCompiler->getAllocatorDebugOnly()));
- path->RemoveAll();
- Widen(block, stmt, treeIndex, path, &range);
+ m_pSearchPath->RemoveAll();
+ Widen(block, treeIndex, &range);
// If upper or lower limit is unknown, then return.
if (range.UpperLimit().IsUnknown() || range.LowerLimit().IsUnknown())
@@ -294,7 +295,7 @@ void RangeCheck::OptimizeRangeCheck(BasicBlock* block, GenTreePtr stmt, GenTreeP
return;
}
-void RangeCheck::Widen(BasicBlock* block, GenTreePtr stmt, GenTreePtr tree, SearchPath* path, Range* pRange)
+void RangeCheck::Widen(BasicBlock* block, GenTreePtr tree, Range* pRange)
{
#ifdef DEBUG
if (m_pCompiler->verbose)
@@ -311,18 +312,27 @@ void RangeCheck::Widen(BasicBlock* block, GenTreePtr stmt, GenTreePtr tree, Sear
if (range.LowerLimit().IsDependent() || range.LowerLimit().IsUnknown())
{
// To determine the lower bound, ask if the loop increases monotonically.
- bool increasing = IsMonotonicallyIncreasing(tree, path);
+ bool increasing = IsMonotonicallyIncreasing(tree);
JITDUMP("IsMonotonicallyIncreasing %d", increasing);
if (increasing)
{
GetRangeMap()->RemoveAll();
- *pRange = GetRange(block, stmt, tree, path, true DEBUGARG(0));
+ *pRange = GetRange(block, tree, true DEBUGARG(0));
}
}
}
-bool RangeCheck::IsBinOpMonotonicallyIncreasing(GenTreePtr op1, GenTreePtr op2, genTreeOps oper, SearchPath* path)
+bool RangeCheck::IsBinOpMonotonicallyIncreasing(GenTreeOp* binop)
{
+#ifdef LEGACY_BACKEND
+ assert(binop->OperIs(GT_ADD, GT_ASG_ADD));
+#else
+ assert(binop->OperIs(GT_ADD));
+#endif
+
+ GenTree* op1 = binop->gtGetOp1();
+ GenTree* op2 = binop->gtGetOp2();
+
JITDUMP("[RangeCheck::IsBinOpMonotonicallyIncreasing] [%06d], [%06d]\n", Compiler::dspTreeID(op1),
Compiler::dspTreeID(op2));
// Check if we have a var + const.
@@ -338,10 +348,10 @@ bool RangeCheck::IsBinOpMonotonicallyIncreasing(GenTreePtr op1, GenTreePtr op2,
switch (op2->OperGet())
{
case GT_LCL_VAR:
- return IsMonotonicallyIncreasing(op1, path) && IsMonotonicallyIncreasing(op2, path);
+ return IsMonotonicallyIncreasing(op1) && IsMonotonicallyIncreasing(op2);
case GT_CNS_INT:
- return oper == GT_ADD && op2->AsIntConCommon()->IconValue() >= 0 && IsMonotonicallyIncreasing(op1, path);
+ return (op2->AsIntConCommon()->IconValue() >= 0) && IsMonotonicallyIncreasing(op1);
default:
JITDUMP("Not monotonic because expression is not recognized.\n");
@@ -349,36 +359,35 @@ bool RangeCheck::IsBinOpMonotonicallyIncreasing(GenTreePtr op1, GenTreePtr op2,
}
}
-bool RangeCheck::IsMonotonicallyIncreasing(GenTreePtr expr, SearchPath* path)
+bool RangeCheck::IsMonotonicallyIncreasing(GenTreePtr expr)
{
JITDUMP("[RangeCheck::IsMonotonicallyIncreasing] [%06d]\n", Compiler::dspTreeID(expr));
- if (path->Lookup(expr))
+
+ // Add hashtable entry for expr.
+ bool alreadyPresent = m_pSearchPath->Set(expr, nullptr);
+ if (alreadyPresent)
{
return true;
}
- // Add hashtable entry for expr.
- path->Set(expr, nullptr);
-
// Remove hashtable entry for expr when we exit the present scope.
- auto code = [&] { path->Remove(expr); };
+ auto code = [this, expr] { m_pSearchPath->Remove(expr); };
jitstd::utility::scoped_code<decltype(code)> finally(code);
- // If the rhs expr is constant, then it is not part of the dependency
- // loop which has to increase monotonically.
- ValueNum vn = expr->gtVNPair.GetConservative();
- if (path->GetCount() > MAX_SEARCH_DEPTH)
+ if (m_pSearchPath->GetCount() > MAX_SEARCH_DEPTH)
{
return false;
}
- else if (m_pCompiler->vnStore->IsVNConstant(vn))
+ // If expr is constant, then it is not part of the dependency
+ // loop which has to increase monotonically.
+ else if (m_pCompiler->vnStore->IsVNConstant(expr->gtVNPair.GetConservative()))
{
return true;
}
// If the rhs expr is local, then try to find the def of the local.
else if (expr->IsLocal())
{
- Location* loc = GetDef(expr);
+ Location* loc = GetDef(expr->AsLclVarCommon());
if (loc == nullptr)
{
return false;
@@ -388,11 +397,11 @@ bool RangeCheck::IsMonotonicallyIncreasing(GenTreePtr expr, SearchPath* path)
switch (asg->OperGet())
{
case GT_ASG:
- return IsMonotonicallyIncreasing(asg->gtGetOp2(), path);
+ return IsMonotonicallyIncreasing(asg->gtGetOp2());
#ifdef LEGACY_BACKEND
case GT_ASG_ADD:
- return IsBinOpMonotonicallyIncreasing(asg->gtGetOp1(), asg->gtGetOp2(), GT_ADD, path);
+ return IsBinOpMonotonicallyIncreasing(asg->AsOp());
#endif
default:
@@ -407,18 +416,18 @@ bool RangeCheck::IsMonotonicallyIncreasing(GenTreePtr expr, SearchPath* path)
}
else if (expr->OperGet() == GT_ADD)
{
- return IsBinOpMonotonicallyIncreasing(expr->gtGetOp1(), expr->gtGetOp2(), GT_ADD, path);
+ return IsBinOpMonotonicallyIncreasing(expr->AsOp());
}
else if (expr->OperGet() == GT_PHI)
{
for (GenTreeArgList* args = expr->gtOp.gtOp1->AsArgList(); args != nullptr; args = args->Rest())
{
// If the arg is already in the path, skip.
- if (path->Lookup(args->Current()))
+ if (m_pSearchPath->Lookup(args->Current()))
{
continue;
}
- if (!IsMonotonicallyIncreasing(args->Current(), path))
+ if (!IsMonotonicallyIncreasing(args->Current()))
{
JITDUMP("Phi argument not monotonic\n");
return false;
@@ -457,12 +466,9 @@ RangeCheck::Location* RangeCheck::GetDef(unsigned lclNum, unsigned ssaNum)
return loc;
}
-RangeCheck::Location* RangeCheck::GetDef(GenTreePtr tree)
+RangeCheck::Location* RangeCheck::GetDef(GenTreeLclVarCommon* lcl)
{
- assert(tree->IsLocal());
- unsigned lclNum = tree->AsLclVarCommon()->GetLclNum();
- unsigned ssaNum = tree->AsLclVarCommon()->GetSsaNum();
- return GetDef(lclNum, ssaNum);
+ return GetDef(lcl->GetLclNum(), lcl->GetSsaNum());
}
// Add the def location to the hash table.
@@ -470,7 +476,7 @@ void RangeCheck::SetDef(UINT64 hash, Location* loc)
{
if (m_pDefTable == nullptr)
{
- m_pDefTable = new (m_pCompiler->getAllocator()) VarToLocMap(m_pCompiler->getAllocator());
+ m_pDefTable = new (&m_alloc) VarToLocMap(&m_alloc);
}
#ifdef DEBUG
Location* loc2;
@@ -485,14 +491,13 @@ void RangeCheck::SetDef(UINT64 hash, Location* loc)
}
// Merge assertions on the edge flowing into the block about a variable.
-void RangeCheck::MergeEdgeAssertions(GenTreePtr tree, ASSERT_VALARG_TP assertions, Range* pRange)
+void RangeCheck::MergeEdgeAssertions(GenTreeLclVarCommon* lcl, ASSERT_VALARG_TP assertions, Range* pRange)
{
if (BitVecOps::IsEmpty(m_pCompiler->apTraits, assertions))
{
return;
}
- GenTreeLclVarCommon* lcl = (GenTreeLclVarCommon*)tree;
if (lcl->gtSsaNum == SsaConfig::RESERVED_SSA_NUM)
{
return;
@@ -506,24 +511,6 @@ void RangeCheck::MergeEdgeAssertions(GenTreePtr tree, ASSERT_VALARG_TP assertion
Compiler::AssertionDsc* curAssertion = m_pCompiler->optGetAssertion(assertionIndex);
- // Current assertion is about compare against constant or checked bound.
- if (!curAssertion->IsCheckedBoundArithBound() && !curAssertion->IsCheckedBoundBound() &&
- !curAssertion->IsConstantBound())
- {
- continue;
- }
-
-#ifdef DEBUG
- if (m_pCompiler->verbose)
- {
- m_pCompiler->optPrintAssertion(curAssertion, assertionIndex);
- }
-#endif
-
- assert(m_pCompiler->vnStore->IsVNCompareCheckedBoundArith(curAssertion->op1.vn) ||
- m_pCompiler->vnStore->IsVNCompareCheckedBound(curAssertion->op1.vn) ||
- m_pCompiler->vnStore->IsVNConstantBound(curAssertion->op1.vn));
-
Limit limit(Limit::keUndef);
genTreeOps cmpOper = GT_NONE;
@@ -541,23 +528,20 @@ void RangeCheck::MergeEdgeAssertions(GenTreePtr tree, ASSERT_VALARG_TP assertion
continue;
}
- switch (info.arrOper)
+ if ((info.arrOper != GT_ADD) && (info.arrOper != GT_SUB))
{
- case GT_SUB:
- case GT_ADD:
- {
- // If the operand that operates on the bound is not constant, then done.
- if (!m_pCompiler->vnStore->IsVNConstant(info.arrOp) ||
- m_pCompiler->vnStore->TypeOfVN(info.arrOp) != TYP_INT)
- {
- break;
- }
- int cons = m_pCompiler->vnStore->ConstantValue<int>(info.arrOp);
- limit = Limit(Limit::keBinOpArray, info.vnBound, info.arrOper == GT_SUB ? -cons : cons);
- }
+ continue;
}
- cmpOper = (genTreeOps)info.cmpOper;
+ // If the operand that operates on the bound is not constant, then done.
+ if (!m_pCompiler->vnStore->IsVNInt32Constant(info.arrOp))
+ {
+ continue;
+ }
+
+ int cons = m_pCompiler->vnStore->ConstantValue<int>(info.arrOp);
+ limit = Limit(Limit::keBinOpArray, info.vnBound, info.arrOper == GT_SUB ? -cons : cons);
+ cmpOper = (genTreeOps)info.cmpOper;
}
// Current assertion is of the form (i < len) != 0
else if (curAssertion->IsCheckedBoundBound())
@@ -595,19 +579,17 @@ void RangeCheck::MergeEdgeAssertions(GenTreePtr tree, ASSERT_VALARG_TP assertion
continue;
}
- limit = Limit(Limit::keConstant, ValueNumStore::NoVN, info.constVal);
+ limit = Limit(Limit::keConstant, info.constVal);
cmpOper = (genTreeOps)info.cmpOper;
}
+ // Current assertion is not supported, ignore it
else
{
- noway_assert(false);
- }
-
- if (limit.IsUndef())
- {
continue;
}
+ assert(limit.IsBinOpArray() || limit.IsArray() || limit.IsConstant());
+
// Make sure the assertion is of the form != 0 or == 0.
if (curAssertion->op2.vn != m_pCompiler->vnStore->VNZeroForType(TYP_INT))
{
@@ -620,8 +602,6 @@ void RangeCheck::MergeEdgeAssertions(GenTreePtr tree, ASSERT_VALARG_TP assertion
}
#endif
- noway_assert(limit.IsBinOpArray() || limit.IsArray() || limit.IsConstant());
-
ValueNum arrLenVN = m_pCurBndsChk->gtArrLen->gtVNPair.GetConservative();
if (m_pCompiler->vnStore->IsVNConstant(arrLenVN))
@@ -738,8 +718,7 @@ void RangeCheck::MergeEdgeAssertions(GenTreePtr tree, ASSERT_VALARG_TP assertion
// Merge assertions from the pred edges of the block, i.e., check for any assertions about "op's" value numbers for phi
// arguments. If not a phi argument, check if we assertions about local variables.
-void RangeCheck::MergeAssertion(
- BasicBlock* block, GenTreePtr stmt, GenTreePtr op, SearchPath* path, Range* pRange DEBUGARG(int indent))
+void RangeCheck::MergeAssertion(BasicBlock* block, GenTreePtr op, Range* pRange DEBUGARG(int indent))
{
JITDUMP("Merging assertions from pred edges of BB%02d for op [%06d] $%03x\n", block->bbNum, Compiler::dspTreeID(op),
op->gtVNPair.GetConservative());
@@ -775,36 +754,38 @@ void RangeCheck::MergeAssertion(
if (!BitVecOps::MayBeUninit(assertions))
{
// Perform the merge step to fine tune the range value.
- MergeEdgeAssertions(op, assertions, pRange);
+ MergeEdgeAssertions(op->AsLclVarCommon(), assertions, pRange);
}
}
// Compute the range for a binary operation.
-Range RangeCheck::ComputeRangeForBinOp(BasicBlock* block,
- GenTreePtr stmt,
- GenTreePtr op1,
- GenTreePtr op2,
- genTreeOps oper,
- SearchPath* path,
- bool monotonic DEBUGARG(int indent))
+Range RangeCheck::ComputeRangeForBinOp(BasicBlock* block, GenTreeOp* binop, bool monotonic DEBUGARG(int indent))
{
+#ifdef LEGACY_BACKEND
+ assert(binop->OperIs(GT_ADD, GT_ASG_ADD));
+#else
+ assert(binop->OperIs(GT_ADD));
+#endif
+
+ GenTree* op1 = binop->gtGetOp1();
+ GenTree* op2 = binop->gtGetOp2();
+
Range* op1RangeCached = nullptr;
Range op1Range = Limit(Limit::keUndef);
- bool inPath1 = path->Lookup(op1);
// Check if the range value is already cached.
if (!GetRangeMap()->Lookup(op1, &op1RangeCached))
{
// If we already have the op in the path, then, just rely on assertions, else
// find the range.
- if (!inPath1)
+ if (m_pSearchPath->Lookup(op1))
{
- op1Range = GetRange(block, stmt, op1, path, monotonic DEBUGARG(indent));
+ op1Range = Range(Limit(Limit::keDependent));
}
else
{
- op1Range = Range(Limit(Limit::keDependent));
+ op1Range = GetRange(block, op1, monotonic DEBUGARG(indent));
}
- MergeAssertion(block, stmt, op1, path, &op1Range DEBUGARG(indent + 1));
+ MergeAssertion(block, op1, &op1Range DEBUGARG(indent + 1));
}
else
{
@@ -813,28 +794,26 @@ Range RangeCheck::ComputeRangeForBinOp(BasicBlock* block,
Range* op2RangeCached;
Range op2Range = Limit(Limit::keUndef);
- bool inPath2 = path->Lookup(op2);
// Check if the range value is already cached.
if (!GetRangeMap()->Lookup(op2, &op2RangeCached))
{
// If we already have the op in the path, then, just rely on assertions, else
// find the range.
- if (!inPath2)
+ if (m_pSearchPath->Lookup(op2))
{
- op2Range = GetRange(block, stmt, op2, path, monotonic DEBUGARG(indent));
+ op2Range = Range(Limit(Limit::keDependent));
}
else
{
- op2Range = Range(Limit(Limit::keDependent));
+ op2Range = GetRange(block, op2, monotonic DEBUGARG(indent));
}
- MergeAssertion(block, stmt, op2, path, &op2Range DEBUGARG(indent + 1));
+ MergeAssertion(block, op2, &op2Range DEBUGARG(indent + 1));
}
else
{
op2Range = *op2RangeCached;
}
- assert(oper == GT_ADD); // For now just GT_ADD.
Range r = RangeOps::Add(op1Range, op2Range);
JITDUMP("BinOp add ranges %s %s = %s\n", op1Range.ToString(m_pCompiler->getAllocatorDebugOnly()),
op2Range.ToString(m_pCompiler->getAllocatorDebugOnly()), r.ToString(m_pCompiler->getAllocatorDebugOnly()));
@@ -842,11 +821,12 @@ Range RangeCheck::ComputeRangeForBinOp(BasicBlock* block,
}
// Compute the range for a local var definition.
-Range RangeCheck::ComputeRangeForLocalDef(
- BasicBlock* block, GenTreePtr stmt, GenTreePtr expr, SearchPath* path, bool monotonic DEBUGARG(int indent))
+Range RangeCheck::ComputeRangeForLocalDef(BasicBlock* block,
+ GenTreeLclVarCommon* lcl,
+ bool monotonic DEBUGARG(int indent))
{
// Get the program location of the def.
- Location* loc = GetDef(expr);
+ Location* loc = GetDef(lcl);
// If we can't reach the def, then return unknown range.
if (loc == nullptr)
@@ -868,13 +848,13 @@ Range RangeCheck::ComputeRangeForLocalDef(
// If the operator of the definition is assignment, then compute the range of the rhs.
case GT_ASG:
{
- Range range = GetRange(loc->block, loc->stmt, asg->gtGetOp2(), path, monotonic DEBUGARG(indent));
+ Range range = GetRange(loc->block, asg->gtGetOp2(), monotonic DEBUGARG(indent));
if (!BitVecOps::MayBeUninit(block->bbAssertionIn))
{
JITDUMP("Merge assertions from BB%02d:%s for assignment about [%06d]\n", block->bbNum,
BitVecOps::ToString(m_pCompiler->apTraits, block->bbAssertionIn),
Compiler::dspTreeID(asg->gtGetOp1()));
- MergeEdgeAssertions(asg->gtGetOp1(), block->bbAssertionIn, &range);
+ MergeEdgeAssertions(asg->gtGetOp1()->AsLclVarCommon(), block->bbAssertionIn, &range);
JITDUMP("done merging\n");
}
return range;
@@ -885,8 +865,7 @@ Range RangeCheck::ComputeRangeForLocalDef(
// If the operator of the definition is +=, then compute the range of the operands of +.
// Note that gtGetOp1 will return op1 to be the lhs; in the formulation of ssa, we have
// a side table for defs and the lhs of a += is considered to be a use for SSA numbering.
- return ComputeRangeForBinOp(loc->block, loc->stmt, asg->gtGetOp1(), asg->gtGetOp2(), GT_ADD, path,
- monotonic DEBUGARG(indent));
+ return ComputeRangeForBinOp(loc->block, asg->AsOp(), monotonic DEBUGARG(indent));
#endif
default:
@@ -941,26 +920,6 @@ bool RangeCheck::GetLimitMax(Limit& limit, int* pMax)
}
break;
- case Limit::keSsaVar:
- case Limit::keBinOp:
- if (m_pCompiler->vnStore->IsVNConstant(limit.vn) && m_pCompiler->vnStore->TypeOfVN(limit.vn) == TYP_INT)
- {
- max1 = m_pCompiler->vnStore->ConstantValue<int>(limit.vn);
- }
- else
- {
- return false;
- }
- if (limit.type == Limit::keBinOp)
- {
- if (IntAddOverflows(max1, limit.GetConstant()))
- {
- return false;
- }
- max1 += limit.GetConstant();
- }
- break;
-
default:
return false;
}
@@ -986,14 +945,17 @@ bool RangeCheck::AddOverflows(Limit& limit1, Limit& limit2)
}
// Does the bin operation overflow.
-bool RangeCheck::DoesBinOpOverflow(BasicBlock* block, GenTreePtr stmt, GenTreePtr op1, GenTreePtr op2, SearchPath* path)
+bool RangeCheck::DoesBinOpOverflow(BasicBlock* block, GenTreeOp* binop)
{
- if (!path->Lookup(op1) && DoesOverflow(block, stmt, op1, path))
+ GenTree* op1 = binop->gtGetOp1();
+ GenTree* op2 = binop->gtGetOp2();
+
+ if (!m_pSearchPath->Lookup(op1) && DoesOverflow(block, op1))
{
return true;
}
- if (!path->Lookup(op2) && DoesOverflow(block, stmt, op2, path))
+ if (!m_pSearchPath->Lookup(op2) && DoesOverflow(block, op2))
{
return true;
}
@@ -1014,13 +976,13 @@ bool RangeCheck::DoesBinOpOverflow(BasicBlock* block, GenTreePtr stmt, GenTreePt
// If dependent, check if we can use some assertions.
if (op1Range->UpperLimit().IsDependent())
{
- MergeAssertion(block, stmt, op1, path, op1Range DEBUGARG(0));
+ MergeAssertion(block, op1, op1Range DEBUGARG(0));
}
// If dependent, check if we can use some assertions.
if (op2Range->UpperLimit().IsDependent())
{
- MergeAssertion(block, stmt, op2, path, op2Range DEBUGARG(0));
+ MergeAssertion(block, op2, op2Range DEBUGARG(0));
}
JITDUMP("Checking bin op overflow %s %s\n", op1Range->ToString(m_pCompiler->getAllocatorDebugOnly()),
@@ -1034,10 +996,10 @@ bool RangeCheck::DoesBinOpOverflow(BasicBlock* block, GenTreePtr stmt, GenTreePt
}
// Check if the var definition the rhs involves arithmetic that overflows.
-bool RangeCheck::DoesVarDefOverflow(BasicBlock* block, GenTreePtr stmt, GenTreePtr expr, SearchPath* path)
+bool RangeCheck::DoesVarDefOverflow(GenTreeLclVarCommon* lcl)
{
// Get the definition.
- Location* loc = GetDef(expr);
+ Location* loc = GetDef(lcl);
if (loc == nullptr)
{
return true;
@@ -1048,12 +1010,12 @@ bool RangeCheck::DoesVarDefOverflow(BasicBlock* block, GenTreePtr stmt, GenTreeP
switch (asg->OperGet())
{
case GT_ASG:
- return DoesOverflow(loc->block, loc->stmt, asg->gtGetOp2(), path);
+ return DoesOverflow(loc->block, asg->gtGetOp2());
#ifdef LEGACY_BACKEND
case GT_ASG_ADD:
// For GT_ASG_ADD, op2 is use, op1 is also use since we side table for defs in useasg case.
- return DoesBinOpOverflow(loc->block, loc->stmt, asg->gtGetOp1(), asg->gtGetOp2(), path);
+ return DoesBinOpOverflow(loc->block, asg->AsOp());
#endif
default:
@@ -1066,16 +1028,16 @@ bool RangeCheck::DoesVarDefOverflow(BasicBlock* block, GenTreePtr stmt, GenTreeP
return true;
}
-bool RangeCheck::DoesPhiOverflow(BasicBlock* block, GenTreePtr stmt, GenTreePtr expr, SearchPath* path)
+bool RangeCheck::DoesPhiOverflow(BasicBlock* block, GenTreePtr expr)
{
for (GenTreeArgList* args = expr->gtOp.gtOp1->AsArgList(); args != nullptr; args = args->Rest())
{
GenTreePtr arg = args->Current();
- if (path->Lookup(arg))
+ if (m_pSearchPath->Lookup(arg))
{
continue;
}
- if (DoesOverflow(block, stmt, args->Current(), path))
+ if (DoesOverflow(block, arg))
{
return true;
}
@@ -1083,52 +1045,49 @@ bool RangeCheck::DoesPhiOverflow(BasicBlock* block, GenTreePtr stmt, GenTreePtr
return false;
}
-bool RangeCheck::DoesOverflow(BasicBlock* block, GenTreePtr stmt, GenTreePtr expr, SearchPath* path)
+bool RangeCheck::DoesOverflow(BasicBlock* block, GenTreePtr expr)
{
bool overflows = false;
if (!GetOverflowMap()->Lookup(expr, &overflows))
{
- overflows = ComputeDoesOverflow(block, stmt, expr, path);
+ overflows = ComputeDoesOverflow(block, expr);
}
return overflows;
}
-bool RangeCheck::ComputeDoesOverflow(BasicBlock* block, GenTreePtr stmt, GenTreePtr expr, SearchPath* path)
+bool RangeCheck::ComputeDoesOverflow(BasicBlock* block, GenTreePtr expr)
{
JITDUMP("Does overflow [%06d]?\n", Compiler::dspTreeID(expr));
- path->Set(expr, block);
+ m_pSearchPath->Set(expr, block);
bool overflows = true;
- // Remove hashtable entry for expr when we exit the present scope.
- Range range = Limit(Limit::keUndef);
- ValueNum vn = expr->gtVNPair.GetConservative();
- if (path->GetCount() > MAX_SEARCH_DEPTH)
+ if (m_pSearchPath->GetCount() > MAX_SEARCH_DEPTH)
{
overflows = true;
}
// If the definition chain resolves to a constant, it doesn't overflow.
- else if (m_pCompiler->vnStore->IsVNConstant(vn))
+ else if (m_pCompiler->vnStore->IsVNConstant(expr->gtVNPair.GetConservative()))
{
overflows = false;
}
// Check if the var def has rhs involving arithmetic that overflows.
else if (expr->IsLocal())
{
- overflows = DoesVarDefOverflow(block, stmt, expr, path);
+ overflows = DoesVarDefOverflow(expr->AsLclVarCommon());
}
// Check if add overflows.
else if (expr->OperGet() == GT_ADD)
{
- overflows = DoesBinOpOverflow(block, stmt, expr->gtGetOp1(), expr->gtGetOp2(), path);
+ overflows = DoesBinOpOverflow(block, expr->AsOp());
}
// Walk through phi arguments to check if phi arguments involve arithmetic that overflows.
else if (expr->OperGet() == GT_PHI)
{
- overflows = DoesPhiOverflow(block, stmt, expr, path);
+ overflows = DoesPhiOverflow(block, expr);
}
GetOverflowMap()->Set(expr, overflows);
- path->Remove(expr);
+ m_pSearchPath->Remove(expr);
return overflows;
}
@@ -1139,10 +1098,9 @@ bool RangeCheck::ComputeDoesOverflow(BasicBlock* block, GenTreePtr stmt, GenTree
// value as "dependent" (dep).
// If the loop is proven to be "monotonic", then make liberal decisions while merging phi node.
// eg.: merge((0, dep), (dep, dep)) = (0, dep)
-Range RangeCheck::ComputeRange(
- BasicBlock* block, GenTreePtr stmt, GenTreePtr expr, SearchPath* path, bool monotonic DEBUGARG(int indent))
+Range RangeCheck::ComputeRange(BasicBlock* block, GenTreePtr expr, bool monotonic DEBUGARG(int indent))
{
- bool newlyAdded = !path->Set(expr, block);
+ bool newlyAdded = !m_pSearchPath->Set(expr, block);
Range range = Limit(Limit::keUndef);
ValueNum vn = expr->gtVNPair.GetConservative();
@@ -1164,7 +1122,7 @@ Range RangeCheck::ComputeRange(
JITDUMP("GetRange not tractable within max node visit budget.\n");
}
// Prevent unbounded recursion.
- else if (path->GetCount() > MAX_SEARCH_DEPTH)
+ else if (m_pSearchPath->GetCount() > MAX_SEARCH_DEPTH)
{
// Unknown is lattice top, anything that merges with Unknown will yield Unknown.
range = Range(Limit(Limit::keUnknown));
@@ -1189,33 +1147,32 @@ Range RangeCheck::ComputeRange(
// If local, find the definition from the def map and evaluate the range for rhs.
else if (expr->IsLocal())
{
- range = ComputeRangeForLocalDef(block, stmt, expr, path, monotonic DEBUGARG(indent + 1));
- MergeAssertion(block, stmt, expr, path, &range DEBUGARG(indent + 1));
+ range = ComputeRangeForLocalDef(block, expr->AsLclVarCommon(), monotonic DEBUGARG(indent + 1));
+ MergeAssertion(block, expr, &range DEBUGARG(indent + 1));
}
// If add, then compute the range for the operands and add them.
else if (expr->OperGet() == GT_ADD)
{
- range = ComputeRangeForBinOp(block, stmt, expr->gtGetOp1(), expr->gtGetOp2(), GT_ADD, path,
- monotonic DEBUGARG(indent + 1));
+ range = ComputeRangeForBinOp(block, expr->AsOp(), monotonic DEBUGARG(indent + 1));
}
// If phi, then compute the range for arguments, calling the result "dependent" when looping begins.
else if (expr->OperGet() == GT_PHI)
{
- Range argRange = Range(Limit(Limit::keUndef));
for (GenTreeArgList* args = expr->gtOp.gtOp1->AsArgList(); args != nullptr; args = args->Rest())
{
- if (path->Lookup(args->Current()))
+ Range argRange = Range(Limit(Limit::keUndef));
+ if (m_pSearchPath->Lookup(args->Current()))
{
JITDUMP("PhiArg [%06d] is already being computed\n", Compiler::dspTreeID(args->Current()));
argRange = Range(Limit(Limit::keDependent));
}
else
{
- argRange = GetRange(block, stmt, args->Current(), path, monotonic DEBUGARG(indent + 1));
+ argRange = GetRange(block, args->Current(), monotonic DEBUGARG(indent + 1));
}
assert(!argRange.LowerLimit().IsUndef());
assert(!argRange.UpperLimit().IsUndef());
- MergeAssertion(block, stmt, args->Current(), path, &argRange DEBUGARG(indent + 1));
+ MergeAssertion(block, args->Current(), &argRange DEBUGARG(indent + 1));
JITDUMP("Merging ranges %s %s:", range.ToString(m_pCompiler->getAllocatorDebugOnly()),
argRange.ToString(m_pCompiler->getAllocatorDebugOnly()));
range = RangeOps::Merge(range, argRange, monotonic);
@@ -1228,8 +1185,8 @@ Range RangeCheck::ComputeRange(
range = Range(Limit(Limit::keUnknown));
}
- GetRangeMap()->Set(expr, new (m_pCompiler->getAllocator()) Range(range));
- path->Remove(expr);
+ GetRangeMap()->Set(expr, new (&m_alloc) Range(range));
+ m_pSearchPath->Remove(expr);
return range;
}
@@ -1244,8 +1201,7 @@ void Indent(int indent)
#endif
// Get the range, if it is already computed, use the cached range value, else compute it.
-Range RangeCheck::GetRange(
- BasicBlock* block, GenTreePtr stmt, GenTreePtr expr, SearchPath* path, bool monotonic DEBUGARG(int indent))
+Range RangeCheck::GetRange(BasicBlock* block, GenTreePtr expr, bool monotonic DEBUGARG(int indent))
{
#ifdef DEBUG
if (m_pCompiler->verbose)
@@ -1259,8 +1215,8 @@ Range RangeCheck::GetRange(
#endif
Range* pRange = nullptr;
- Range range = GetRangeMap()->Lookup(expr, &pRange) ? *pRange : ComputeRange(block, stmt, expr, path,
- monotonic DEBUGARG(indent));
+ Range range =
+ GetRangeMap()->Lookup(expr, &pRange) ? *pRange : ComputeRange(block, expr, monotonic DEBUGARG(indent));
#ifdef DEBUG
if (m_pCompiler->verbose)
@@ -1278,14 +1234,10 @@ Range RangeCheck::GetRange(
// If this is a tree local definition add its location to the def map.
void RangeCheck::MapStmtDefs(const Location& loc)
{
- GenTreePtr tree = loc.tree;
- if (!tree->IsLocal())
- {
- return;
- }
+ GenTreeLclVarCommon* tree = loc.tree;
- unsigned lclNum = tree->AsLclVarCommon()->GetLclNum();
- unsigned ssaNum = tree->AsLclVarCommon()->GetSsaNum();
+ unsigned lclNum = tree->GetLclNum();
+ unsigned ssaNum = tree->GetSsaNum();
if (ssaNum == SsaConfig::RESERVED_SSA_NUM)
{
return;
@@ -1300,7 +1252,7 @@ void RangeCheck::MapStmtDefs(const Location& loc)
// To avoid ind(addr) use asgs
if (loc.parent->OperIsAssignment())
{
- SetDef(HashCode(lclNum, ssaNum), new (m_pCompiler->getAllocator()) Location(loc));
+ SetDef(HashCode(lclNum, ssaNum), new (&m_alloc) Location(loc));
}
}
}
@@ -1309,7 +1261,7 @@ void RangeCheck::MapStmtDefs(const Location& loc)
{
if (loc.parent->OperGet() == GT_ASG)
{
- SetDef(HashCode(lclNum, ssaNum), new (m_pCompiler->getAllocator()) Location(loc));
+ SetDef(HashCode(lclNum, ssaNum), new (&m_alloc) Location(loc));
}
}
}
@@ -1327,8 +1279,14 @@ struct MapMethodDefsData
Compiler::fgWalkResult MapMethodDefsVisitor(GenTreePtr* ptr, Compiler::fgWalkData* data)
{
- MapMethodDefsData* rcd = ((MapMethodDefsData*)data->pCallbackData);
- rcd->rc->MapStmtDefs(RangeCheck::Location(rcd->block, rcd->stmt, *ptr, data->parent));
+ GenTree* tree = *ptr;
+ MapMethodDefsData* rcd = ((MapMethodDefsData*)data->pCallbackData);
+
+ if (tree->IsLocal())
+ {
+ rcd->rc->MapStmtDefs(RangeCheck::Location(rcd->block, rcd->stmt, tree->AsLclVarCommon(), data->parent));
+ }
+
return Compiler::WALK_CONTINUE;
}
diff --git a/src/jit/rangecheck.h b/src/jit/rangecheck.h
index e9bdae1bdf..aaea3292ad 100644
--- a/src/jit/rangecheck.h
+++ b/src/jit/rangecheck.h
@@ -59,7 +59,6 @@
#pragma once
#include "compiler.h"
-#include "expandarray.h"
static bool IntAddOverflows(int max1, int max2)
{
@@ -74,22 +73,12 @@ static bool IntAddOverflows(int max1, int max2)
return false;
}
-// BNF for range and limit structures
-// Range -> Limit, Limit | Dependent | None | Unknown
-// Limit -> Symbol | BinOp | int
-// BinOp -> Symbol + int
-// SsaVar -> lclNum, ssaNum
-// Symbol -> SsaVar | ArrLen
-// ArrLen -> SsaVar
-// SsaVar -> vn
struct Limit
{
enum LimitType
{
keUndef, // The limit is yet to be computed.
- keBinOp,
keBinOpArray,
- keSsaVar,
keArray,
keConstant,
keDependent, // The limit is dependent on some other value.
@@ -104,14 +93,14 @@ struct Limit
{
}
- Limit(LimitType type, int cns) : cns(cns), type(type)
+ Limit(LimitType type, int cns) : cns(cns), vn(ValueNumStore::NoVN), type(type)
{
assert(type == keConstant);
}
Limit(LimitType type, ValueNum vn, int cns) : cns(cns), vn(vn), type(type)
{
- assert(type == keBinOpArray || keBinOp);
+ assert(type == keBinOpArray);
}
bool IsUndef()
@@ -138,25 +127,16 @@ struct Limit
{
return type == keArray;
}
- bool IsSsaVar()
- {
- return type == keSsaVar;
- }
bool IsBinOpArray()
{
return type == keBinOpArray;
}
- bool IsBinOp()
- {
- return type == keBinOp;
- }
bool AddConstant(int i)
{
switch (type)
{
case keDependent:
return true;
- case keBinOp:
case keBinOpArray:
if (IntAddOverflows(cns, i))
{
@@ -165,11 +145,6 @@ struct Limit
cns += i;
return true;
- case keSsaVar:
- type = keBinOp;
- cns = i;
- return true;
-
case keArray:
type = keBinOpArray;
cns = i;
@@ -201,11 +176,9 @@ struct Limit
case keDependent:
return l.type == type;
- case keBinOp:
case keBinOpArray:
return l.type == type && l.vn == vn && l.cns == cns;
- case keSsaVar:
case keArray:
return l.type == type && l.vn == vn;
@@ -215,7 +188,7 @@ struct Limit
return false;
}
#ifdef DEBUG
- const char* ToString(IAllocator* alloc)
+ const char* ToString(CompAllocator* alloc)
{
unsigned size = 64;
char* buf = (char*)alloc->Alloc(size);
@@ -230,15 +203,10 @@ struct Limit
case keDependent:
return "Dependent";
- case keBinOp:
case keBinOpArray:
sprintf_s(buf, size, "VN%04X + %d", vn, cns);
return buf;
- case keSsaVar:
- sprintf_s(buf, size, "VN%04X", vn);
- return buf;
-
case keArray:
sprintf_s(buf, size, "VN%04X", vn);
return buf;
@@ -280,7 +248,7 @@ struct Range
}
#ifdef DEBUG
- char* ToString(IAllocator* alloc)
+ char* ToString(CompAllocator* alloc)
{
size_t size = 64;
char* buf = (char*)alloc->Alloc(size);
@@ -454,11 +422,11 @@ public:
// Location information is used to map where the defs occur in the method.
struct Location
{
- BasicBlock* block;
- GenTreePtr stmt;
- GenTreePtr tree;
- GenTreePtr parent;
- Location(BasicBlock* block, GenTreePtr stmt, GenTreePtr tree, GenTreePtr parent)
+ BasicBlock* block;
+ GenTreePtr stmt;
+ GenTreeLclVarCommon* tree;
+ GenTreePtr parent;
+ Location(BasicBlock* block, GenTreePtr stmt, GenTreeLclVarCommon* tree, GenTreePtr parent)
: block(block), stmt(stmt), tree(tree), parent(parent)
{
}
@@ -467,12 +435,11 @@ public:
Location();
};
- typedef SimplerHashTable<GenTreePtr, PtrKeyFuncs<GenTree>, bool, JitSimplerHashBehavior> OverflowMap;
- typedef SimplerHashTable<GenTreePtr, PtrKeyFuncs<GenTree>, Range*, JitSimplerHashBehavior> RangeMap;
- typedef SimplerHashTable<GenTreePtr, PtrKeyFuncs<GenTree>, BasicBlock*, JitSimplerHashBehavior> SearchPath;
- typedef SimplerHashTable<INT64, LargePrimitiveKeyFuncs<INT64>, Location*, JitSimplerHashBehavior> VarToLocMap;
- typedef SimplerHashTable<INT64, LargePrimitiveKeyFuncs<INT64>, ExpandArrayStack<Location*>*, JitSimplerHashBehavior>
- VarToLocArrayMap;
+ typedef JitHashTable<GenTreePtr, JitPtrKeyFuncs<GenTree>, bool> OverflowMap;
+ typedef JitHashTable<GenTreePtr, JitPtrKeyFuncs<GenTree>, Range*> RangeMap;
+ typedef JitHashTable<GenTreePtr, JitPtrKeyFuncs<GenTree>, BasicBlock*> SearchPath;
+ typedef JitHashTable<INT64, JitLargePrimitiveKeyFuncs<INT64>, Location*> VarToLocMap;
+ typedef JitHashTable<INT64, JitLargePrimitiveKeyFuncs<INT64>, JitExpandArrayStack<Location*>*> VarToLocArrayMap;
// Generate a hashcode unique for this ssa var.
UINT64 HashCode(unsigned lclNum, unsigned ssaNum);
@@ -483,7 +450,7 @@ public:
void SetDef(UINT64 hash, Location* loc);
// Given a tree node that is a local, return the Location defining the local.
- Location* GetDef(GenTreePtr tree);
+ Location* GetDef(GenTreeLclVarCommon* lcl);
Location* GetDef(unsigned lclNum, unsigned ssaNum);
int GetArrLength(ValueNum vn);
@@ -514,35 +481,25 @@ public:
// The "path" is the path taken in the search for the rhs' range and its constituents' range.
// If "monotonic" is true, the calculations are made more liberally assuming initial values
// at phi definitions.
- Range GetRange(
- BasicBlock* block, GenTreePtr stmt, GenTreePtr expr, SearchPath* path, bool monotonic DEBUGARG(int indent));
+ Range GetRange(BasicBlock* block, GenTreePtr expr, bool monotonic DEBUGARG(int indent));
// Given the local variable, first find the definition of the local and find the range of the rhs.
// Helper for GetRange.
- Range ComputeRangeForLocalDef(
- BasicBlock* block, GenTreePtr stmt, GenTreePtr expr, SearchPath* path, bool monotonic DEBUGARG(int indent));
+ Range ComputeRangeForLocalDef(BasicBlock* block, GenTreeLclVarCommon* lcl, bool monotonic DEBUGARG(int indent));
// Compute the range, rather than retrieve a cached value. Helper for GetRange.
- Range ComputeRange(
- BasicBlock* block, GenTreePtr stmt, GenTreePtr expr, SearchPath* path, bool monotonic DEBUGARG(int indent));
+ Range ComputeRange(BasicBlock* block, GenTreePtr expr, bool monotonic DEBUGARG(int indent));
// Compute the range for the op1 and op2 for the given binary operator.
- Range ComputeRangeForBinOp(BasicBlock* block,
- GenTreePtr stmt,
- GenTreePtr op1,
- GenTreePtr op2,
- genTreeOps oper,
- SearchPath* path,
- bool monotonic DEBUGARG(int indent));
+ Range ComputeRangeForBinOp(BasicBlock* block, GenTreeOp* binop, bool monotonic DEBUGARG(int indent));
// Merge assertions from AssertionProp's flags, for the corresponding "phiArg."
// Requires "pRange" to contain range that is computed partially.
- void MergeAssertion(
- BasicBlock* block, GenTreePtr stmt, GenTreePtr phiArg, SearchPath* path, Range* pRange DEBUGARG(int indent));
+ void MergeAssertion(BasicBlock* block, GenTreePtr phiArg, Range* pRange DEBUGARG(int indent));
// Inspect the "assertions" and extract assertions about the given "phiArg" and
// refine the "pRange" value.
- void MergeEdgeAssertions(GenTreePtr phiArg, ASSERT_VALARG_TP assertions, Range* pRange);
+ void MergeEdgeAssertions(GenTreeLclVarCommon* lcl, ASSERT_VALARG_TP assertions, Range* pRange);
// The maximum possible value of the given "limit." If such a value could not be determined
// return "false." For example: ARRLEN_MAX for array length.
@@ -552,30 +509,30 @@ public:
bool AddOverflows(Limit& limit1, Limit& limit2);
// Does the binary operation between the operands overflow? Check recursively.
- bool DoesBinOpOverflow(BasicBlock* block, GenTreePtr stmt, GenTreePtr op1, GenTreePtr op2, SearchPath* path);
+ bool DoesBinOpOverflow(BasicBlock* block, GenTreeOp* binop);
// Does the phi operands involve an assignment that could overflow?
- bool DoesPhiOverflow(BasicBlock* block, GenTreePtr stmt, GenTreePtr expr, SearchPath* path);
+ bool DoesPhiOverflow(BasicBlock* block, GenTreePtr expr);
// Find the def of the "expr" local and recurse on the arguments if any of them involve a
// calculation that overflows.
- bool DoesVarDefOverflow(BasicBlock* block, GenTreePtr stmt, GenTreePtr expr, SearchPath* path);
+ bool DoesVarDefOverflow(GenTreeLclVarCommon* lcl);
- bool ComputeDoesOverflow(BasicBlock* block, GenTreePtr stmt, GenTreePtr expr, SearchPath* path);
+ bool ComputeDoesOverflow(BasicBlock* block, GenTreePtr expr);
// Does the current "expr" which is a use involve a definition, that overflows.
- bool DoesOverflow(BasicBlock* block, GenTreePtr stmt, GenTreePtr tree, SearchPath* path);
+ bool DoesOverflow(BasicBlock* block, GenTreePtr tree);
// Widen the range by first checking if the induction variable is monotonic. Requires "pRange"
// to be partially computed.
- void Widen(BasicBlock* block, GenTreePtr stmt, GenTreePtr tree, SearchPath* path, Range* pRange);
+ void Widen(BasicBlock* block, GenTreePtr tree, Range* pRange);
// Is the binary operation increasing the value.
- bool IsBinOpMonotonicallyIncreasing(GenTreePtr op1, GenTreePtr op2, genTreeOps oper, SearchPath* path);
+ bool IsBinOpMonotonicallyIncreasing(GenTreeOp* binop);
// Given an "expr" trace its rhs and their definitions to check if all the assignments
// are monotonically increasing.
- bool IsMonotonicallyIncreasing(GenTreePtr tree, SearchPath* path);
+ bool IsMonotonicallyIncreasing(GenTreePtr tree);
// We allocate a budget to avoid walking long UD chains. When traversing each link in the UD
// chain, we decrement the budget. When the budget hits 0, then no more range check optimization
@@ -593,9 +550,12 @@ private:
RangeMap* GetRangeMap();
RangeMap* m_pRangeMap;
- bool m_fMappedDefs;
- VarToLocMap* m_pDefTable;
- Compiler* m_pCompiler;
+ SearchPath* m_pSearchPath;
+
+ bool m_fMappedDefs;
+ VarToLocMap* m_pDefTable;
+ Compiler* m_pCompiler;
+ CompAllocator m_alloc;
// The number of nodes for which range is computed throughout the current method.
// When this limit is zero, we have exhausted all the budget to walk the ud-chain.
diff --git a/src/jit/regalloc.cpp b/src/jit/regalloc.cpp
index a9119945d9..6be476ad88 100644
--- a/src/jit/regalloc.cpp
+++ b/src/jit/regalloc.cpp
@@ -360,7 +360,7 @@ inline regMaskTP Compiler::genReturnRegForTree(GenTreePtr tree)
{
var_types type = tree->TypeGet();
- if (type == TYP_STRUCT && IsHfa(tree))
+ if (varTypeIsStruct(type) && IsHfa(tree))
{
int retSlots = GetHfaCount(tree);
return ((1 << retSlots) - 1) << REG_FLOATRET;
@@ -751,7 +751,7 @@ regNumber Compiler::raUpdateRegStateForArg(RegState* regState, LclVarDsc* argDsc
#endif // _TARGET_ARM_
#if FEATURE_MULTIREG_ARGS
- if (argDsc->lvType == TYP_STRUCT)
+ if (varTypeIsStruct(argDsc->lvType))
{
if (argDsc->lvIsHfaRegArg())
{
@@ -1342,7 +1342,7 @@ RET:
while (iter.NextElem(&varNum))
{
// We'll need this for one of the calls...
- VarSetOps::OldStyleClearD(this, varAsSet);
+ VarSetOps::ClearD(this, varAsSet);
VarSetOps::AddElemD(this, varAsSet, varNum);
// If this varBit and lastUse?
@@ -6352,7 +6352,7 @@ void Compiler::rpPredictRegUse()
/* Zero the variable/register interference graph */
for (unsigned i = 0; i < REG_COUNT; i++)
{
- VarSetOps::OldStyleClearD(this, raLclRegIntf[i]);
+ VarSetOps::ClearD(this, raLclRegIntf[i]);
}
// if there are PInvoke calls and compLvFrameListRoot is enregistered,
@@ -6805,7 +6805,7 @@ void Compiler::rpRecordPrediction()
if (rpBestRecordedPrediction == NULL)
{
rpBestRecordedPrediction =
- reinterpret_cast<VarRegPrediction*>(compGetMemArrayA(lvaCount, sizeof(VarRegPrediction)));
+ reinterpret_cast<VarRegPrediction*>(compGetMemArray(lvaCount, sizeof(VarRegPrediction)));
}
for (unsigned k = 0; k < lvaCount; k++)
{
diff --git a/src/jit/ssabuilder.cpp b/src/jit/ssabuilder.cpp
index 37adf50da7..4d6302e7ec 100644
--- a/src/jit/ssabuilder.cpp
+++ b/src/jit/ssabuilder.cpp
@@ -73,15 +73,13 @@ static inline BasicBlock* IntersectDom(BasicBlock* finger1, BasicBlock* finger2)
void Compiler::fgSsaBuild()
{
- IAllocator* pIAllocator = new (this, CMK_SSA) CompAllocator(this, CMK_SSA);
-
// If this is not the first invocation, reset data structures for SSA.
if (fgSsaPassesCompleted > 0)
{
fgResetForSsa();
}
- SsaBuilder builder(this, pIAllocator);
+ SsaBuilder builder(this, new (this, CMK_SSA) CompAllocator(this, CMK_SSA));
builder.Build();
fgSsaPassesCompleted++;
#ifdef DEBUG
@@ -161,17 +159,17 @@ void Compiler::fgResetForSsa()
*
* @remarks Initializes the class and member pointers/objects that use constructors.
*/
-SsaBuilder::SsaBuilder(Compiler* pCompiler, IAllocator* pIAllocator)
+SsaBuilder::SsaBuilder(Compiler* pCompiler, CompAllocator* pAllocator)
: m_pCompiler(pCompiler)
- , m_allocator(pIAllocator)
+ , m_allocator(pAllocator)
#ifdef SSA_FEATURE_DOMARR
, m_pDomPreOrder(NULL)
, m_pDomPostOrder(NULL)
#endif
#ifdef SSA_FEATURE_USEDEF
- , m_uses(jitstd::allocator<void>(pIAllocator))
- , m_defs(jitstd::allocator<void>(pIAllocator))
+ , m_uses(jitstd::allocator<void>(pAllocator))
+ , m_defs(jitstd::allocator<void>(pAllocator))
#endif
{
}
@@ -1974,9 +1972,8 @@ void Compiler::JitTestCheckSSA()
}
};
- typedef SimplerHashTable<ssize_t, SmallPrimitiveKeyFuncs<ssize_t>, SSAName, JitSimplerHashBehavior>
- LabelToSSANameMap;
- typedef SimplerHashTable<SSAName, SSAName, ssize_t, JitSimplerHashBehavior> SSANameToLabelMap;
+ typedef JitHashTable<ssize_t, JitSmallPrimitiveKeyFuncs<ssize_t>, SSAName> LabelToSSANameMap;
+ typedef JitHashTable<SSAName, SSAName, ssize_t> SSANameToLabelMap;
// If we have no test data, early out.
if (m_nodeTestData == nullptr)
diff --git a/src/jit/ssabuilder.h b/src/jit/ssabuilder.h
index e82a4007e3..7a97375fb7 100644
--- a/src/jit/ssabuilder.h
+++ b/src/jit/ssabuilder.h
@@ -62,7 +62,7 @@ private:
public:
// Constructor
- SsaBuilder(Compiler* pCompiler, IAllocator* pIAllocator);
+ SsaBuilder(Compiler* pCompiler, CompAllocator* pAllocator);
// Requires stmt nodes to be already sequenced in evaluation order. Analyzes the graph
// for introduction of phi-nodes as GT_PHI tree nodes at the beginning of each block.
diff --git a/src/jit/target.h b/src/jit/target.h
index ad36689346..675f057b65 100644
--- a/src/jit/target.h
+++ b/src/jit/target.h
@@ -1611,7 +1611,7 @@ typedef unsigned short regPairNoSmall; // arm: need 12 bits
REG_V28, REG_V29, REG_V30, REG_V31, \
REG_V7, REG_V6, REG_V5, REG_V4, \
REG_V8, REG_V9, REG_V10, REG_V11, \
- REG_V12, REG_V13, REG_V14, REG_V16, \
+ REG_V12, REG_V13, REG_V14, REG_V15, \
REG_V3, REG_V2, REG_V1, REG_V0
#define REG_CALLEE_SAVED_ORDER REG_R19,REG_R20,REG_R21,REG_R22,REG_R23,REG_R24,REG_R25,REG_R26,REG_R27,REG_R28
diff --git a/src/jit/utils.cpp b/src/jit/utils.cpp
index ea22912cac..d506e916b8 100644
--- a/src/jit/utils.cpp
+++ b/src/jit/utils.cpp
@@ -882,7 +882,7 @@ void ConfigMethodRange::InitRanges(const wchar_t* rangeStr, unsigned capacity)
* Histogram class.
*/
-Histogram::Histogram(IAllocator* allocator, const unsigned* const sizeTable)
+Histogram::Histogram(HostAllocator* allocator, const unsigned* const sizeTable)
: m_allocator(allocator), m_sizeTable(sizeTable), m_counts(nullptr)
{
unsigned sizeCount = 0;
@@ -1004,7 +1004,7 @@ FixedBitVect* FixedBitVect::bitVectInit(UINT size, Compiler* comp)
assert(bitVectMemSize * bitChunkSize() >= size);
- bv = (FixedBitVect*)comp->compGetMemA(sizeof(FixedBitVect) + bitVectMemSize, CMK_FixedBitVect);
+ bv = (FixedBitVect*)comp->compGetMem(sizeof(FixedBitVect) + bitVectMemSize, CMK_FixedBitVect);
memset(bv->bitVect, 0, bitVectMemSize);
bv->bitVectSize = size;
@@ -1541,7 +1541,7 @@ void HelperCallProperties::init()
// MyAssembly;mscorlib;System
// MyAssembly;mscorlib System
-AssemblyNamesList2::AssemblyNamesList2(const wchar_t* list, IAllocator* alloc) : m_alloc(alloc)
+AssemblyNamesList2::AssemblyNamesList2(const wchar_t* list, HostAllocator* alloc) : m_alloc(alloc)
{
assert(m_alloc != nullptr);
diff --git a/src/jit/utils.h b/src/jit/utils.h
index 1a76f5b274..f30c2202e1 100644
--- a/src/jit/utils.h
+++ b/src/jit/utils.h
@@ -17,6 +17,7 @@ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#define _UTILS_H_
#include "iallocator.h"
+#include "hostallocator.h"
#include "cycletimer.h"
// Needed for unreached()
@@ -132,23 +133,6 @@ int signum(T val)
}
}
-class JitSimplerHashBehavior
-{
-public:
- static const unsigned s_growth_factor_numerator = 3;
- static const unsigned s_growth_factor_denominator = 2;
-
- static const unsigned s_density_factor_numerator = 3;
- static const unsigned s_density_factor_denominator = 4;
-
- static const unsigned s_minimum_allocation = 7;
-
- inline static void DECLSPEC_NORETURN NoMemory()
- {
- NOMEM();
- }
-};
-
#if defined(DEBUG) || defined(INLINE_DATA)
// ConfigMethodRange describes a set of methods, specified via their
@@ -548,12 +532,12 @@ class AssemblyNamesList2
AssemblyName* m_next;
};
- AssemblyName* m_pNames; // List of names
- IAllocator* m_alloc; // IAllocator to use in this class
+ AssemblyName* m_pNames; // List of names
+ HostAllocator* m_alloc; // HostAllocator to use in this class
public:
// Take a Unicode string list of assembly names, parse it, and store it.
- AssemblyNamesList2(const wchar_t* list, __in IAllocator* alloc);
+ AssemblyNamesList2(const wchar_t* list, __in HostAllocator* alloc);
~AssemblyNamesList2();
@@ -617,23 +601,6 @@ unsigned CountDigits(unsigned num, unsigned base = 10);
#endif // DEBUG
-// Utility class for lists.
-template <typename T>
-struct ListNode
-{
- T data;
- ListNode<T>* next;
-
- // Create the class without using constructors.
- static ListNode<T>* Create(T value, IAllocator* alloc)
- {
- ListNode<T>* node = new (alloc) ListNode<T>;
- node->data = value;
- node->next = nullptr;
- return node;
- }
-};
-
/*****************************************************************************
* Floating point utility class
*/
diff --git a/src/jit/valuenum.cpp b/src/jit/valuenum.cpp
index 105623227c..f41e7fcb47 100644
--- a/src/jit/valuenum.cpp
+++ b/src/jit/valuenum.cpp
@@ -41,10 +41,6 @@ VNFunc GetVNFuncForOper(genTreeOps oper, bool isUnsigned)
return VNF_SUB_UN;
case GT_MUL:
return VNF_MUL_UN;
- case GT_DIV:
- return VNF_DIV_UN;
- case GT_MOD:
- return VNF_MOD_UN;
case GT_NOP:
case GT_COMMA:
@@ -54,7 +50,7 @@ VNFunc GetVNFuncForOper(genTreeOps oper, bool isUnsigned)
}
}
-ValueNumStore::ValueNumStore(Compiler* comp, IAllocator* alloc)
+ValueNumStore::ValueNumStore(Compiler* comp, CompAllocator* alloc)
: m_pComp(comp)
, m_alloc(alloc)
,
@@ -190,16 +186,6 @@ T ValueNumStore::EvalOp(VNFunc vnf, T v0, T v1, ValueNum* pExcSet)
return T(UT(v0) - UT(v1));
case VNF_MUL_UN:
return T(UT(v0) * UT(v1));
- case VNF_DIV_UN:
- if (IsIntZero(v1))
- {
- *pExcSet = VNExcSetSingleton(VNForFunc(TYP_REF, VNF_DivideByZeroExc));
- return (T)0;
- }
- else
- {
- return T(UT(v0) / UT(v1));
- }
default:
// Must be int-specific
return EvalOpIntegral(vnf, v0, v1, pExcSet);
@@ -666,8 +652,11 @@ bool ValueNumStore::IsSharedStatic(ValueNum vn)
return GetVNFunc(vn, &funcAttr) && (s_vnfOpAttribs[funcAttr.m_func] & VNFOA_SharedStatic) != 0;
}
-ValueNumStore::Chunk::Chunk(
- IAllocator* alloc, ValueNum* pNextBaseVN, var_types typ, ChunkExtraAttribs attribs, BasicBlock::loopNumber loopNum)
+ValueNumStore::Chunk::Chunk(CompAllocator* alloc,
+ ValueNum* pNextBaseVN,
+ var_types typ,
+ ChunkExtraAttribs attribs,
+ BasicBlock::loopNumber loopNum)
: m_defs(nullptr), m_numUsed(0), m_baseVN(*pNextBaseVN), m_typ(typ), m_attribs(attribs), m_loopNum(loopNum)
{
// Allocate "m_defs" here, according to the typ/attribs pair.
@@ -4273,7 +4262,7 @@ void ValueNumStore::RunTests(Compiler* comp)
}
#endif // DEBUG
-typedef ExpandArrayStack<BasicBlock*> BlockStack;
+typedef JitExpandArrayStack<BasicBlock*> BlockStack;
// This represents the "to do" state of the value number computation.
struct ValueNumberState
@@ -7919,8 +7908,8 @@ bool Compiler::fgValueNumberHelperCall(GenTreeCall* call)
// TODO-Cleanup: new JitTestLabels for lib vs cons vs both VN classes?
void Compiler::JitTestCheckVN()
{
- typedef SimplerHashTable<ssize_t, SmallPrimitiveKeyFuncs<ssize_t>, ValueNum, JitSimplerHashBehavior> LabelToVNMap;
- typedef SimplerHashTable<ValueNum, SmallPrimitiveKeyFuncs<ValueNum>, ssize_t, JitSimplerHashBehavior> VNToLabelMap;
+ typedef JitHashTable<ssize_t, JitSmallPrimitiveKeyFuncs<ssize_t>, ValueNum> LabelToVNMap;
+ typedef JitHashTable<ValueNum, JitSmallPrimitiveKeyFuncs<ValueNum>, ssize_t> VNToLabelMap;
// If we have no test data, early out.
if (m_nodeTestData == nullptr)
@@ -7931,7 +7920,7 @@ void Compiler::JitTestCheckVN()
NodeToTestDataMap* testData = GetNodeTestData();
// First we have to know which nodes in the tree are reachable.
- typedef SimplerHashTable<GenTreePtr, PtrKeyFuncs<GenTree>, int, JitSimplerHashBehavior> NodeToIntMap;
+ typedef JitHashTable<GenTreePtr, JitPtrKeyFuncs<GenTree>, int> NodeToIntMap;
NodeToIntMap* reachable = FindReachableNodesInNodeTestData();
LabelToVNMap* labelToVN = new (getAllocatorDebugOnly()) LabelToVNMap(getAllocatorDebugOnly());
diff --git a/src/jit/valuenum.h b/src/jit/valuenum.h
index ac7e52e76c..141d86a2c9 100644
--- a/src/jit/valuenum.h
+++ b/src/jit/valuenum.h
@@ -99,26 +99,26 @@ public:
// VNMap - map from something to ValueNum, where something is typically a constant value or a VNFunc
// This class has two purposes - to abstract the implementation and to validate the ValueNums
// being stored or retrieved.
- template <class fromType, class keyfuncs = LargePrimitiveKeyFuncs<fromType>>
- class VNMap : public SimplerHashTable<fromType, keyfuncs, ValueNum, JitSimplerHashBehavior>
+ template <class fromType, class keyfuncs = JitLargePrimitiveKeyFuncs<fromType>>
+ class VNMap : public JitHashTable<fromType, keyfuncs, ValueNum>
{
public:
- VNMap(IAllocator* alloc) : SimplerHashTable<fromType, keyfuncs, ValueNum, JitSimplerHashBehavior>(alloc)
+ VNMap(CompAllocator* alloc) : JitHashTable<fromType, keyfuncs, ValueNum>(alloc)
{
}
~VNMap()
{
- ~VNMap<fromType, keyfuncs>::SimplerHashTable();
+ ~VNMap<fromType, keyfuncs>::JitHashTable();
}
bool Set(fromType k, ValueNum val)
{
assert(val != RecursiveVN);
- return SimplerHashTable<fromType, keyfuncs, ValueNum, JitSimplerHashBehavior>::Set(k, val);
+ return JitHashTable<fromType, keyfuncs, ValueNum>::Set(k, val);
}
bool Lookup(fromType k, ValueNum* pVal = nullptr) const
{
- bool result = SimplerHashTable<fromType, keyfuncs, ValueNum, JitSimplerHashBehavior>::Lookup(k, pVal);
+ bool result = JitHashTable<fromType, keyfuncs, ValueNum>::Lookup(k, pVal);
assert(!result || *pVal != RecursiveVN);
return result;
}
@@ -128,7 +128,7 @@ private:
Compiler* m_pComp;
// For allocations. (Other things?)
- IAllocator* m_alloc;
+ CompAllocator* m_alloc;
// TODO-Cleanup: should transform "attribs" into a struct with bit fields. That would be simpler...
@@ -234,7 +234,7 @@ public:
static void InitValueNumStoreStatics();
// Initialize an empty ValueNumStore.
- ValueNumStore(Compiler* comp, IAllocator* allocator);
+ ValueNumStore(Compiler* comp, CompAllocator* allocator);
// Returns "true" iff "vnf" (which may have been created by a cast from an integral value) represents
// a legal value number function.
@@ -907,7 +907,7 @@ private:
// Initialize a chunk, starting at "*baseVN", for the given "typ", "attribs", and "loopNum" (using "alloc" for
// allocations).
// (Increments "*baseVN" by ChunkSize.)
- Chunk(IAllocator* alloc,
+ Chunk(CompAllocator* alloc,
ValueNum* baseVN,
var_types typ,
ChunkExtraAttribs attribs,
@@ -928,7 +928,7 @@ private:
};
};
- struct VNHandle : public KeyFuncsDefEquals<VNHandle>
+ struct VNHandle : public JitKeyFuncsDefEquals<VNHandle>
{
ssize_t m_cnsVal;
unsigned m_flags;
@@ -1042,7 +1042,7 @@ private:
// So we have to be careful about breaking infinite recursion. We can ignore "recursive" results -- if all the
// non-recursive results are the same, the recursion indicates that the loop structure didn't alter the result.
// This stack represents the set of outer phis such that select(phi, ind) is being evaluated.
- ExpandArrayStack<VNDefFunc2Arg> m_fixedPointMapSels;
+ JitExpandArrayStack<VNDefFunc2Arg> m_fixedPointMapSels;
#ifdef DEBUG
// Returns "true" iff "m_fixedPointMapSels" is non-empty, and it's top element is
@@ -1057,7 +1057,7 @@ private:
CheckedBoundVNSet m_checkedBoundVNs;
// This is a map from "chunk number" to the attributes of the chunk.
- ExpandArrayStack<Chunk*> m_chunks;
+ JitExpandArrayStack<Chunk*> m_chunks;
// These entries indicate the current allocation chunk, if any, for each valid combination of <var_types,
// ChunkExtraAttribute, loopNumber>. Valid combinations require attribs==CEA_None or loopNum==MAX_LOOP_NUM.
@@ -1143,7 +1143,7 @@ private:
return m_handleMap;
}
- struct LargePrimitiveKeyFuncsFloat : public LargePrimitiveKeyFuncs<float>
+ struct LargePrimitiveKeyFuncsFloat : public JitLargePrimitiveKeyFuncs<float>
{
static bool Equals(float x, float y)
{
@@ -1163,7 +1163,7 @@ private:
}
// In the JIT we need to distinguish -0.0 and 0.0 for optimizations.
- struct LargePrimitiveKeyFuncsDouble : public LargePrimitiveKeyFuncs<double>
+ struct LargePrimitiveKeyFuncsDouble : public JitLargePrimitiveKeyFuncs<double>
{
static bool Equals(double x, double y)
{
@@ -1192,7 +1192,7 @@ private:
return m_byrefCnsMap;
}
- struct VNDefFunc0ArgKeyFuncs : public KeyFuncsDefEquals<VNDefFunc1Arg>
+ struct VNDefFunc0ArgKeyFuncs : public JitKeyFuncsDefEquals<VNDefFunc1Arg>
{
static unsigned GetHashCode(VNDefFunc1Arg val)
{
@@ -1210,7 +1210,7 @@ private:
return m_VNFunc0Map;
}
- struct VNDefFunc1ArgKeyFuncs : public KeyFuncsDefEquals<VNDefFunc1Arg>
+ struct VNDefFunc1ArgKeyFuncs : public JitKeyFuncsDefEquals<VNDefFunc1Arg>
{
static unsigned GetHashCode(VNDefFunc1Arg val)
{
@@ -1228,7 +1228,7 @@ private:
return m_VNFunc1Map;
}
- struct VNDefFunc2ArgKeyFuncs : public KeyFuncsDefEquals<VNDefFunc2Arg>
+ struct VNDefFunc2ArgKeyFuncs : public JitKeyFuncsDefEquals<VNDefFunc2Arg>
{
static unsigned GetHashCode(VNDefFunc2Arg val)
{
@@ -1246,7 +1246,7 @@ private:
return m_VNFunc2Map;
}
- struct VNDefFunc3ArgKeyFuncs : public KeyFuncsDefEquals<VNDefFunc3Arg>
+ struct VNDefFunc3ArgKeyFuncs : public JitKeyFuncsDefEquals<VNDefFunc3Arg>
{
static unsigned GetHashCode(VNDefFunc3Arg val)
{
@@ -1264,7 +1264,7 @@ private:
return m_VNFunc3Map;
}
- struct VNDefFunc4ArgKeyFuncs : public KeyFuncsDefEquals<VNDefFunc4Arg>
+ struct VNDefFunc4ArgKeyFuncs : public JitKeyFuncsDefEquals<VNDefFunc4Arg>
{
static unsigned GetHashCode(VNDefFunc4Arg val)
{
diff --git a/src/jit/valuenumfuncs.h b/src/jit/valuenumfuncs.h
index a1372182c8..34973480a2 100644
--- a/src/jit/valuenumfuncs.h
+++ b/src/jit/valuenumfuncs.h
@@ -136,8 +136,6 @@ ValueNumFuncDef(GT_UN, 2, false, false, false)
ValueNumFuncDef(ADD_UN, 2, true, false, false)
ValueNumFuncDef(SUB_UN, 2, false, false, false)
ValueNumFuncDef(MUL_UN, 2, true, false, false)
-ValueNumFuncDef(DIV_UN, 2, false, false, false)
-ValueNumFuncDef(MOD_UN, 2, false, false, false)
ValueNumFuncDef(StrCns, 2, false, true, false)
diff --git a/src/mscorlib/System.Private.CoreLib.csproj b/src/mscorlib/System.Private.CoreLib.csproj
index 72368f0c08..7f8cf705eb 100644
--- a/src/mscorlib/System.Private.CoreLib.csproj
+++ b/src/mscorlib/System.Private.CoreLib.csproj
@@ -325,7 +325,6 @@
<Compile Include="$(BclSourcesRoot)\System\OutOfMemoryException.cs" />
<Compile Include="$(BclSourcesRoot)\System\Delegate.cs" />
<Compile Include="$(BclSourcesRoot)\System\MulticastDelegate.cs" />
- <Compile Include="$(BclSourcesRoot)\System\BCLDebug.cs" />
<Compile Include="$(BclSourcesRoot)\System\Activator.cs" />
<Compile Include="$(BclSourcesRoot)\System\AppDomain.cs" />
<Compile Include="$(BclSourcesRoot)\System\AppDomainSetup.cs" />
@@ -532,15 +531,9 @@
<Compile Include="$(BclSourcesRoot)\System\Security\DynamicSecurityMethodAttribute.cs" />
</ItemGroup>
<ItemGroup>
- <Compile Include="$(BclSourcesRoot)\System\Diagnostics\Assert.cs" />
- <Compile Include="$(BclSourcesRoot)\System\Diagnostics\AssertFilter.cs" />
- <Compile Include="$(BclSourcesRoot)\System\Diagnostics\AssertFilters.cs" />
<Compile Include="$(BclSourcesRoot)\System\Diagnostics\Debugger.cs" />
<Compile Include="$(BclSourcesRoot)\System\Diagnostics\DebuggerAttributes.cs" />
<Compile Include="$(BclSourcesRoot)\System\Diagnostics\ICustomDebuggerNotification.cs" />
- <Compile Include="$(BclSourcesRoot)\System\Diagnostics\log.cs" />
- <Compile Include="$(BclSourcesRoot)\System\Diagnostics\LoggingLevels.cs" />
- <Compile Include="$(BclSourcesRoot)\System\Diagnostics\LogSwitch.cs" />
<Compile Include="$(BclSourcesRoot)\System\Diagnostics\Stacktrace.cs" />
<Compile Include="$(BclSourcesRoot)\System\Diagnostics\Stackframe.cs" />
<Compile Include="$(BclSourcesRoot)\System\Diagnostics\EditAndContinueHelper.cs" />
diff --git a/src/mscorlib/shared/System/Byte.cs b/src/mscorlib/shared/System/Byte.cs
index eaa47b6843..e32ab2b11d 100644
--- a/src/mscorlib/shared/System/Byte.cs
+++ b/src/mscorlib/shared/System/Byte.cs
@@ -132,6 +132,15 @@ namespace System
return TryParse(s.AsReadOnlySpan(), NumberStyles.Integer, NumberFormatInfo.CurrentInfo, out result);
}
+ public static bool TryParse(ReadOnlySpan<char> s, out byte result)
+ {
+ return TryParse(s, NumberStyles.Integer, NumberFormatInfo.CurrentInfo, out result);
+ }
+
+ // TODO https://github.com/dotnet/corefx/issues/23642: Remove once corefx has been updated with new overloads.
+ public static bool TryParse(ReadOnlySpan<char> s, out byte result, NumberStyles style = NumberStyles.Integer, IFormatProvider provider = null) =>
+ TryParse(s, style, provider, out result);
+
public static bool TryParse(String s, NumberStyles style, IFormatProvider provider, out Byte result)
{
NumberFormatInfo.ValidateParseStyleInteger(style);
@@ -145,7 +154,7 @@ namespace System
return TryParse(s.AsReadOnlySpan(), style, NumberFormatInfo.GetInstance(provider), out result);
}
- public static bool TryParse(ReadOnlySpan<char> s, out byte result, NumberStyles style = NumberStyles.Integer, IFormatProvider provider = null)
+ public static bool TryParse(ReadOnlySpan<char> s, NumberStyles style, IFormatProvider provider, out byte result)
{
NumberFormatInfo.ValidateParseStyleInteger(style);
return TryParse(s, style, NumberFormatInfo.GetInstance(provider), out result);
diff --git a/src/mscorlib/shared/System/Double.cs b/src/mscorlib/shared/System/Double.cs
index 363c896fa8..610aa61fc2 100644
--- a/src/mscorlib/shared/System/Double.cs
+++ b/src/mscorlib/shared/System/Double.cs
@@ -306,6 +306,11 @@ namespace System
return TryParse(s.AsReadOnlySpan(), NumberStyles.Float | NumberStyles.AllowThousands, NumberFormatInfo.CurrentInfo, out result);
}
+ public static bool TryParse(ReadOnlySpan<char> s, out double result)
+ {
+ return TryParse(s, NumberStyles.Float | NumberStyles.AllowThousands, NumberFormatInfo.CurrentInfo, out result);
+ }
+
public static bool TryParse(String s, NumberStyles style, IFormatProvider provider, out double result)
{
NumberFormatInfo.ValidateParseStyleFloatingPoint(style);
@@ -319,7 +324,11 @@ namespace System
return TryParse(s.AsReadOnlySpan(), style, NumberFormatInfo.GetInstance(provider), out result);
}
- public static bool TryParse(ReadOnlySpan<char> s, out double result, NumberStyles style = NumberStyles.Integer, IFormatProvider provider = null)
+ // TODO https://github.com/dotnet/corefx/issues/23642: Remove once corefx has been updated with new overloads.
+ public static bool TryParse(ReadOnlySpan<char> s, out double result, NumberStyles style = NumberStyles.Integer, IFormatProvider provider = null) =>
+ TryParse(s, style, provider, out result);
+
+ public static bool TryParse(ReadOnlySpan<char> s, NumberStyles style, IFormatProvider provider, out double result)
{
NumberFormatInfo.ValidateParseStyleFloatingPoint(style);
return TryParse(s, style, NumberFormatInfo.GetInstance(provider), out result);
diff --git a/src/mscorlib/shared/System/Globalization/DateTimeParse.cs b/src/mscorlib/shared/System/Globalization/DateTimeParse.cs
index ca6fe635b8..756211f2c7 100644
--- a/src/mscorlib/shared/System/Globalization/DateTimeParse.cs
+++ b/src/mscorlib/shared/System/Globalization/DateTimeParse.cs
@@ -620,17 +620,9 @@ new DS[] { DS.ERROR, DS.TX_NNN, DS.TX_NNN, DS.TX_NNN, DS.ERROR, DS.ERROR,
str.GetRegularToken(out tokenType, out tokenValue, dtfi);
#if _LOGGING
- // Builds with _LOGGING defined (x86dbg, amd64chk, etc) support tracing
- // Set the following internal-only/unsupported environment variables to enable DateTime tracing to the console:
- //
- // COMPlus_LogEnable=1
- // COMPlus_LogToConsole=1
- // COMPlus_LogLevel=9
- // COMPlus_ManagedLogFacility=0x00001000
if (_tracingEnabled)
{
- BCLDebug.Trace("DATETIME", "[DATETIME] Lex({0})\tpos:{1}({2}), {3}, DS.{4}", Hex(str.Value),
- str.Index, Hex(str.m_current), tokenType, dps);
+ Trace($"Lex({Hex(str.Value)})\tpos:{str.Index}({Hex(str.m_current)}), {tokenType}, DS.{dps}");
}
#endif // _LOGGING
@@ -4652,66 +4644,59 @@ new DS[] { DS.ERROR, DS.TX_NNN, DS.TX_NNN, DS.TX_NNN, DS.ERROR, DS.ERROR,
}
}
- // Builds with _LOGGING defined (x86dbg, amd64chk, etc) support tracing
- // Set the following internal-only/unsupported environment variables to enable DateTime tracing to the console:
- //
- // COMPlus_LogEnable=1
- // COMPlus_LogToConsole=1
- // COMPlus_LogLevel=9
- // COMPlus_ManagedLogFacility=0x00001000
[Conditional("_LOGGING")]
- internal static void LexTraceExit(string message, DS dps)
+ private static void LexTraceExit(string message, DS dps)
{
#if _LOGGING
if (!_tracingEnabled)
return;
- BCLDebug.Trace("DATETIME", "[DATETIME] Lex return {0}, DS.{1}", message, dps);
+ Trace($"Lex return {message}, DS.{dps}");
#endif // _LOGGING
}
[Conditional("_LOGGING")]
- internal static void PTSTraceExit(DS dps, bool passed)
+ private static void PTSTraceExit(DS dps, bool passed)
{
#if _LOGGING
if (!_tracingEnabled)
return;
- BCLDebug.Trace("DATETIME", "[DATETIME] ProcessTerminalState {0} @ DS.{1}", passed ? "passed" : "failed", dps);
+ Trace($"ProcessTerminalState {(passed ? "passed" : "failed")} @ DS.{dps}");
#endif // _LOGGING
}
[Conditional("_LOGGING")]
- internal static void TPTraceExit(string message, DS dps)
+ private static void TPTraceExit(string message, DS dps)
{
#if _LOGGING
if (!_tracingEnabled)
return;
- BCLDebug.Trace("DATETIME", "[DATETIME] TryParse return {0}, DS.{1}", message, dps);
+ Trace($"TryParse return {message}, DS.{dps}");
#endif // _LOGGING
}
[Conditional("_LOGGING")]
- internal static void DTFITrace(DateTimeFormatInfo dtfi)
+ private static void DTFITrace(DateTimeFormatInfo dtfi)
{
#if _LOGGING
if (!_tracingEnabled)
return;
- BCLDebug.Trace("DATETIME", "[DATETIME] DateTimeFormatInfo Properties");
+ Trace("DateTimeFormatInfo Properties");
#if !FEATURE_COREFX_GLOBALIZATION
- BCLDebug.Trace("DATETIME", " NativeCalendarName {0}", Hex(dtfi.NativeCalendarName));
+ Trace($" NativeCalendarName {Hex(dtfi.NativeCalendarName)}");
#endif
- BCLDebug.Trace("DATETIME", " AMDesignator {0}", Hex(dtfi.AMDesignator));
- BCLDebug.Trace("DATETIME", " PMDesignator {0}", Hex(dtfi.PMDesignator));
- BCLDebug.Trace("DATETIME", " TimeSeparator {0}", Hex(dtfi.TimeSeparator));
- BCLDebug.Trace("DATETIME", " AbbrvDayNames {0}", Hex(dtfi.AbbreviatedDayNames));
- BCLDebug.Trace("DATETIME", " ShortestDayNames {0}", Hex(dtfi.ShortestDayNames));
- BCLDebug.Trace("DATETIME", " DayNames {0}", Hex(dtfi.DayNames));
- BCLDebug.Trace("DATETIME", " AbbrvMonthNames {0}", Hex(dtfi.AbbreviatedMonthNames));
- BCLDebug.Trace("DATETIME", " MonthNames {0}", Hex(dtfi.MonthNames));
- BCLDebug.Trace("DATETIME", " AbbrvMonthGenNames {0}", Hex(dtfi.AbbreviatedMonthGenitiveNames));
- BCLDebug.Trace("DATETIME", " MonthGenNames {0}", Hex(dtfi.MonthGenitiveNames));
+ Trace($" AMDesignator {Hex(dtfi.AMDesignator)}");
+ Trace($" PMDesignator {Hex(dtfi.PMDesignator)}");
+ Trace($" TimeSeparator {Hex(dtfi.TimeSeparator)}");
+ Trace($" AbbrvDayNames {Hex(dtfi.AbbreviatedDayNames)}");
+ Trace($" ShortestDayNames {Hex(dtfi.ShortestDayNames)}");
+ Trace($" DayNames {Hex(dtfi.DayNames)}");
+ Trace($" AbbrvMonthNames {Hex(dtfi.AbbreviatedMonthNames)}");
+ Trace($" MonthNames {Hex(dtfi.MonthNames)}");
+ Trace($" AbbrvMonthGenNames {Hex(dtfi.AbbreviatedMonthGenitiveNames)}");
+ Trace($" MonthGenNames {Hex(dtfi.MonthGenitiveNames)}");
#endif // _LOGGING
}
#if _LOGGING
// return a string in the form: "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
- internal static string Hex(string[] strs)
+ private static string Hex(string[] strs)
{
if (strs == null || strs.Length == 0)
return String.Empty;
@@ -4764,8 +4749,8 @@ new DS[] { DS.ERROR, DS.TX_NNN, DS.TX_NNN, DS.TX_NNN, DS.ERROR, DS.ERROR,
return buffer.ToString();
}
// return a string in the form: "Sun"
- internal static string Hex(string str) => Hex(str.AsReadOnlySpan());
- internal static string Hex(ReadOnlySpan<char> str)
+ private static string Hex(string str) => Hex(str.AsReadOnlySpan());
+ private static string Hex(ReadOnlySpan<char> str)
{
StringBuilder buffer = new StringBuilder();
buffer.Append("\"");
@@ -4780,7 +4765,7 @@ new DS[] { DS.ERROR, DS.TX_NNN, DS.TX_NNN, DS.TX_NNN, DS.ERROR, DS.ERROR,
return buffer.ToString();
}
// return an unicode escaped string form of char c
- internal static String Hex(char c)
+ private static String Hex(char c)
{
if (c <= '\x007f')
return c.ToString(CultureInfo.InvariantCulture);
@@ -4788,7 +4773,12 @@ new DS[] { DS.ERROR, DS.TX_NNN, DS.TX_NNN, DS.TX_NNN, DS.ERROR, DS.ERROR,
return "\\u" + ((int)c).ToString("x4", CultureInfo.InvariantCulture);
}
- internal static bool _tracingEnabled = BCLDebug.CheckEnabled("DATETIME");
+ private static void Trace(string s)
+ {
+ // Internal.Console.WriteLine(s);
+ }
+
+ private static bool _tracingEnabled = false;
#endif // _LOGGING
}
diff --git a/src/mscorlib/shared/System/Globalization/JapaneseCalendar.Win32.cs b/src/mscorlib/shared/System/Globalization/JapaneseCalendar.Win32.cs
index 94e0668de1..9ea6c21c2e 100644
--- a/src/mscorlib/shared/System/Globalization/JapaneseCalendar.Win32.cs
+++ b/src/mscorlib/shared/System/Globalization/JapaneseCalendar.Win32.cs
@@ -160,9 +160,9 @@ namespace System.Globalization
int day;
ReadOnlySpan<char> valueSpan = value.AsReadOnlySpan();
- if (!Int32.TryParse(valueSpan.Slice(0, 4), out year, style:NumberStyles.None, provider: NumberFormatInfo.InvariantInfo) ||
- !Int32.TryParse(valueSpan.Slice(5, 2), out month, style:NumberStyles.None, provider: NumberFormatInfo.InvariantInfo) ||
- !Int32.TryParse(valueSpan.Slice(8, 2), out day, style:NumberStyles.None, provider: NumberFormatInfo.InvariantInfo))
+ if (!Int32.TryParse(valueSpan.Slice(0, 4), NumberStyles.None, NumberFormatInfo.InvariantInfo, out year) ||
+ !Int32.TryParse(valueSpan.Slice(5, 2), NumberStyles.None, NumberFormatInfo.InvariantInfo, out month) ||
+ !Int32.TryParse(valueSpan.Slice(8, 2), NumberStyles.None, NumberFormatInfo.InvariantInfo, out day))
{
// Couldn't convert integer, fail
return null;
diff --git a/src/mscorlib/shared/System/Int16.cs b/src/mscorlib/shared/System/Int16.cs
index 296b3d2d40..fb0aa1110e 100644
--- a/src/mscorlib/shared/System/Int16.cs
+++ b/src/mscorlib/shared/System/Int16.cs
@@ -167,6 +167,11 @@ namespace System
return TryParse(s.AsReadOnlySpan(), NumberStyles.Integer, NumberFormatInfo.CurrentInfo, out result);
}
+ public static bool TryParse(ReadOnlySpan<char> s, out short result)
+ {
+ return TryParse(s, NumberStyles.Integer, NumberFormatInfo.CurrentInfo, out result);
+ }
+
public static bool TryParse(String s, NumberStyles style, IFormatProvider provider, out Int16 result)
{
NumberFormatInfo.ValidateParseStyleInteger(style);
@@ -180,7 +185,11 @@ namespace System
return TryParse(s.AsReadOnlySpan(), style, NumberFormatInfo.GetInstance(provider), out result);
}
- public static bool TryParse(ReadOnlySpan<char> s, out Int16 result, NumberStyles style = NumberStyles.Integer, IFormatProvider provider = null)
+ // TODO https://github.com/dotnet/corefx/issues/23642: Remove once corefx has been updated with new overloads.
+ public static bool TryParse(ReadOnlySpan<char> s, out Int16 result, NumberStyles style = NumberStyles.Integer, IFormatProvider provider = null) =>
+ TryParse(s, style, provider, out result);
+
+ public static bool TryParse(ReadOnlySpan<char> s, NumberStyles style, IFormatProvider provider, out short result)
{
NumberFormatInfo.ValidateParseStyleInteger(style);
return TryParse(s, style, NumberFormatInfo.GetInstance(provider), out result);
diff --git a/src/mscorlib/shared/System/Int32.cs b/src/mscorlib/shared/System/Int32.cs
index 690faf3f36..cb5db68fa1 100644
--- a/src/mscorlib/shared/System/Int32.cs
+++ b/src/mscorlib/shared/System/Int32.cs
@@ -150,6 +150,11 @@ namespace System
return Number.TryParseInt32(s.AsReadOnlySpan(), NumberStyles.Integer, NumberFormatInfo.CurrentInfo, out result);
}
+ public static bool TryParse(ReadOnlySpan<char> s, out int result)
+ {
+ return Number.TryParseInt32(s, NumberStyles.Integer, NumberFormatInfo.CurrentInfo, out result);
+ }
+
// Parses an integer from a String in the given style. Returns false rather
// than throwing exceptin if input is invalid
//
@@ -166,7 +171,11 @@ namespace System
return Number.TryParseInt32(s.AsReadOnlySpan(), style, NumberFormatInfo.GetInstance(provider), out result);
}
- public static bool TryParse(ReadOnlySpan<char> s, out int result, NumberStyles style = NumberStyles.Integer, IFormatProvider provider = null)
+ // TODO https://github.com/dotnet/corefx/issues/23642: Remove once corefx has been updated with new overloads.
+ public static bool TryParse(ReadOnlySpan<char> s, out int result, NumberStyles style = NumberStyles.Integer, IFormatProvider provider = null) =>
+ TryParse(s, style, provider, out result);
+
+ public static bool TryParse(ReadOnlySpan<char> s, NumberStyles style, IFormatProvider provider, out int result)
{
NumberFormatInfo.ValidateParseStyleInteger(style);
return Number.TryParseInt32(s, style, NumberFormatInfo.GetInstance(provider), out result);
diff --git a/src/mscorlib/shared/System/Int64.cs b/src/mscorlib/shared/System/Int64.cs
index 1f1cf13e9c..b6275f4609 100644
--- a/src/mscorlib/shared/System/Int64.cs
+++ b/src/mscorlib/shared/System/Int64.cs
@@ -141,6 +141,11 @@ namespace System
return Number.TryParseInt64(s.AsReadOnlySpan(), NumberStyles.Integer, NumberFormatInfo.CurrentInfo, out result);
}
+ public static bool TryParse(ReadOnlySpan<char> s, out long result)
+ {
+ return Number.TryParseInt64(s, NumberStyles.Integer, NumberFormatInfo.CurrentInfo, out result);
+ }
+
public static Boolean TryParse(String s, NumberStyles style, IFormatProvider provider, out Int64 result)
{
NumberFormatInfo.ValidateParseStyleInteger(style);
@@ -154,7 +159,11 @@ namespace System
return Number.TryParseInt64(s.AsReadOnlySpan(), style, NumberFormatInfo.GetInstance(provider), out result);
}
- public static bool TryParse(ReadOnlySpan<char> s, out long result, NumberStyles style = NumberStyles.Integer, IFormatProvider provider = null)
+ // TODO https://github.com/dotnet/corefx/issues/23642: Remove once corefx has been updated with new overloads.
+ public static bool TryParse(ReadOnlySpan<char> s, out long result, NumberStyles style = NumberStyles.Integer, IFormatProvider provider = null) =>
+ TryParse(s, style, provider, out result);
+
+ public static bool TryParse(ReadOnlySpan<char> s, NumberStyles style, IFormatProvider provider, out long result)
{
NumberFormatInfo.ValidateParseStyleInteger(style);
return Number.TryParseInt64(s, style, NumberFormatInfo.GetInstance(provider), out result);
diff --git a/src/mscorlib/shared/System/SByte.cs b/src/mscorlib/shared/System/SByte.cs
index 5b5c031d5f..1d3fded79f 100644
--- a/src/mscorlib/shared/System/SByte.cs
+++ b/src/mscorlib/shared/System/SByte.cs
@@ -186,6 +186,12 @@ namespace System
}
[CLSCompliant(false)]
+ public static bool TryParse(ReadOnlySpan<char> s, out sbyte result)
+ {
+ return TryParse(s, NumberStyles.Integer, NumberFormatInfo.CurrentInfo, out result);
+ }
+
+ [CLSCompliant(false)]
public static bool TryParse(String s, NumberStyles style, IFormatProvider provider, out SByte result)
{
NumberFormatInfo.ValidateParseStyleInteger(style);
@@ -199,8 +205,13 @@ namespace System
return TryParse(s.AsReadOnlySpan(), style, NumberFormatInfo.GetInstance(provider), out result);
}
+ // TODO https://github.com/dotnet/corefx/issues/23642: Remove once corefx has been updated with new overloads.
+ [CLSCompliant(false)]
+ public static bool TryParse(ReadOnlySpan<char> s, out sbyte result, NumberStyles style = NumberStyles.Integer, IFormatProvider provider = null) =>
+ TryParse(s, style, provider, out result);
+
[CLSCompliant(false)]
- public static bool TryParse(ReadOnlySpan<char> s, out sbyte result, NumberStyles style = NumberStyles.Integer, IFormatProvider provider = null)
+ public static bool TryParse(ReadOnlySpan<char> s, NumberStyles style, IFormatProvider provider, out sbyte result)
{
NumberFormatInfo.ValidateParseStyleInteger(style);
return TryParse(s, style, NumberFormatInfo.GetInstance(provider), out result);
diff --git a/src/mscorlib/shared/System/Single.cs b/src/mscorlib/shared/System/Single.cs
index 14f0ca49ff..fe5f5701e1 100644
--- a/src/mscorlib/shared/System/Single.cs
+++ b/src/mscorlib/shared/System/Single.cs
@@ -296,6 +296,11 @@ namespace System
return TryParse(s.AsReadOnlySpan(), NumberStyles.Float | NumberStyles.AllowThousands, NumberFormatInfo.CurrentInfo, out result);
}
+ public static bool TryParse(ReadOnlySpan<char> s, out float result)
+ {
+ return TryParse(s, NumberStyles.Float | NumberStyles.AllowThousands, NumberFormatInfo.CurrentInfo, out result);
+ }
+
public static Boolean TryParse(String s, NumberStyles style, IFormatProvider provider, out Single result)
{
NumberFormatInfo.ValidateParseStyleFloatingPoint(style);
@@ -309,7 +314,11 @@ namespace System
return TryParse(s.AsReadOnlySpan(), style, NumberFormatInfo.GetInstance(provider), out result);
}
- public static Boolean TryParse(ReadOnlySpan<char> s, out Single result, NumberStyles style = NumberStyles.Integer, IFormatProvider provider = null)
+ // TODO https://github.com/dotnet/corefx/issues/23642: Remove once corefx has been updated with new overloads.
+ public static Boolean TryParse(ReadOnlySpan<char> s, out Single result, NumberStyles style = NumberStyles.Integer, IFormatProvider provider = null) =>
+ TryParse(s, style, provider, out result);
+
+ public static bool TryParse(ReadOnlySpan<char> s, NumberStyles style, IFormatProvider provider, out float result)
{
NumberFormatInfo.ValidateParseStyleFloatingPoint(style);
return TryParse(s, style, NumberFormatInfo.GetInstance(provider), out result);
diff --git a/src/mscorlib/shared/System/TimeSpan.cs b/src/mscorlib/shared/System/TimeSpan.cs
index 639d24b248..b933538cc8 100644
--- a/src/mscorlib/shared/System/TimeSpan.cs
+++ b/src/mscorlib/shared/System/TimeSpan.cs
@@ -366,6 +366,15 @@ namespace System
}
return TimeSpanParse.TryParse(s.AsReadOnlySpan(), null, out result);
}
+ public static bool TryParse(ReadOnlySpan<char> s, out TimeSpan result)
+ {
+ return TimeSpanParse.TryParse(s, null, out result);
+ }
+
+ // TODO https://github.com/dotnet/corefx/issues/23642: Remove once corefx has been updated with new overloads.
+ public static bool TryParse(ReadOnlySpan<char> input, out TimeSpan result, IFormatProvider formatProvider = null) =>
+ TryParse(input, formatProvider, out result);
+
public static Boolean TryParse(String input, IFormatProvider formatProvider, out TimeSpan result)
{
if (input == null)
@@ -375,7 +384,7 @@ namespace System
}
return TimeSpanParse.TryParse(input.AsReadOnlySpan(), formatProvider, out result);
}
- public static bool TryParse(ReadOnlySpan<char> input, out TimeSpan result, IFormatProvider formatProvider = null)
+ public static bool TryParse(ReadOnlySpan<char> input, IFormatProvider formatProvider, out TimeSpan result)
{
return TimeSpanParse.TryParse(input, formatProvider, out result);
}
@@ -388,6 +397,10 @@ namespace System
}
return TimeSpanParse.TryParseExact(input.AsReadOnlySpan(), format, formatProvider, TimeSpanStyles.None, out result);
}
+ public static bool TryParseExact(ReadOnlySpan<char> input, string format, IFormatProvider formatProvider, out TimeSpan result)
+ {
+ return TimeSpanParse.TryParseExact(input, format, formatProvider, TimeSpanStyles.None, out result);
+ }
public static Boolean TryParseExact(String input, String[] formats, IFormatProvider formatProvider, out TimeSpan result)
{
if (input == null)
@@ -397,6 +410,15 @@ namespace System
}
return TimeSpanParse.TryParseExactMultiple(input.AsReadOnlySpan(), formats, formatProvider, TimeSpanStyles.None, out result);
}
+ public static bool TryParseExact(ReadOnlySpan<char> input, string[] formats, IFormatProvider formatProvider, out TimeSpan result)
+ {
+ return TimeSpanParse.TryParseExactMultiple(input, formats, formatProvider, TimeSpanStyles.None, out result);
+ }
+
+ // TODO https://github.com/dotnet/corefx/issues/23642: Remove once corefx has been updated with new overloads.
+ public static bool TryParseExact(ReadOnlySpan<char> input, string format, IFormatProvider formatProvider, out TimeSpan result, TimeSpanStyles styles = TimeSpanStyles.None) =>
+ TryParseExact(input, format, formatProvider, styles, out result);
+
public static Boolean TryParseExact(String input, String format, IFormatProvider formatProvider, TimeSpanStyles styles, out TimeSpan result)
{
ValidateStyles(styles, nameof(styles));
@@ -407,7 +429,7 @@ namespace System
}
return TimeSpanParse.TryParseExact(input.AsReadOnlySpan(), format, formatProvider, styles, out result);
}
- public static bool TryParseExact(ReadOnlySpan<char> input, string format, IFormatProvider formatProvider, out TimeSpan result, TimeSpanStyles styles = TimeSpanStyles.None)
+ public static bool TryParseExact(ReadOnlySpan<char> input, string format, IFormatProvider formatProvider, TimeSpanStyles styles, out TimeSpan result)
{
ValidateStyles(styles, nameof(styles));
return TimeSpanParse.TryParseExact(input, format, formatProvider, styles, out result);
@@ -422,7 +444,12 @@ namespace System
}
return TimeSpanParse.TryParseExactMultiple(input.AsReadOnlySpan(), formats, formatProvider, styles, out result);
}
- public static bool TryParseExact(ReadOnlySpan<char> input, string[] formats, IFormatProvider formatProvider, out TimeSpan result, TimeSpanStyles styles = TimeSpanStyles.None)
+
+ // TODO https://github.com/dotnet/corefx/issues/23642: Remove once corefx has been updated with new overloads.
+ public static bool TryParseExact(ReadOnlySpan<char> input, string[] formats, IFormatProvider formatProvider, out TimeSpan result, TimeSpanStyles styles = TimeSpanStyles.None) =>
+ TryParseExact(input, formats, formatProvider, styles, out result);
+
+ public static bool TryParseExact(ReadOnlySpan<char> input, string[] formats, IFormatProvider formatProvider, TimeSpanStyles styles, out TimeSpan result)
{
ValidateStyles(styles, nameof(styles));
return TimeSpanParse.TryParseExactMultiple(input, formats, formatProvider, styles, out result);
diff --git a/src/mscorlib/shared/System/UInt16.cs b/src/mscorlib/shared/System/UInt16.cs
index d437ad95a6..b06b625569 100644
--- a/src/mscorlib/shared/System/UInt16.cs
+++ b/src/mscorlib/shared/System/UInt16.cs
@@ -155,6 +155,12 @@ namespace System
}
[CLSCompliant(false)]
+ public static bool TryParse(ReadOnlySpan<char> s, out ushort result)
+ {
+ return TryParse(s, NumberStyles.Integer, NumberFormatInfo.CurrentInfo, out result);
+ }
+
+ [CLSCompliant(false)]
public static bool TryParse(String s, NumberStyles style, IFormatProvider provider, out UInt16 result)
{
NumberFormatInfo.ValidateParseStyleInteger(style);
@@ -168,8 +174,13 @@ namespace System
return TryParse(s.AsReadOnlySpan(), style, NumberFormatInfo.GetInstance(provider), out result);
}
+ // TODO https://github.com/dotnet/corefx/issues/23642: Remove once corefx has been updated with new overloads.
+ [CLSCompliant(false)]
+ public static bool TryParse(ReadOnlySpan<char> s, out ushort result, NumberStyles style = NumberStyles.Integer, IFormatProvider provider = null) =>
+ TryParse(s, style, provider, out result);
+
[CLSCompliant(false)]
- public static bool TryParse(ReadOnlySpan<char> s, out ushort result, NumberStyles style = NumberStyles.Integer, IFormatProvider provider = null)
+ public static bool TryParse(ReadOnlySpan<char> s, NumberStyles style, IFormatProvider provider, out ushort result)
{
NumberFormatInfo.ValidateParseStyleInteger(style);
return TryParse(s, style, NumberFormatInfo.GetInstance(provider), out result);
diff --git a/src/mscorlib/shared/System/UInt32.cs b/src/mscorlib/shared/System/UInt32.cs
index ca73b61589..04f459d21d 100644
--- a/src/mscorlib/shared/System/UInt32.cs
+++ b/src/mscorlib/shared/System/UInt32.cs
@@ -147,6 +147,12 @@ namespace System
}
[CLSCompliant(false)]
+ public static bool TryParse(ReadOnlySpan<char> s, out uint result)
+ {
+ return Number.TryParseUInt32(s, NumberStyles.Integer, NumberFormatInfo.CurrentInfo, out result);
+ }
+
+ [CLSCompliant(false)]
public static bool TryParse(String s, NumberStyles style, IFormatProvider provider, out UInt32 result)
{
NumberFormatInfo.ValidateParseStyleInteger(style);
@@ -160,8 +166,13 @@ namespace System
return Number.TryParseUInt32(s.AsReadOnlySpan(), style, NumberFormatInfo.GetInstance(provider), out result);
}
+ // TODO https://github.com/dotnet/corefx/issues/23642: Remove once corefx has been updated with new overloads.
+ [CLSCompliant(false)]
+ public static bool TryParse(ReadOnlySpan<char> s, out UInt32 result, NumberStyles style = NumberStyles.Integer, IFormatProvider provider = null) =>
+ TryParse(s, style, provider, out result);
+
[CLSCompliant(false)]
- public static bool TryParse(ReadOnlySpan<char> s, out UInt32 result, NumberStyles style = NumberStyles.Integer, IFormatProvider provider = null)
+ public static bool TryParse(ReadOnlySpan<char> s, NumberStyles style, IFormatProvider provider, out uint result)
{
NumberFormatInfo.ValidateParseStyleInteger(style);
return Number.TryParseUInt32(s, style, NumberFormatInfo.GetInstance(provider), out result);
diff --git a/src/mscorlib/shared/System/UInt64.cs b/src/mscorlib/shared/System/UInt64.cs
index 75b183ac80..fbaf54200f 100644
--- a/src/mscorlib/shared/System/UInt64.cs
+++ b/src/mscorlib/shared/System/UInt64.cs
@@ -144,6 +144,12 @@ namespace System
}
[CLSCompliant(false)]
+ public static bool TryParse(ReadOnlySpan<char> s, out ulong result)
+ {
+ return Number.TryParseUInt64(s, NumberStyles.Integer, NumberFormatInfo.CurrentInfo, out result);
+ }
+
+ [CLSCompliant(false)]
public static Boolean TryParse(String s, NumberStyles style, IFormatProvider provider, out UInt64 result)
{
NumberFormatInfo.ValidateParseStyleInteger(style);
@@ -157,8 +163,13 @@ namespace System
return Number.TryParseUInt64(s.AsReadOnlySpan(), style, NumberFormatInfo.GetInstance(provider), out result);
}
+ // TODO https://github.com/dotnet/corefx/issues/23642: Remove once corefx has been updated with new overloads.
+ [CLSCompliant(false)]
+ public static Boolean TryParse(ReadOnlySpan<char> s, out UInt64 result, NumberStyles style = NumberStyles.Integer, IFormatProvider provider = null) =>
+ TryParse(s, style, provider, out result);
+
[CLSCompliant(false)]
- public static Boolean TryParse(ReadOnlySpan<char> s, out UInt64 result, NumberStyles style = NumberStyles.Integer, IFormatProvider provider = null)
+ public static bool TryParse(ReadOnlySpan<char> s, NumberStyles style, IFormatProvider provider, out ulong result)
{
NumberFormatInfo.ValidateParseStyleInteger(style);
return Number.TryParseUInt64(s, style, NumberFormatInfo.GetInstance(provider), out result);
diff --git a/src/mscorlib/shared/System/Version.cs b/src/mscorlib/shared/System/Version.cs
index a084f9f5a4..da12b890d7 100644
--- a/src/mscorlib/shared/System/Version.cs
+++ b/src/mscorlib/shared/System/Version.cs
@@ -415,7 +415,7 @@ namespace System
return true;
}
- return int.TryParse(component, out parsedComponent, NumberStyles.Integer, CultureInfo.InvariantCulture) && parsedComponent >= 0;
+ return int.TryParse(component, NumberStyles.Integer, CultureInfo.InvariantCulture, out parsedComponent) && parsedComponent >= 0;
}
public static bool operator ==(Version v1, Version v2)
diff --git a/src/mscorlib/src/Microsoft/Win32/Win32Native.cs b/src/mscorlib/src/Microsoft/Win32/Win32Native.cs
index dab609fcb6..4e47ecce58 100644
--- a/src/mscorlib/src/Microsoft/Win32/Win32Native.cs
+++ b/src/mscorlib/src/Microsoft/Win32/Win32Native.cs
@@ -617,6 +617,7 @@ namespace Microsoft.Win32
internal const int ERROR_BAD_IMPERSONATION_LEVEL = 0x542;
internal const int ERROR_CANT_OPEN_ANONYMOUS = 0x543;
internal const int ERROR_NO_SECURITY_ON_OBJECT = 0x546;
+ internal const int ERROR_NO_SYSTEM_RESOURCES = 0x5AA;
internal const int ERROR_TRUSTED_RELATIONSHIP_FAILURE = 0x6FD;
// Error codes from ntstatus.h
diff --git a/src/mscorlib/src/System/BCLDebug.cs b/src/mscorlib/src/System/BCLDebug.cs
deleted file mode 100644
index e9435aff2f..0000000000
--- a/src/mscorlib/src/System/BCLDebug.cs
+++ /dev/null
@@ -1,279 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-/*============================================================
-**
-**
-**
-** Purpose: Debugging Macros for use in the Base Class Libraries
-**
-**
-============================================================*/
-
-namespace System
-{
- using System.IO;
- using System.Text;
- using System.Diagnostics;
- using Microsoft.Win32;
- using System.Runtime.CompilerServices;
- using System.Runtime.Versioning;
- using System.Security;
-
- internal enum LogLevel
- {
- Trace = 0,
- Status = 20,
- Warning = 40,
- Error = 50,
- Panic = 100,
- }
-
- internal struct SwitchStructure
- {
- internal String name;
- internal int value;
-
- internal SwitchStructure(String n, int v)
- {
- name = n;
- value = v;
- }
- }
-
-
- // Only statics, does not need to be marked with the serializable attribute
- internal static class BCLDebug
- {
- internal static volatile bool m_registryChecked = false;
- internal static volatile bool m_loggingNotEnabled = false;
-
- private static readonly SwitchStructure[] switches = {
- new SwitchStructure("NLS", 0x00000001),
- new SwitchStructure("SER", 0x00000002),
- new SwitchStructure("DYNIL",0x00000004),
- new SwitchStructure("REMOTE",0x00000008),
- new SwitchStructure("BINARY",0x00000010), //Binary Formatter
- new SwitchStructure("SOAP",0x00000020), // Soap Formatter
- new SwitchStructure("REMOTINGCHANNELS",0x00000040),
- new SwitchStructure("CACHE",0x00000080),
- new SwitchStructure("RESMGRFILEFORMAT", 0x00000100), // .resources files
- new SwitchStructure("PERF", 0x00000200),
- new SwitchStructure("CORRECTNESS", 0x00000400),
- new SwitchStructure("MEMORYFAILPOINT", 0x00000800),
- new SwitchStructure("DATETIME", 0x00001000), // System.DateTime managed tracing
- new SwitchStructure("INTEROP", 0x00002000), // Interop tracing
- };
-
- private static readonly LogLevel[] levelConversions = {
- LogLevel.Panic,
- LogLevel.Error,
- LogLevel.Error,
- LogLevel.Warning,
- LogLevel.Warning,
- LogLevel.Status,
- LogLevel.Status,
- LogLevel.Trace,
- LogLevel.Trace,
- LogLevel.Trace,
- LogLevel.Trace
- };
-
- [Conditional("_LOGGING")]
- static public void Log(String message)
- {
- if (AppDomain.CurrentDomain.IsUnloadingForcedFinalize())
- return;
- if (!m_registryChecked)
- {
- CheckRegistry();
- }
- System.Diagnostics.Log.Trace(message);
- System.Diagnostics.Log.Trace(Environment.NewLine);
- }
-
- [Conditional("_LOGGING")]
- static public void Log(String switchName, String message)
- {
- if (AppDomain.CurrentDomain.IsUnloadingForcedFinalize())
- return;
- if (!m_registryChecked)
- {
- CheckRegistry();
- }
- try
- {
- LogSwitch ls;
- ls = LogSwitch.GetSwitch(switchName);
- if (ls != null)
- {
- System.Diagnostics.Log.Trace(ls, message);
- System.Diagnostics.Log.Trace(ls, Environment.NewLine);
- }
- }
- catch
- {
- System.Diagnostics.Log.Trace("Exception thrown in logging." + Environment.NewLine);
- System.Diagnostics.Log.Trace("Switch was: " + ((switchName == null) ? "<null>" : switchName) + Environment.NewLine);
- System.Diagnostics.Log.Trace("Message was: " + ((message == null) ? "<null>" : message) + Environment.NewLine);
- }
- }
-
- //
- // This code gets called during security startup, so we can't go through Marshal to get the values. This is
- // just a small helper in native code instead of that.
- //
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- private extern static int GetRegistryLoggingValues(out bool loggingEnabled, out bool logToConsole, out int logLevel);
-
- private static void CheckRegistry()
- {
- if (AppDomain.CurrentDomain.IsUnloadingForcedFinalize())
- return;
- if (m_registryChecked)
- {
- return;
- }
-
- m_registryChecked = true;
-
- bool loggingEnabled;
- bool logToConsole;
- int logLevel;
- int facilityValue;
- facilityValue = GetRegistryLoggingValues(out loggingEnabled, out logToConsole, out logLevel);
-
- // Note we can get into some recursive situations where we call
- // ourseves recursively through the .cctor. That's why we have the
- // check for levelConversions == null.
- if (!loggingEnabled)
- {
- m_loggingNotEnabled = true;
- }
- if (loggingEnabled && levelConversions != null)
- {
- try
- {
- //The values returned for the logging levels in the registry don't map nicely onto the
- //values which we support internally (which are an approximation of the ones that
- //the System.Diagnostics namespace uses) so we have a quick map.
- Debug.Assert(logLevel >= 0 && logLevel <= 10, "logLevel>=0 && logLevel<=10");
- logLevel = (int)levelConversions[logLevel];
-
- if (facilityValue > 0)
- {
- for (int i = 0; i < switches.Length; i++)
- {
- if ((switches[i].value & facilityValue) != 0)
- {
- LogSwitch L = new LogSwitch(switches[i].name, switches[i].name, System.Diagnostics.Log.GlobalSwitch);
- L.MinimumLevel = (LoggingLevels)logLevel;
- }
- }
- System.Diagnostics.Log.GlobalSwitch.MinimumLevel = (LoggingLevels)logLevel;
- System.Diagnostics.Log.IsConsoleEnabled = logToConsole;
- }
- }
- catch
- {
- //Silently eat any exceptions.
- }
- }
- }
-
- internal static bool CheckEnabled(String switchName)
- {
- if (AppDomain.CurrentDomain.IsUnloadingForcedFinalize())
- return false;
- if (!m_registryChecked)
- CheckRegistry();
- LogSwitch logSwitch = LogSwitch.GetSwitch(switchName);
- if (logSwitch == null)
- {
- return false;
- }
- return ((int)logSwitch.MinimumLevel <= (int)LogLevel.Trace);
- }
-
- private static bool CheckEnabled(String switchName, LogLevel level, out LogSwitch logSwitch)
- {
- if (AppDomain.CurrentDomain.IsUnloadingForcedFinalize())
- {
- logSwitch = null;
- return false;
- }
- logSwitch = LogSwitch.GetSwitch(switchName);
- if (logSwitch == null)
- {
- return false;
- }
- return ((int)logSwitch.MinimumLevel <= (int)level);
- }
-
- [Conditional("_LOGGING")]
- public static void Log(String switchName, LogLevel level, params Object[] messages)
- {
- if (AppDomain.CurrentDomain.IsUnloadingForcedFinalize())
- return;
- //Add code to check if logging is enabled in the registry.
- LogSwitch logSwitch;
-
- if (!m_registryChecked)
- {
- CheckRegistry();
- }
-
- if (!CheckEnabled(switchName, level, out logSwitch))
- {
- return;
- }
-
- StringBuilder sb = StringBuilderCache.Acquire();
-
- for (int i = 0; i < messages.Length; i++)
- {
- String s;
- try
- {
- if (messages[i] == null)
- {
- s = "<null>";
- }
- else
- {
- s = messages[i].ToString();
- }
- }
- catch
- {
- s = "<unable to convert>";
- }
- sb.Append(s);
- }
- System.Diagnostics.Log.LogMessage((LoggingLevels)((int)level), logSwitch, StringBuilderCache.GetStringAndRelease(sb));
- }
-
- [Conditional("_LOGGING")]
- public static void Trace(String switchName, String format, params Object[] messages)
- {
- if (m_loggingNotEnabled)
- {
- return;
- }
-
- LogSwitch logSwitch;
- if (!CheckEnabled(switchName, LogLevel.Trace, out logSwitch))
- {
- return;
- }
-
- StringBuilder sb = StringBuilderCache.Acquire();
- sb.AppendFormat(format, messages);
- sb.Append(Environment.NewLine);
-
- System.Diagnostics.Log.LogMessage(LoggingLevels.TraceLevel0, logSwitch, StringBuilderCache.GetStringAndRelease(sb));
- }
- }
-}
-
diff --git a/src/mscorlib/src/System/Decimal.cs b/src/mscorlib/src/System/Decimal.cs
index e93971d1c0..c2b67d68d6 100644
--- a/src/mscorlib/src/System/Decimal.cs
+++ b/src/mscorlib/src/System/Decimal.cs
@@ -545,6 +545,11 @@ namespace System
return Number.TryParseDecimal(s.AsReadOnlySpan(), NumberStyles.Number, NumberFormatInfo.CurrentInfo, out result);
}
+ public static bool TryParse(ReadOnlySpan<char> s, out decimal result)
+ {
+ return Number.TryParseDecimal(s, NumberStyles.Number, NumberFormatInfo.CurrentInfo, out result);
+ }
+
public static Boolean TryParse(String s, NumberStyles style, IFormatProvider provider, out Decimal result)
{
NumberFormatInfo.ValidateParseStyleFloatingPoint(style);
@@ -558,7 +563,11 @@ namespace System
return Number.TryParseDecimal(s.AsReadOnlySpan(), style, NumberFormatInfo.GetInstance(provider), out result);
}
- public static bool TryParse(ReadOnlySpan<char> s, out decimal result, NumberStyles style = NumberStyles.Integer, IFormatProvider provider = null)
+ // TODO https://github.com/dotnet/corefx/issues/23642: Remove once corefx has been updated with new overloads.
+ public static bool TryParse(ReadOnlySpan<char> s, out decimal result, NumberStyles style = NumberStyles.Integer, IFormatProvider provider = null) =>
+ TryParse(s, style, provider, out result);
+
+ public static bool TryParse(ReadOnlySpan<char> s, NumberStyles style, IFormatProvider provider, out decimal result)
{
NumberFormatInfo.ValidateParseStyleFloatingPoint(style);
return Number.TryParseDecimal(s, style, NumberFormatInfo.GetInstance(provider), out result);
diff --git a/src/mscorlib/src/System/Diagnostics/Assert.cs b/src/mscorlib/src/System/Diagnostics/Assert.cs
deleted file mode 100644
index 3fbbdc9830..0000000000
--- a/src/mscorlib/src/System/Diagnostics/Assert.cs
+++ /dev/null
@@ -1,87 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-using System;
-using System.IO;
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.Versioning;
-using System.Diagnostics.CodeAnalysis;
-
-namespace System.Diagnostics
-{
- // Class which handles code asserts. Asserts are used to explicitly protect
- // assumptions made in the code. In general if an assert fails, it indicates
- // a program bug so is immediately called to the attention of the user.
- // Only static data members, does not need to be marked with the serializable attribute
- internal static class Assert
- {
- internal const int COR_E_FAILFAST = unchecked((int)0x80131623);
- private static AssertFilter Filter;
-
- static Assert()
- {
- Filter = new DefaultFilter();
- }
-
- // Called when an assertion is being made.
- //
- internal static void Check(bool condition, String conditionString, String message)
- {
- if (!condition)
- {
- Fail(conditionString, message, null, COR_E_FAILFAST);
- }
- }
-
- internal static void Fail(String conditionString, String message)
- {
- Fail(conditionString, message, null, COR_E_FAILFAST);
- }
-
- internal static void Fail(String conditionString, String message, String windowTitle, int exitCode)
- {
- Fail(conditionString, message, windowTitle, exitCode, StackTrace.TraceFormat.Normal, 0);
- }
-
- internal static void Fail(String conditionString, String message, int exitCode, StackTrace.TraceFormat stackTraceFormat)
- {
- Fail(conditionString, message, null, exitCode, stackTraceFormat, 0);
- }
-
- internal static void Fail(String conditionString, String message, String windowTitle, int exitCode, StackTrace.TraceFormat stackTraceFormat, int numStackFramesToSkip)
- {
- // get the stacktrace
- StackTrace st = new StackTrace(numStackFramesToSkip, true);
-
- AssertFilters iResult = Filter.AssertFailure(conditionString, message, st, stackTraceFormat, windowTitle);
-
- if (iResult == AssertFilters.FailDebug)
- {
- if (Debugger.IsAttached == true)
- Debugger.Break();
- else
- {
- if (Debugger.Launch() == false)
- {
- throw new InvalidOperationException(
- SR.InvalidOperation_DebuggerLaunchFailed);
- }
- }
- }
- else if (iResult == AssertFilters.FailTerminate)
- {
- // We want to exit the Silverlight application, after displaying a message.
- // Our best known way to emulate this is to exit the process with a known
- // error code. Jolt may not be prepared for an appdomain to be unloaded.
- Environment._Exit(exitCode);
- }
- }
-
- // Called when an assert happens.
- // windowTitle can be null.
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- internal extern static int ShowDefaultAssertDialog(String conditionString, String message, String stackTrace, String windowTitle);
- }
-}
diff --git a/src/mscorlib/src/System/Diagnostics/AssertFilter.cs b/src/mscorlib/src/System/Diagnostics/AssertFilter.cs
deleted file mode 100644
index 39ce93ff51..0000000000
--- a/src/mscorlib/src/System/Diagnostics/AssertFilter.cs
+++ /dev/null
@@ -1,43 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-
-
-using System;
-using System.Runtime.Versioning;
-
-namespace System.Diagnostics
-{
- // A Filter is used to decide whether an assert failure
- // should terminate the program (or invoke the debugger).
- // Typically this is done by popping up a dialog & asking the user.
- //
- // The default filter brings up a simple Win32 dialog with 3 buttons.
-
- abstract internal class AssertFilter
- {
- // Called when an assert fails. This should be overridden with logic which
- // determines whether the program should terminate or not. Typically this
- // is done by asking the user.
- //
- // The windowTitle can be null.
- abstract public AssertFilters AssertFailure(String condition, String message,
- StackTrace location, StackTrace.TraceFormat stackTraceFormat, String windowTitle);
- }
- // No data, does not need to be marked with the serializable attribute
- internal class DefaultFilter : AssertFilter
- {
- internal DefaultFilter()
- {
- }
-
- public override AssertFilters AssertFailure(String condition, String message,
- StackTrace location, StackTrace.TraceFormat stackTraceFormat,
- String windowTitle)
-
- {
- return (AssertFilters)Assert.ShowDefaultAssertDialog(condition, message, location.ToString(stackTraceFormat), windowTitle);
- }
- }
-}
diff --git a/src/mscorlib/src/System/Diagnostics/AssertFilters.cs b/src/mscorlib/src/System/Diagnostics/AssertFilters.cs
deleted file mode 100644
index a97e8839ae..0000000000
--- a/src/mscorlib/src/System/Diagnostics/AssertFilters.cs
+++ /dev/null
@@ -1,26 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-
-/*
- * FailDebug indicates the debugger should be invoked
- * FailIgnore indicates the failure should be ignored & the
- * program continued
- * FailTerminate indicates that the program should be terminated
- * FailContinue indicates that no decision is made -
- * the previous Filter should be invoked
- */
-
-using System;
-
-namespace System.Diagnostics
-{
- internal enum AssertFilters
- {
- FailDebug = 0,
- FailIgnore = 1,
- FailTerminate = 2,
- FailContinueFilter = 3,
- }
-}
diff --git a/src/mscorlib/src/System/Diagnostics/Contracts/Contracts.cs b/src/mscorlib/src/System/Diagnostics/Contracts/Contracts.cs
index dc1dcb67cf..5547684b04 100644
--- a/src/mscorlib/src/System/Diagnostics/Contracts/Contracts.cs
+++ b/src/mscorlib/src/System/Diagnostics/Contracts/Contracts.cs
@@ -17,31 +17,12 @@
===========================================================*/
#define DEBUG // The behavior of this contract library should be consistent regardless of build type.
-#if SILVERLIGHT
-#define FEATURE_UNTRUSTED_CALLERS
-
-#elif REDHAWK_RUNTIME
-
-#elif BARTOK_RUNTIME
-
-#else // CLR
-#define FEATURE_UNTRUSTED_CALLERS
-#define FEATURE_RELIABILITY_CONTRACTS
-#endif
-
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Diagnostics.Contracts;
-#if FEATURE_RELIABILITY_CONTRACTS
-using System.Runtime.ConstrainedExecution;
-#endif
-#if FEATURE_UNTRUSTED_CALLERS
-using System.Security;
-#endif
-
namespace System.Diagnostics.Contracts
{
#region Attributes
@@ -127,37 +108,6 @@ namespace System.Diagnostics.Contracts
{
}
- /*
- [Serializable]
- internal enum Mutability
- {
- Immutable, // read-only after construction, except for lazy initialization & caches
- // Do we need a "deeply immutable" value?
- Mutable,
- HasInitializationPhase, // read-only after some point.
- // Do we need a value for mutable types with read-only wrapper subclasses?
- }
-
- // Note: This hasn't been thought through in any depth yet. Consider it experimental.
- // We should replace this with Joe's concepts.
- [Conditional("CONTRACTS_FULL")]
- [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = false, Inherited = false)]
- [SuppressMessage("Microsoft.Design", "CA1019:DefineAccessorsForAttributeArguments", Justification = "Thank you very much, but we like the names we've defined for the accessors")]
- internal sealed class MutabilityAttribute : Attribute
- {
- private Mutability _mutabilityMarker;
-
- public MutabilityAttribute(Mutability mutabilityMarker)
- {
- _mutabilityMarker = mutabilityMarker;
- }
-
- public Mutability Mutability {
- get { return _mutabilityMarker; }
- }
- }
- */
-
/// <summary>
/// Instructs downstream tools whether to assume the correctness of this assembly, type or member without performing any verification or not.
/// Can use [ContractVerification(false)] to explicitly mark assembly, type or member as one to *not* have verification performed on it.
@@ -189,7 +139,6 @@ namespace System.Diagnostics.Contracts
/// </summary>
[Conditional("CONTRACTS_FULL")]
[AttributeUsage(AttributeTargets.Field)]
- [SuppressMessage("Microsoft.Design", "CA1019:DefineAccessorsForAttributeArguments", Justification = "Thank you very much, but we like the names we've defined for the accessors")]
public sealed class ContractPublicPropertyNameAttribute : Attribute
{
private String _publicName;
@@ -299,8 +248,6 @@ namespace System.Diagnostics.Contracts
[Pure]
[Conditional("DEBUG")]
[Conditional("CONTRACTS_FULL")]
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
public static void Assume(bool condition)
{
if (!condition)
@@ -320,8 +267,6 @@ namespace System.Diagnostics.Contracts
[Pure]
[Conditional("DEBUG")]
[Conditional("CONTRACTS_FULL")]
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
public static void Assume(bool condition, String userMessage)
{
if (!condition)
@@ -341,8 +286,6 @@ namespace System.Diagnostics.Contracts
[Pure]
[Conditional("DEBUG")]
[Conditional("CONTRACTS_FULL")]
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
public static void Assert(bool condition)
{
if (!condition)
@@ -357,8 +300,6 @@ namespace System.Diagnostics.Contracts
[Pure]
[Conditional("DEBUG")]
[Conditional("CONTRACTS_FULL")]
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
public static void Assert(bool condition, String userMessage)
{
if (!condition)
@@ -380,8 +321,6 @@ namespace System.Diagnostics.Contracts
/// </remarks>
[Pure]
[Conditional("CONTRACTS_FULL")]
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
public static void Requires(bool condition)
{
AssertMustUseRewriter(ContractFailureKind.Precondition, "Requires");
@@ -399,8 +338,6 @@ namespace System.Diagnostics.Contracts
/// </remarks>
[Pure]
[Conditional("CONTRACTS_FULL")]
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
public static void Requires(bool condition, String userMessage)
{
AssertMustUseRewriter(ContractFailureKind.Precondition, "Requires");
@@ -415,11 +352,7 @@ namespace System.Diagnostics.Contracts
/// This contract is exposed to clients so must only reference members at least as visible as the enclosing method.
/// Use this form when you want to throw a particular exception.
/// </remarks>
- [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "condition")]
- [SuppressMessage("Microsoft.Design", "CA1004:GenericMethodsShouldProvideTypeParameter")]
[Pure]
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
public static void Requires<TException>(bool condition) where TException : Exception
{
AssertMustUseRewriter(ContractFailureKind.Precondition, "Requires<TException>");
@@ -435,12 +368,7 @@ namespace System.Diagnostics.Contracts
/// This contract is exposed to clients so must only reference members at least as visible as the enclosing method.
/// Use this form when you want to throw a particular exception.
/// </remarks>
- [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "userMessage")]
- [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "condition")]
- [SuppressMessage("Microsoft.Design", "CA1004:GenericMethodsShouldProvideTypeParameter")]
[Pure]
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
public static void Requires<TException>(bool condition, String userMessage) where TException : Exception
{
AssertMustUseRewriter(ContractFailureKind.Precondition, "Requires<TException>");
@@ -461,8 +389,6 @@ namespace System.Diagnostics.Contracts
/// </remarks>
[Pure]
[Conditional("CONTRACTS_FULL")]
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
public static void Ensures(bool condition)
{
AssertMustUseRewriter(ContractFailureKind.Postcondition, "Ensures");
@@ -480,8 +406,6 @@ namespace System.Diagnostics.Contracts
/// </remarks>
[Pure]
[Conditional("CONTRACTS_FULL")]
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
public static void Ensures(bool condition, String userMessage)
{
AssertMustUseRewriter(ContractFailureKind.Postcondition, "Ensures");
@@ -499,9 +423,6 @@ namespace System.Diagnostics.Contracts
/// </remarks>
[Pure]
[Conditional("CONTRACTS_FULL")]
- [SuppressMessage("Microsoft.Design", "CA1004:GenericMethodsShouldProvideTypeParameter", Justification = "Exception type used in tools.")]
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
public static void EnsuresOnThrow<TException>(bool condition) where TException : Exception
{
AssertMustUseRewriter(ContractFailureKind.PostconditionOnException, "EnsuresOnThrow");
@@ -520,9 +441,6 @@ namespace System.Diagnostics.Contracts
/// </remarks>
[Pure]
[Conditional("CONTRACTS_FULL")]
- [SuppressMessage("Microsoft.Design", "CA1004:GenericMethodsShouldProvideTypeParameter", Justification = "Exception type used in tools.")]
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
public static void EnsuresOnThrow<TException>(bool condition, String userMessage) where TException : Exception
{
AssertMustUseRewriter(ContractFailureKind.PostconditionOnException, "EnsuresOnThrow");
@@ -538,10 +456,7 @@ namespace System.Diagnostics.Contracts
/// <remarks>
/// This method can only be used within the argument to the <seealso cref="Ensures(bool)"/> contract.
/// </remarks>
- [SuppressMessage("Microsoft.Design", "CA1004:GenericMethodsShouldProvideTypeParameter", Justification = "Not intended to be called at runtime.")]
[Pure]
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
public static T Result<T>() { return default(T); }
/// <summary>
@@ -553,10 +468,7 @@ namespace System.Diagnostics.Contracts
/// <remarks>
/// This method can only be used within the argument to the <seealso cref="Ensures(bool)"/> contract.
/// </remarks>
- [SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", MessageId = "0#", Justification = "Not intended to be called at runtime.")]
[Pure]
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
public static T ValueAtReturn<T>(out T value) { value = default(T); return value; }
/// <summary>
@@ -568,10 +480,7 @@ namespace System.Diagnostics.Contracts
/// <remarks>
/// This method can only be used within the argument to the <seealso cref="Ensures(bool)"/> contract.
/// </remarks>
- [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "value")]
[Pure]
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
public static T OldValue<T>(T value) { return default(T); }
#endregion Old, Result, and Out Parameters
@@ -591,8 +500,6 @@ namespace System.Diagnostics.Contracts
/// </remarks>
[Pure]
[Conditional("CONTRACTS_FULL")]
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
public static void Invariant(bool condition)
{
AssertMustUseRewriter(ContractFailureKind.Invariant, "Invariant");
@@ -610,8 +517,6 @@ namespace System.Diagnostics.Contracts
/// </remarks>
[Pure]
[Conditional("CONTRACTS_FULL")]
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
public static void Invariant(bool condition, String userMessage)
{
AssertMustUseRewriter(ContractFailureKind.Invariant, "Invariant");
@@ -634,8 +539,6 @@ namespace System.Diagnostics.Contracts
/// starting from <paramref name="fromInclusive"/> to <paramref name="toExclusive"/> - 1.</returns>
/// <seealso cref="System.Collections.Generic.List&lt;T&gt;.TrueForAll"/>
[Pure]
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
public static bool ForAll(int fromInclusive, int toExclusive, Predicate<int> predicate)
{
if (fromInclusive > toExclusive)
@@ -663,8 +566,6 @@ namespace System.Diagnostics.Contracts
/// <paramref name="collection"/>.</returns>
/// <seealso cref="System.Collections.Generic.List&lt;T&gt;.TrueForAll"/>
[Pure]
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
public static bool ForAll<T>(IEnumerable<T> collection, Predicate<T> predicate)
{
if (collection == null)
@@ -692,8 +593,6 @@ namespace System.Diagnostics.Contracts
/// starting from <paramref name="fromInclusive"/> to <paramref name="toExclusive"/> - 1.</returns>
/// <seealso cref="System.Collections.Generic.List&lt;T&gt;.Exists"/>
[Pure]
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
public static bool Exists(int fromInclusive, int toExclusive, Predicate<int> predicate)
{
if (fromInclusive > toExclusive)
@@ -720,8 +619,6 @@ namespace System.Diagnostics.Contracts
/// <paramref name="collection"/>.</returns>
/// <seealso cref="System.Collections.Generic.List&lt;T&gt;.Exists"/>
[Pure]
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
public static bool Exists<T>(IEnumerable<T> collection, Predicate<T> predicate)
{
if (collection == null)
@@ -747,147 +644,22 @@ namespace System.Diagnostics.Contracts
/// Marker to indicate the end of the contract section of a method.
/// </summary>
[Conditional("CONTRACTS_FULL")]
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
public static void EndContractBlock() { }
#endregion
#endregion User Methods
-
- #region Failure Behavior
-
- /// <summary>
- /// Without contract rewriting, failing Assert/Assumes end up calling this method.
- /// Code going through the contract rewriter never calls this method. Instead, the rewriter produced failures call
- /// System.Runtime.CompilerServices.ContractHelper.RaiseContractFailedEvent, followed by
- /// System.Runtime.CompilerServices.ContractHelper.TriggerFailure.
- /// </summary>
- static partial void ReportFailure(ContractFailureKind failureKind, String userMessage, String conditionText, Exception innerException);
-
- /// <summary>
- /// This method is used internally to trigger a failure indicating to the "programmer" that he is using the interface incorrectly.
- /// It is NEVER used to indicate failure of actual contracts at runtime.
- /// </summary>
- static partial void AssertMustUseRewriter(ContractFailureKind kind, String contractKind);
-
- #endregion
}
[System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
public enum ContractFailureKind
{
Precondition,
- [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Postcondition")]
Postcondition,
- [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Postcondition")]
PostconditionOnException,
Invariant,
Assert,
Assume,
}
-}
-
-// Note: In .NET FX 4.5, we duplicated the ContractHelper class in the System.Runtime.CompilerServices
-// namespace to remove an ugly wart of a namespace from the Windows 8 profile. But we still need the
-// old locations left around, so we can support rewritten .NET FX 4.0 libraries. Consider removing
-// these from our reference assembly in a future version.
-namespace System.Diagnostics.Contracts.Internal
-{
- [Obsolete("Use the ContractHelper class in the System.Runtime.CompilerServices namespace instead.")]
- public static class ContractHelper
- {
- #region Rewriter Failure Hooks
-
- /// <summary>
- /// Rewriter will call this method on a contract failure to allow listeners to be notified.
- /// The method should not perform any failure (assert/throw) itself.
- /// </summary>
- /// <returns>null if the event was handled and should not trigger a failure.
- /// Otherwise, returns the localized failure message</returns>
- [SuppressMessage("Microsoft.Design", "CA1030:UseEventsWhereAppropriate")]
- [System.Diagnostics.DebuggerNonUserCode]
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
- public static string RaiseContractFailedEvent(ContractFailureKind failureKind, String userMessage, String conditionText, Exception innerException)
- {
- return System.Runtime.CompilerServices.ContractHelper.RaiseContractFailedEvent(failureKind, userMessage, conditionText, innerException);
- }
-
- /// <summary>
- /// Rewriter calls this method to get the default failure behavior.
- /// </summary>
- [System.Diagnostics.DebuggerNonUserCode]
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
- public static void TriggerFailure(ContractFailureKind kind, String displayMessage, String userMessage, String conditionText, Exception innerException)
- {
- System.Runtime.CompilerServices.ContractHelper.TriggerFailure(kind, displayMessage, userMessage, conditionText, innerException);
- }
-
- #endregion Rewriter Failure Hooks
- }
-} // namespace System.Diagnostics.Contracts.Internal
-
-
-namespace System.Runtime.CompilerServices
-{
- public static partial class ContractHelper
- {
- #region Rewriter Failure Hooks
-
- /// <summary>
- /// Rewriter will call this method on a contract failure to allow listeners to be notified.
- /// The method should not perform any failure (assert/throw) itself.
- /// </summary>
- /// <returns>null if the event was handled and should not trigger a failure.
- /// Otherwise, returns the localized failure message</returns>
- [SuppressMessage("Microsoft.Design", "CA1030:UseEventsWhereAppropriate")]
- [System.Diagnostics.DebuggerNonUserCode]
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
- public static string RaiseContractFailedEvent(ContractFailureKind failureKind, String userMessage, String conditionText, Exception innerException)
- {
- var resultFailureMessage = "Contract failed"; // default in case implementation does not assign anything.
- RaiseContractFailedEventImplementation(failureKind, userMessage, conditionText, innerException, ref resultFailureMessage);
- return resultFailureMessage;
- }
-
-
- /// <summary>
- /// Rewriter calls this method to get the default failure behavior.
- /// </summary>
- [System.Diagnostics.DebuggerNonUserCode]
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
- public static void TriggerFailure(ContractFailureKind kind, String displayMessage, String userMessage, String conditionText, Exception innerException)
- {
- TriggerFailureImplementation(kind, displayMessage, userMessage, conditionText, innerException);
- }
-
- #endregion Rewriter Failure Hooks
-
- #region Implementation Stubs
-
- /// <summary>
- /// Rewriter will call this method on a contract failure to allow listeners to be notified.
- /// The method should not perform any failure (assert/throw) itself.
- /// This method has 3 functions:
- /// 1. Call any contract hooks (such as listeners to Contract failed events)
- /// 2. Determine if the listeners deem the failure as handled (then resultFailureMessage should be set to null)
- /// 3. Produce a localized resultFailureMessage used in advertising the failure subsequently.
- /// </summary>
- /// <param name="resultFailureMessage">Should really be out (or the return value), but partial methods are not flexible enough.
- /// On exit: null if the event was handled and should not trigger a failure.
- /// Otherwise, returns the localized failure message</param>
- static partial void RaiseContractFailedEventImplementation(ContractFailureKind failureKind, String userMessage, String conditionText, Exception innerException, ref string resultFailureMessage);
-
- /// <summary>
- /// Implements the default failure behavior of the platform. Under the BCL, it triggers an Assert box.
- /// </summary>
- static partial void TriggerFailureImplementation(ContractFailureKind kind, String displayMessage, String userMessage, String conditionText, Exception innerException);
-
- #endregion Implementation Stubs
- }
} // namespace System.Runtime.CompilerServices
diff --git a/src/mscorlib/src/System/Diagnostics/Contracts/ContractsBCL.cs b/src/mscorlib/src/System/Diagnostics/Contracts/ContractsBCL.cs
index e7cc2570d9..45cb9bb869 100644
--- a/src/mscorlib/src/System/Diagnostics/Contracts/ContractsBCL.cs
+++ b/src/mscorlib/src/System/Diagnostics/Contracts/ContractsBCL.cs
@@ -11,17 +11,6 @@
===========================================================*/
#define DEBUG // The behavior of this contract library should be consistent regardless of build type.
-#if SILVERLIGHT
-#define FEATURE_UNTRUSTED_CALLERS
-#elif REDHAWK_RUNTIME
-
-#elif BARTOK_RUNTIME
-
-#else // CLR
-#define FEATURE_UNTRUSTED_CALLERS
-#define FEATURE_RELIABILITY_CONTRACTS
-#endif
-
using System;
using System.Collections.Generic;
using System.Diagnostics;
@@ -29,32 +18,18 @@ using System.Diagnostics.CodeAnalysis;
using System.Diagnostics.Contracts;
using System.Reflection;
-#if FEATURE_RELIABILITY_CONTRACTS
-using System.Runtime.ConstrainedExecution;
-#endif
-#if FEATURE_UNTRUSTED_CALLERS
-using System.Security;
-#endif
-
namespace System.Diagnostics.Contracts
{
public static partial class Contract
{
#region Private Methods
- [ThreadStatic]
- private static bool _assertingMustUseRewriter;
-
/// <summary>
/// This method is used internally to trigger a failure indicating to the "programmer" that he is using the interface incorrectly.
/// It is NEVER used to indicate failure of actual contracts at runtime.
/// </summary>
- static partial void AssertMustUseRewriter(ContractFailureKind kind, String contractKind)
+ static void AssertMustUseRewriter(ContractFailureKind kind, String contractKind)
{
- if (_assertingMustUseRewriter)
- System.Diagnostics.Assert.Fail("Asserting that we must use the rewriter went reentrant.", "Didn't rewrite this mscorlib?");
- _assertingMustUseRewriter = true;
-
// For better diagnostics, report which assembly is at fault. Walk up stack and
// find the first non-mscorlib assembly.
Assembly thisAssembly = typeof(Contract).Assembly; // In case we refactor mscorlib, use Contract class instead of Object.
@@ -74,8 +49,6 @@ namespace System.Diagnostics.Contracts
probablyNotRewritten = thisAssembly;
String simpleName = probablyNotRewritten.GetName().Name;
System.Runtime.CompilerServices.ContractHelper.TriggerFailure(kind, SR.Format(SR.MustUseCCRewrite, contractKind, simpleName), null, null, null);
-
- _assertingMustUseRewriter = false;
}
#endregion Private Methods
@@ -88,11 +61,8 @@ namespace System.Diagnostics.Contracts
/// System.Runtime.CompilerServices.ContractHelper.RaiseContractFailedEvent, followed by
/// System.Runtime.CompilerServices.ContractHelper.TriggerFailure.
/// </summary>
- [SuppressMessage("Microsoft.Portability", "CA1903:UseOnlyApiFromTargetedFramework", MessageId = "System.Security.SecuritySafeCriticalAttribute")]
[System.Diagnostics.DebuggerNonUserCode]
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
- static partial void ReportFailure(ContractFailureKind failureKind, String userMessage, String conditionText, Exception innerException)
+ static void ReportFailure(ContractFailureKind failureKind, String userMessage, String conditionText, Exception innerException)
{
if (failureKind < ContractFailureKind.Precondition || failureKind > ContractFailureKind.Assume)
throw new ArgumentException(SR.Format(SR.Arg_EnumIllegalVal, failureKind), nameof(failureKind));
@@ -116,14 +86,10 @@ namespace System.Diagnostics.Contracts
/// </summary>
public static event EventHandler<ContractFailedEventArgs> ContractFailed
{
-#if FEATURE_UNTRUSTED_CALLERS
-#endif
add
{
System.Runtime.CompilerServices.ContractHelper.InternalContractFailed += value;
}
-#if FEATURE_UNTRUSTED_CALLERS
-#endif
remove
{
System.Runtime.CompilerServices.ContractHelper.InternalContractFailed -= value;
@@ -143,8 +109,6 @@ namespace System.Diagnostics.Contracts
internal Exception thrownDuringHandler;
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
public ContractFailedEventArgs(ContractFailureKind failureKind, String message, String condition, Exception originalException)
{
Debug.Assert(originalException == null || failureKind == ContractFailureKind.PostconditionOnException);
@@ -165,8 +129,6 @@ namespace System.Diagnostics.Contracts
get { return _handled; }
}
-#if FEATURE_UNTRUSTED_CALLERS
-#endif
public void SetHandled()
{
_handled = true;
@@ -177,8 +139,6 @@ namespace System.Diagnostics.Contracts
get { return _unwind; }
}
-#if FEATURE_UNTRUSTED_CALLERS
-#endif
public void SetUnwind()
{
_unwind = true;
@@ -187,11 +147,10 @@ namespace System.Diagnostics.Contracts
[Serializable]
[System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")]
-#if CORECLR
- [SuppressMessage("Microsoft.Design", "CA1064:ExceptionsShouldBePublic")]
- internal
-#else
+#if CORERT
public // On CoreRT this must be public to support binary serialization with type forwarding.
+#else
+ internal
#endif
sealed class ContractException : Exception
{
@@ -199,13 +158,9 @@ namespace System.Diagnostics.Contracts
private readonly string _userMessage;
private readonly string _condition;
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public ContractFailureKind Kind { get { return _kind; } }
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public string Failure { get { return this.Message; } }
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public string UserMessage { get { return _userMessage; } }
- [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
public string Condition { get { return _condition; } }
// Called by COM Interop, if we see COR_E_CODECONTRACTFAILED as an HRESULT.
@@ -266,8 +221,6 @@ namespace System.Runtime.CompilerServices
/// </summary>
internal static event EventHandler<ContractFailedEventArgs> InternalContractFailed
{
-#if FEATURE_UNTRUSTED_CALLERS
-#endif
add
{
// Eagerly prepare each event handler _marked with a reliability contract_, to
@@ -283,8 +236,6 @@ namespace System.Runtime.CompilerServices
contractFailedEvent += value;
}
}
-#if FEATURE_UNTRUSTED_CALLERS
-#endif
remove
{
lock (lockObject)
@@ -302,15 +253,10 @@ namespace System.Runtime.CompilerServices
/// 2. Determine if the listeners deem the failure as handled (then resultFailureMessage should be set to null)
/// 3. Produce a localized resultFailureMessage used in advertising the failure subsequently.
/// </summary>
- /// <param name="resultFailureMessage">Should really be out (or the return value), but partial methods are not flexible enough.
/// On exit: null if the event was handled and should not trigger a failure.
/// Otherwise, returns the localized failure message</param>
- [SuppressMessage("Microsoft.Design", "CA1030:UseEventsWhereAppropriate")]
- [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes")]
[System.Diagnostics.DebuggerNonUserCode]
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
- static partial void RaiseContractFailedEventImplementation(ContractFailureKind failureKind, String userMessage, String conditionText, Exception innerException, ref string resultFailureMessage)
+ public static string RaiseContractFailedEvent(ContractFailureKind failureKind, String userMessage, String conditionText, Exception innerException)
{
if (failureKind < ContractFailureKind.Precondition || failureKind > ContractFailureKind.Assume)
throw new ArgumentException(SR.Format(SR.Arg_EnumIllegalVal, failureKind), nameof(failureKind));
@@ -318,9 +264,7 @@ namespace System.Runtime.CompilerServices
string returnValue;
String displayMessage = "contract failed."; // Incomplete, but in case of OOM during resource lookup...
ContractFailedEventArgs eventArgs = null; // In case of OOM.
-#if FEATURE_RELIABILITY_CONTRACTS
- System.Runtime.CompilerServices.RuntimeHelpers.PrepareConstrainedRegions();
-#endif
+
try
{
displayMessage = GetDisplayMessage(failureKind, userMessage, conditionText);
@@ -359,37 +303,22 @@ namespace System.Runtime.CompilerServices
returnValue = displayMessage;
}
}
- resultFailureMessage = returnValue;
+ return returnValue;
}
/// <summary>
/// Rewriter calls this method to get the default failure behavior.
/// </summary>
- [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "conditionText")]
- [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "userMessage")]
- [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "kind")]
- [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "innerException")]
[System.Diagnostics.DebuggerNonUserCode]
- static partial void TriggerFailureImplementation(ContractFailureKind kind, String displayMessage, String userMessage, String conditionText, Exception innerException)
+ public static void TriggerFailure(ContractFailureKind kind, String displayMessage, String userMessage, String conditionText, Exception innerException)
{
- // If we're here, our intent is to pop up a dialog box (if we can). For developers
- // interacting live with a debugger, this is a good experience. For Silverlight
- // hosted in Internet Explorer, the assert window is great. If we cannot
- // pop up a dialog box, throw an exception (consider a library compiled with
- // "Assert On Failure" but used in a process that can't pop up asserts, like an
- // NT Service).
-
- if (!Environment.UserInteractive)
+ if (string.IsNullOrEmpty(displayMessage))
{
- throw new ContractException(kind, displayMessage, userMessage, conditionText, innerException);
+ displayMessage = GetDisplayMessage(kind, userMessage, conditionText);
}
- // May need to rethink Assert.Fail w/ TaskDialogIndirect as a model. Window title. Main instruction. Content. Expanded info.
- // Optional info like string for collapsed text vs. expanded text.
- String windowTitle = SR.GetResourceString(GetResourceNameForFailure(kind));
- const int numStackFramesToSkip = 2; // To make stack traces easier to read
- System.Diagnostics.Assert.Fail(conditionText, displayMessage, windowTitle, COR_E_CODECONTRACTFAILED, StackTrace.TraceFormat.Normal, numStackFramesToSkip);
- // If we got here, the user selected Ignore. Continue.
+ // TODO: https://github.com/dotnet/coreclr/issues/14867
+ System.Diagnostics.Debug.Fail(displayMessage);
}
private static String GetResourceNameForFailure(ContractFailureKind failureKind)
@@ -429,8 +358,6 @@ namespace System.Runtime.CompilerServices
return resourceName;
}
-#if FEATURE_RELIABILITY_CONTRACTS
-#endif
private static String GetDisplayMessage(ContractFailureKind failureKind, String userMessage, String conditionText)
{
String resourceName = GetResourceNameForFailure(failureKind);
diff --git a/src/mscorlib/src/System/Diagnostics/LogSwitch.cs b/src/mscorlib/src/System/Diagnostics/LogSwitch.cs
deleted file mode 100644
index 5382c37547..0000000000
--- a/src/mscorlib/src/System/Diagnostics/LogSwitch.cs
+++ /dev/null
@@ -1,123 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-using System;
-using System.IO;
-using System.Collections;
-using System.Runtime.Versioning;
-using System.Diagnostics.CodeAnalysis;
-
-namespace System.Diagnostics
-{
- internal class LogSwitch
- {
- // ! WARNING !
- // If any fields are added/deleted/modified, perform the
- // same in the EE code (debugdebugger.cpp/debugdebugger.h)
- internal String strName;
- internal String strDescription;
- private LogSwitch ParentSwitch;
- internal volatile LoggingLevels iLevel;
- internal volatile LoggingLevels iOldLevel;
-
- // ! END WARNING !
-
-
- private LogSwitch()
- {
- }
-
- // Constructs a LogSwitch. A LogSwitch is used to categorize log messages.
- //
- // All switches (except for the global LogSwitch) have a parent LogSwitch.
- //
- public LogSwitch(String name, String description, LogSwitch parent)
- {
- if (name != null && name.Length == 0)
- throw new ArgumentOutOfRangeException(nameof(Name), SR.Argument_StringZeroLength);
-
- if ((name != null) && (parent != null))
- {
- strName = name;
- strDescription = description;
- iLevel = LoggingLevels.ErrorLevel;
- iOldLevel = iLevel;
- ParentSwitch = parent;
-
- Log.m_Hashtable.Add(strName, this);
-
- // Call into the EE to let it know about the creation of
- // this switch
- Log.AddLogSwitch(this);
- }
- else
- throw new ArgumentNullException((name == null ? nameof(name) : nameof(parent)));
- }
-
- internal LogSwitch(String name, String description)
- {
- strName = name;
- strDescription = description;
- iLevel = LoggingLevels.ErrorLevel;
- iOldLevel = iLevel;
- ParentSwitch = null;
-
- Log.m_Hashtable.Add(strName, this);
-
- // Call into the EE to let it know about the creation of
- // this switch
- Log.AddLogSwitch(this);
- }
-
-
- // Get property returns the name of the switch
- public virtual String Name
- {
- get { return strName; }
- }
-
-
- // Property to Get/Set the level of log messages which are "on" for the switch.
- //
- public virtual LoggingLevels MinimumLevel
- {
- get { return iLevel; }
- set
- {
- iLevel = value;
- iOldLevel = value;
- String strParentName = ParentSwitch != null ? ParentSwitch.Name : "";
- if (Debugger.IsAttached)
- Log.ModifyLogSwitch((int)iLevel, strName, strParentName);
-
- Log.InvokeLogSwitchLevelHandlers(this, iLevel);
- }
- }
-
-
- // Checks if the given level is "on" for this switch or one of its parents.
- //
- public virtual bool CheckLevel(LoggingLevels level)
- {
- if (iLevel > level)
- {
- // recurse through the list till parent is hit.
- if (ParentSwitch == null)
- return false;
- else
- return ParentSwitch.CheckLevel(level);
- }
- else
- return true;
- }
-
-
- // Returns a switch with the particular name, if any. Returns null if no
- // such switch exists.
- public static LogSwitch GetSwitch(String name)
- {
- return (LogSwitch)Log.m_Hashtable[name];
- }
- }
-}
diff --git a/src/mscorlib/src/System/Diagnostics/LoggingLevels.cs b/src/mscorlib/src/System/Diagnostics/LoggingLevels.cs
deleted file mode 100644
index 22d6c95a97..0000000000
--- a/src/mscorlib/src/System/Diagnostics/LoggingLevels.cs
+++ /dev/null
@@ -1,45 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-
-using System;
-
-namespace System.Diagnostics
-{
- // Constants representing the importance level of messages to be logged.
- // This level can be used to organize messages, and also to filter which
- // messages are displayed.
- //
- // An attached debugger can enable or disable which messages will
- // actually be reported to the user through the COM+ debugger
- // services API. This info is communicated to the runtime so only
- // desired events are actually reported to the debugger.
- // NOTE: The following constants mirror the constants
- // declared in the EE code (DebugDebugger.h). Any changes here will also
- // need to be made there.
- // Constants representing the importance level of messages to be logged.
- // This level can be used to organize messages, and also to filter which
- // messages are displayed.
- internal enum LoggingLevels
- {
- TraceLevel0 = 0,
- TraceLevel1 = 1,
- TraceLevel2 = 2,
- TraceLevel3 = 3,
- TraceLevel4 = 4,
-
- StatusLevel0 = 20,
- StatusLevel1 = 21,
- StatusLevel2 = 22,
- StatusLevel3 = 23,
- StatusLevel4 = 24,
-
-
- WarningLevel = 40,
-
- ErrorLevel = 50,
-
- PanicLevel = 100,
- }
-}
diff --git a/src/mscorlib/src/System/Diagnostics/Stacktrace.cs b/src/mscorlib/src/System/Diagnostics/Stacktrace.cs
index e2588392e4..5c7e7b3e17 100644
--- a/src/mscorlib/src/System/Diagnostics/Stacktrace.cs
+++ b/src/mscorlib/src/System/Diagnostics/Stacktrace.cs
@@ -663,16 +663,5 @@ namespace System.Diagnostics
Debug.Assert(mb != null);
return !(mb.IsDefined(typeof(StackTraceHiddenAttribute)) || (mb.DeclaringType?.IsDefined(typeof(StackTraceHiddenAttribute)) ?? false));
}
-
- // This helper is called from within the EE to construct a string representation
- // of the current stack trace.
- private static String GetManagedStackTraceStringHelper(bool fNeedFileInfo)
- {
- // Note all the frames in System.Diagnostics will be skipped when capturing
- // a normal stack trace (not from an exception) so we don't need to explicitly
- // skip the GetManagedStackTraceStringHelper frame.
- StackTrace st = new StackTrace(0, fNeedFileInfo);
- return st.ToString();
- }
}
}
diff --git a/src/mscorlib/src/System/Diagnostics/log.cs b/src/mscorlib/src/System/Diagnostics/log.cs
deleted file mode 100644
index f38eaccabc..0000000000
--- a/src/mscorlib/src/System/Diagnostics/log.cs
+++ /dev/null
@@ -1,128 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-namespace System.Diagnostics
-{
- using System;
- using System.IO;
- using System.Collections;
- using System.Runtime.CompilerServices;
- using Encoding = System.Text.Encoding;
- using System.Runtime.Versioning;
- using System.Diagnostics.CodeAnalysis;
-
- using Console = Internal.Console;
-
- // LogSwitchLevelHandlers are triggered when the level of a LogSwitch is modified
- // NOTE: These are NOT triggered when the log switch setting is changed from the
- // attached debugger.
- //
- internal delegate void LogSwitchLevelHandler(LogSwitch ls, LoggingLevels newLevel);
-
-
- internal static class Log
- {
- // Switches allow relatively fine level control of which messages are
- // actually shown. Normally most debugging messages are not shown - the
- // user will typically enable those which are relevant to what is being
- // investigated.
- //
- // An attached debugger can enable or disable which messages will
- // actually be reported to the user through the COM+ debugger
- // services API. This info is communicated to the runtime so only
- // desired events are actually reported to the debugger.
- internal static Hashtable m_Hashtable;
- private static volatile bool m_fConsoleDeviceEnabled;
- private static volatile LogSwitchLevelHandler _LogSwitchLevelHandler;
- private static Object locker;
-
- // Constant representing the global switch
- public static readonly LogSwitch GlobalSwitch;
-
-
- static Log()
- {
- m_Hashtable = new Hashtable();
- m_fConsoleDeviceEnabled = false;
- //pConsole = null;
- //iNumOfMsgHandlers = 0;
- //iMsgHandlerArraySize = 0;
- locker = new Object();
-
- // allocate the GlobalSwitch object
- GlobalSwitch = new LogSwitch("Global", "Global Switch for this log");
-
- GlobalSwitch.MinimumLevel = LoggingLevels.ErrorLevel;
- }
-
- internal static void InvokeLogSwitchLevelHandlers(LogSwitch ls, LoggingLevels newLevel)
- {
- LogSwitchLevelHandler handler = _LogSwitchLevelHandler;
- if (handler != null)
- handler(ls, newLevel);
- }
-
-
- // Property to Enable/Disable ConsoleDevice. Enabling the console device
- // adds the console device as a log output, causing any
- // log messages which make it through filters to be written to the
- // application console. The console device is enabled by default if the
- // ??? registry entry or ??? environment variable is set.
- public static bool IsConsoleEnabled
- {
- get { return m_fConsoleDeviceEnabled; }
- set { m_fConsoleDeviceEnabled = value; }
- }
-
- // Generates a log message. If its switch (or a parent switch) allows the
- // level for the message, it is "broadcast" to all of the log
- // devices.
- //
- public static void LogMessage(LoggingLevels level, LogSwitch logswitch, String message)
- {
- if (logswitch == null)
- throw new ArgumentNullException("LogSwitch");
-
- if (level < 0)
- throw new ArgumentOutOfRangeException(nameof(level), SR.ArgumentOutOfRange_NeedNonNegNum);
-
- // Is logging for this level for this switch enabled?
- if (logswitch.CheckLevel(level) == true)
- {
- // Send message for logging
-
- // first send it to the debugger
- Debugger.Log((int)level, logswitch.strName, message);
-
- // Send to the console device
- if (m_fConsoleDeviceEnabled)
- {
- Console.Write(message);
- }
- }
- }
-
- /*
- * Following are convenience entry points; all go through Log()
- * Note that the (Switch switch, String message) variations
- * are preferred.
- */
- public static void Trace(LogSwitch logswitch, String message)
- {
- LogMessage(LoggingLevels.TraceLevel0, logswitch, message);
- }
-
- public static void Trace(String message)
- {
- LogMessage(LoggingLevels.TraceLevel0, GlobalSwitch, message);
- }
-
-
- // Native method to inform the EE about the creation of a new LogSwitch
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- internal static extern void AddLogSwitch(LogSwitch logSwitch);
- [MethodImplAttribute(MethodImplOptions.InternalCall)]
- internal static extern void ModifyLogSwitch(int iNewLevel, String strSwitchName, String strParentName);
- }
-}
diff --git a/src/mscorlib/src/System/Environment.cs b/src/mscorlib/src/System/Environment.cs
index f230577fac..f7e4e923d6 100644
--- a/src/mscorlib/src/System/Environment.cs
+++ b/src/mscorlib/src/System/Environment.cs
@@ -42,7 +42,7 @@ namespace System
internal static partial class Environment
{
// Assume the following constants include the terminating '\0' - use <, not <=
- private const int MaxEnvVariableValueLength = 32767; // maximum length for environment variable name and value
+
// System environment variables are stored in the registry, and have
// a size restriction that is separate from both normal environment
// variables and registry value name lengths, according to MSDN.
@@ -476,8 +476,6 @@ namespace System
private static void ValidateVariableAndValue(string variable, ref string value)
{
- const int MaxEnvVariableValueLength = 32767;
-
if (variable == null)
{
throw new ArgumentNullException(nameof(variable));
@@ -490,10 +488,6 @@ namespace System
{
throw new ArgumentException(SR.Argument_StringFirstCharIsZero, nameof(variable));
}
- if (variable.Length >= MaxEnvVariableValueLength)
- {
- throw new ArgumentException(SR.Argument_LongEnvVarValue, nameof(variable));
- }
if (variable.IndexOf('=') != -1)
{
throw new ArgumentException(SR.Argument_IllegalEnvVarName, nameof(variable));
@@ -504,10 +498,6 @@ namespace System
// Explicitly null out value if it's empty
value = null;
}
- else if (value.Length >= MaxEnvVariableValueLength)
- {
- throw new ArgumentException(SR.Argument_LongEnvVarValue, nameof(value));
- }
}
private static void ValidateTarget(EnvironmentVariableTarget target)
@@ -703,6 +693,9 @@ namespace System
// The error message from Win32 is "The filename or extension is too long",
// which is not accurate.
throw new ArgumentException(SR.Format(SR.Argument_LongEnvVarValue));
+ case Win32Native.ERROR_NOT_ENOUGH_MEMORY:
+ case Win32Native.ERROR_NO_SYSTEM_RESOURCES:
+ throw new OutOfMemoryException(Interop.Kernel32.GetMessage(errorCode));
default:
throw new ArgumentException(Interop.Kernel32.GetMessage(errorCode));
}
diff --git a/src/mscorlib/src/System/Globalization/CultureInfo.Windows.cs b/src/mscorlib/src/System/Globalization/CultureInfo.Windows.cs
index e33874e760..88f6b28d6a 100644
--- a/src/mscorlib/src/System/Globalization/CultureInfo.Windows.cs
+++ b/src/mscorlib/src/System/Globalization/CultureInfo.Windows.cs
@@ -234,8 +234,7 @@ namespace System.Globalization
{
// If a call to GetCultureInfoForUserPreferredLanguageInAppX() generated a recursive
// call to itself, return null, since we don't want to stack overflow. For example,
- // this can happen if some code in this method ends up calling CultureInfo.CurrentCulture
- // (which is common on check'd build because of BCLDebug logging which calls Int32.ToString()).
+ // this can happen if some code in this method ends up calling CultureInfo.CurrentCulture.
// In this case, returning null will mean CultureInfo.CurrentCulture gets the default Win32
// value, which should be fine.
if (ts_IsDoingAppXCultureInfoLookup)
diff --git a/src/mscorlib/src/System/Runtime/InteropServices/WindowsRuntime/WindowsRuntimeMarshal.cs b/src/mscorlib/src/System/Runtime/InteropServices/WindowsRuntime/WindowsRuntimeMarshal.cs
index 916ddcc9b6..2d23c31653 100644
--- a/src/mscorlib/src/System/Runtime/InteropServices/WindowsRuntime/WindowsRuntimeMarshal.cs
+++ b/src/mscorlib/src/System/Runtime/InteropServices/WindowsRuntime/WindowsRuntimeMarshal.cs
@@ -237,7 +237,7 @@ namespace System.Runtime.InteropServices.WindowsRuntime
registrationTokens[handler] = tokens;
}
- BCLDebug.Log("INTEROP", "[WinRT_Eventing] Event subscribed for managed instance = " + instance + ", handler = " + handler + "\n");
+ Log("[WinRT_Eventing] Event subscribed for managed instance = " + instance + ", handler = " + handler + "\n");
}
}
@@ -283,7 +283,7 @@ namespace System.Runtime.InteropServices.WindowsRuntime
// Failure to find a registration for a token is not an error - it's simply a no-op.
if (!registrationTokens.TryGetValue(handler, out tokens))
{
- BCLDebug.Log("INTEROP", "[WinRT_Eventing] no registrationTokens found for instance=" + instance + ", handler= " + handler + "\n");
+ Log("[WinRT_Eventing] no registrationTokens found for instance=" + instance + ", handler= " + handler + "\n");
return;
}
@@ -306,7 +306,7 @@ namespace System.Runtime.InteropServices.WindowsRuntime
removeMethod(token);
- BCLDebug.Log("INTEROP", "[WinRT_Eventing] Event unsubscribed for managed instance = " + instance + ", handler = " + handler + ", token = " + token.m_value + "\n");
+ Log("[WinRT_Eventing] Event unsubscribed for managed instance = " + instance + ", handler = " + handler + ", token = " + token.m_value + "\n");
}
internal static void RemoveAllEventHandlers(Action<EventRegistrationToken> removeMethod)
@@ -330,15 +330,15 @@ namespace System.Runtime.InteropServices.WindowsRuntime
// Clear the dictionary - at this point all event handlers are no longer in the cache
// but they are not removed yet
registrationTokens.Clear();
- BCLDebug.Log("INTEROP", "[WinRT_Eventing] Cache cleared for managed instance = " + instance + "\n");
+ Log("[WinRT_Eventing] Cache cleared for managed instance = " + instance + "\n");
}
//
// Remove all handlers outside the lock
//
- BCLDebug.Log("INTEROP", "[WinRT_Eventing] Start removing all events for instance = " + instance + "\n");
+ Log("[WinRT_Eventing] Start removing all events for instance = " + instance + "\n");
CallRemoveMethods(removeMethod, tokensToRemove);
- BCLDebug.Log("INTEROP", "[WinRT_Eventing] Finished removing all events for instance = " + instance + "\n");
+ Log("[WinRT_Eventing] Finished removing all events for instance = " + instance + "\n");
}
}
@@ -405,7 +405,7 @@ namespace System.Runtime.InteropServices.WindowsRuntime
// and remove it from cache when the token count drop to 0
// we don't need to take locks for decrement the count - we only need to take a global
// lock when we decide to destroy cache for the IUnknown */type instance
- BCLDebug.Log("INTEROP", "[WinRT_Eventing] Finalizing EventRegistrationTokenList for " + _tokenListCount.Key + "\n");
+ Log("[WinRT_Eventing] Finalizing EventRegistrationTokenList for " + _tokenListCount.Key + "\n");
_tokenListCount.Dec();
}
@@ -451,7 +451,7 @@ namespace System.Runtime.InteropServices.WindowsRuntime
internal void Inc()
{
int newCount = Interlocked.Increment(ref _count);
- BCLDebug.Log("INTEROP", "[WinRT_Eventing] Incremented TokenListCount for " + _key + ", Value = " + newCount + "\n");
+ Log("[WinRT_Eventing] Incremented TokenListCount for " + _key + ", Value = " + newCount + "\n");
}
internal void Dec()
@@ -462,7 +462,7 @@ namespace System.Runtime.InteropServices.WindowsRuntime
try
{
int newCount = Interlocked.Decrement(ref _count);
- BCLDebug.Log("INTEROP", "[WinRT_Eventing] Decremented TokenListCount for " + _key + ", Value = " + newCount + "\n");
+ Log("[WinRT_Eventing] Decremented TokenListCount for " + _key + ", Value = " + newCount + "\n");
if (newCount == 0)
CleanupCache();
}
@@ -478,9 +478,9 @@ namespace System.Runtime.InteropServices.WindowsRuntime
// because the total token list count has dropped to 0 and we don't have any events subscribed
Debug.Assert(s_eventRegistrations != null);
- BCLDebug.Log("INTEROP", "[WinRT_Eventing] Removing " + _key + " from cache" + "\n");
+ Log("[WinRT_Eventing] Removing " + _key + " from cache" + "\n");
s_eventRegistrations.Remove(_key);
- BCLDebug.Log("INTEROP", "[WinRT_Eventing] s_eventRegistrations size = " + s_eventRegistrations.Count + "\n");
+ Log("[WinRT_Eventing] s_eventRegistrations size = " + s_eventRegistrations.Count + "\n");
}
}
@@ -611,7 +611,7 @@ namespace System.Runtime.InteropServices.WindowsRuntime
s_eventCacheRWLock.ReleaseReaderLock();
}
- BCLDebug.Log("INTEROP", "[WinRT_Eventing] Event subscribed for instance = " + instanceKey + ", handler = " + handler + "\n");
+ Log("[WinRT_Eventing] Event subscribed for instance = " + instanceKey + ", handler = " + handler + "\n");
}
catch (Exception)
{
@@ -667,7 +667,7 @@ namespace System.Runtime.InteropServices.WindowsRuntime
return null;
}
- BCLDebug.Log("INTEROP", "[WinRT_Eventing] Adding (" + instance + "," + removeMethod.Method + ") into cache" + "\n");
+ Log("[WinRT_Eventing] Adding (" + instance + "," + removeMethod.Method + ") into cache" + "\n");
eventCacheEntry = new EventCacheEntry();
eventCacheEntry.registrationTable = new ConditionalWeakTable<object, EventRegistrationTokenListWithCount>();
@@ -701,7 +701,7 @@ namespace System.Runtime.InteropServices.WindowsRuntime
{
// We have no information regarding this particular instance (IUnknown*/type) - just return
// This is necessary to avoid leaking empty dictionary/conditionalWeakTables for this instance
- BCLDebug.Log("INTEROP", "[WinRT_Eventing] no registrationTokens found for instance=" + instanceKey + ", handler= " + handler + "\n");
+ Log("[WinRT_Eventing] no registrationTokens found for instance=" + instanceKey + ", handler= " + handler + "\n");
return;
}
@@ -722,7 +722,7 @@ namespace System.Runtime.InteropServices.WindowsRuntime
if (tokens == null)
{
// Failure to find a registration for a token is not an error - it's simply a no-op.
- BCLDebug.Log("INTEROP", "[WinRT_Eventing] no token list found for instance=" + instanceKey + ", handler= " + handler + "\n");
+ Log("[WinRT_Eventing] no token list found for instance=" + instanceKey + ", handler= " + handler + "\n");
return;
}
@@ -744,7 +744,7 @@ namespace System.Runtime.InteropServices.WindowsRuntime
registrationTokens.Remove(key);
}
- BCLDebug.Log("INTEROP", "[WinRT_Eventing] Event unsubscribed for managed instance = " + instanceKey + ", handler = " + handler + ", token = " + token.m_value + "\n");
+ Log("[WinRT_Eventing] Event unsubscribed for managed instance = " + instanceKey + ", handler = " + handler + ", token = " + token.m_value + "\n");
}
}
finally
@@ -792,7 +792,7 @@ namespace System.Runtime.InteropServices.WindowsRuntime
// Clear the table - at this point all event handlers are no longer in the cache
// but they are not removed yet
registrationTokens.Clear();
- BCLDebug.Log("INTEROP", "[WinRT_Eventing] Cache cleared for managed instance = " + instanceKey + "\n");
+ Log("[WinRT_Eventing] Cache cleared for managed instance = " + instanceKey + "\n");
}
}
finally
@@ -803,9 +803,9 @@ namespace System.Runtime.InteropServices.WindowsRuntime
//
// Remove all handlers outside the lock
//
- BCLDebug.Log("INTEROP", "[WinRT_Eventing] Start removing all events for instance = " + instanceKey + "\n");
+ Log("[WinRT_Eventing] Start removing all events for instance = " + instanceKey + "\n");
CallRemoveMethods(removeMethod, tokensToRemove);
- BCLDebug.Log("INTEROP", "[WinRT_Eventing] Finished removing all events for instance = " + instanceKey + "\n");
+ Log("[WinRT_Eventing] Finished removing all events for instance = " + instanceKey + "\n");
}
@@ -1032,7 +1032,7 @@ namespace System.Runtime.InteropServices.WindowsRuntime
exceptions.Add(ex);
}
- BCLDebug.Log("INTEROP", "[WinRT_Eventing] Event unsubscribed for token = " + token.m_value + "\n");
+ Log("[WinRT_Eventing] Event unsubscribed for token = " + token.m_value + "\n");
}
if (exceptions.Count > 0)
@@ -1279,5 +1279,11 @@ namespace System.Runtime.InteropServices.WindowsRuntime
UnsafeNativeMethods.WindowsDeleteString(ptr);
}
}
+
+ [Conditional("_LOGGING")]
+ private static void Log(string s)
+ {
+ // Internal.Console.WriteLine(s);
+ }
}
}
diff --git a/src/mscorlib/src/System/Runtime/MemoryFailPoint.cs b/src/mscorlib/src/System/Runtime/MemoryFailPoint.cs
index 660b0f30be..d05c346156 100644
--- a/src/mscorlib/src/System/Runtime/MemoryFailPoint.cs
+++ b/src/mscorlib/src/System/Runtime/MemoryFailPoint.cs
@@ -211,11 +211,19 @@ namespace System.Runtime
}
bool needContiguousVASpace = (ulong)LastKnownFreeAddressSpace < segmentSize;
- BCLDebug.Trace("MEMORYFAILPOINT", "MemoryFailPoint: Checking for {0} MB, for allocation size of {1} MB, stage {9}. Need page file? {2} Need Address Space? {3} Need Contiguous address space? {4} Avail page file: {5} MB Total free VA space: {6} MB Contiguous free address space (found): {7} MB Space reserved via process's MemoryFailPoints: {8} MB",
- segmentSize >> 20, sizeInMegabytes, needPageFile,
- needAddressSpace, needContiguousVASpace,
- availPageFile >> 20, totalAddressSpaceFree >> 20,
- LastKnownFreeAddressSpace >> 20, reserved, stage);
+#if false
+ Console.WriteLine($"MemoryFailPoint:" +
+ $"Checking for {(segmentSize >> 20)} MB, " +
+ $"for allocation size of {sizeInMegabytes} MB, " +
+ $"stage {stage}. " +
+ $"Need page file? {needPageFile} " +
+ $"Need Address Space? {needAddressSpace} " +
+ $"Need Contiguous address space? {needContiguousVASpace} " +
+ $"Avail page file: {(availPageFile >> 20)} MB " +
+ $"Total free VA space: {totalAddressSpaceFree >> 20} MB " +
+ $"Contiguous free address space (found): {LastKnownFreeAddressSpace >> 20} MB " +
+ $"Space reserved via process's MemoryFailPoints: {reserved} MB");
+#endif
if (!needPageFile && !needAddressSpace && !needContiguousVASpace)
break;
@@ -313,7 +321,7 @@ namespace System.Runtime
throw Win32Marshal.GetExceptionForLastWin32Error();
availPageFile = memory.availPageFile;
totalAddressSpaceFree = memory.availVirtual;
- //Console.WriteLine("Memory gate: Mem load: {0}% Available memory (physical + page file): {1} MB Total free address space: {2} MB GC Heap: {3} MB", memory.memoryLoad, memory.availPageFile >> 20, memory.availVirtual >> 20, GC.GetTotalMemory(true) >> 20);
+ // Console.WriteLine($"Memory gate: Mem load: {memory.memoryLoad}% Available memory (physical + page file): {(memory.availPageFile >> 20)} MB Total free address space: {memory.availVirtual >> 20} MB GC Heap: {(GC.GetTotalMemory(true) >> 20)} MB");
}
// Based on the shouldThrow parameter, this will throw an exception, or
@@ -328,7 +336,7 @@ namespace System.Runtime
// know whether VirtualAlloc could succeed.
ulong freeSpaceAfterGCHeap = MemFreeAfterAddress(null, size);
- BCLDebug.Trace("MEMORYFAILPOINT", "MemoryFailPoint: Checked for free VA space. Found enough? {0} Asked for: {1} Found: {2}", (freeSpaceAfterGCHeap >= size), size, freeSpaceAfterGCHeap);
+ // Console.WriteLine($"MemoryFailPoint: Checked for free VA space. Found enough? {(freeSpaceAfterGCHeap >= size)} Asked for: {size} Found: {freeSpaceAfterGCHeap}");
// We may set these without taking a lock - I don't believe
// this will hurt, as long as we never increment this number in
diff --git a/src/publish.proj b/src/publish.proj
index 2c56430382..c93e01be09 100644
--- a/src/publish.proj
+++ b/src/publish.proj
@@ -4,11 +4,16 @@
<Import Project="$(PackagesDir)/$(FeedTasksPackage.ToLower())/$(FeedTasksPackageVersion)/build/$(FeedTasksPackage).targets" />
+ <UsingTask TaskName="CreateAzureContainer" AssemblyFile="$(BuildToolsTaskDir)Microsoft.DotNet.Build.CloudTestTasks.dll"/>
+ <UsingTask TaskName="UploadToAzure" AssemblyFile="$(BuildToolsTaskDir)Microsoft.DotNet.Build.CloudTestTasks.dll"/>
+
<PropertyGroup>
<PackagesPattern Condition="'$(PackagesPattern)' == ''">$(PackagesBinDir)pkg\*.nupkg</PackagesPattern>
<TestNativeBinariesPattern Condition="'$(TestNativeBinariesPattern)' == ''">$(OutputPath)\bin\**</TestNativeBinariesPattern>
<SymbolsPackagesPattern Condition="'$(SymbolPackagesPattern)' == ''">$(PackagesBinDir)symbolpkg\*.nupkg</SymbolsPackagesPattern>
<PublishFlatContainer Condition="'$(PublishFlatContainer)' == ''">true</PublishFlatContainer>
+ <RelativePathWithSlash>$(RelativePath)</RelativePathWithSlash>
+ <RelativePathWithSlash Condition="'$(RelativePathWithSlash)' != '' and !HasTrailingSlash('$(RelativePathWithSlash)')">$(RelativePathWithSlash)/</RelativePathWithSlash>
</PropertyGroup>
<PropertyGroup>
@@ -19,32 +24,65 @@
<Target Name="PublishPackages" Condition="'$(__PublishPackages)' == 'true' and ('$(OfficialPublish)' != 'true' or '$(__BuildType)' == 'Release')">
<PropertyGroup>
- <ExpectedFeedUrl>https://$(AccountName).blob.core.windows.net/$(ContainerName)/$(RelativePath)index.json</ExpectedFeedUrl>
+ <ExpectedFeedUrl>https://$(AccountName).blob.core.windows.net/$(ContainerName)/$(RelativePathWithSlash)index.json</ExpectedFeedUrl>
</PropertyGroup>
<ItemGroup>
<ItemsToPush Remove="*.nupkg" />
<ItemsToPush Include="$(PackagesPattern)" Exclude="$(SymbolsPackagesPattern)"/>
+ <ItemsToPush>
+ <RelativeBlobPath>$(RelativePathWithSlash)$([System.String]::Copy('%(RecursiveDir)%(Filename)%(Extension)').Replace('\' ,'/'))</RelativeBlobPath>
+ </ItemsToPush>
</ItemGroup>
- <PushToBlobFeed ExpectedFeedUrl="$(ExpectedFeedUrl)"
+
+ <!-- create the container if it doesn't exist -->
+ <CreateAzureContainer AccountKey="$(AccountKey)"
+ AccountName="$(AccountName)"
+ ContainerName="$(ContainerName)" />
+
+ <PushToBlobFeed Condition="'$(PublishFlatContainer)' == 'false'"
+ ExpectedFeedUrl="$(ExpectedFeedUrl)"
AccountKey="$(AccountKey)"
ItemsToPush="@(ItemsToPush)"
- PublishFlatContainer="$(PublishFlatContainer)"
- Overwrite="$(OverwriteOnPublish)"
- IndexDirectory="$(__IntermediatesDir)"/>
+ Overwrite="$(OverwriteOnPublish)" />
+
+ <!-- now upload the items -->
+ <UploadToAzure Condition="'$(PublishFlatContainer)' == 'true'"
+ AccountKey="$(AccountKey)"
+ AccountName="$(AccountName)"
+ ContainerName="$(ContainerName)"
+ Items="@(ItemsToPush)"
+ Overwrite="$(OverwriteOnPublish)" />
</Target>
<Target Name="PublishSymbolPackages" Condition="'$(__PublishSymbols)' == 'true' and ('$(OfficialPublish)' != 'true' or '$(__BuildType)' == 'Release')">
<PropertyGroup>
- <ExpectedFeedUrl>https://$(AccountName).blob.core.windows.net/$(ContainerName)/$(RelativePath)index.json</ExpectedFeedUrl>
+ <ExpectedFeedUrl>https://$(AccountName).blob.core.windows.net/$(ContainerName)/$(RelativePathWithSlash)index.json</ExpectedFeedUrl>
</PropertyGroup>
<ItemGroup>
<ItemsToPush Remove="*.nupkg" />
<ItemsToPush Include="$(SymbolsPackagesPattern)"/>
+ <ItemsToPush>
+ <RelativeBlobPath>$(RelativePathWithSlash)$([System.String]::Copy('%(RecursiveDir)%(Filename)%(Extension)').Replace('\' ,'/'))</RelativeBlobPath>
+ </ItemsToPush>
</ItemGroup>
- <PushToBlobFeed ExpectedFeedUrl="$(ExpectedFeedUrl)"
+
+ <!-- create the container if it doesn't exist -->
+ <CreateAzureContainer AccountKey="$(AccountKey)"
+ AccountName="$(AccountName)"
+ ContainerName="$(ContainerName)" />
+
+ <PushToBlobFeed Condition="'$(PublishFlatContainer)' == 'false'"
+ ExpectedFeedUrl="$(ExpectedFeedUrl)"
AccountKey="$(AccountKey)"
ItemsToPush="@(ItemsToPush)"
- PublishFlatContainer="$(PublishFlatContainer)"
+ Overwrite="$(OverwriteOnPublish)" />
+
+ <!-- now upload the items -->
+ <UploadToAzure Condition="'$(PublishFlatContainer)' == 'true'"
+ AccountKey="$(AccountKey)"
+ AccountName="$(AccountName)"
+ ContainerName="$(ContainerName)"
+ Items="@(ItemsToPush)"
Overwrite="$(OverwriteOnPublish)" />
</Target>
@@ -55,15 +93,31 @@
</PropertyGroup>
<ItemGroup>
<ItemsToPush Remove="*.nupkg" />
- <ItemsToPush Include="$(TestNativeBinariesPattern)"/>
+ <ItemsToPush Include="$(TestNativeBinariesPattern)" />
+ <ItemsToPush>
+ <RelativeBlobPath>$(RelativePath)/$([System.String]::Copy('%(RecursiveDir)%(Filename)%(Extension)').Replace('\' ,'/'))</RelativeBlobPath>
+ </ItemsToPush>
</ItemGroup>
- <PushToBlobFeed ExpectedFeedUrl="$(ExpectedFeedUrl)"
+
+ <!-- create the container if it doesn't exist -->
+ <CreateAzureContainer AccountKey="$(AccountKey)"
+ AccountName="$(AccountName)"
+ ContainerName="$(ContainerName)" />
+
+ <PushToBlobFeed Condition="'$(PublishFlatContainer)' == 'false'"
+ ExpectedFeedUrl="$(ExpectedFeedUrl)"
AccountKey="$(AccountKey)"
ItemsToPush="@(ItemsToPush)"
- PublishFlatContainer="$(PublishFlatContainer)"
Overwrite="$(OverwriteOnPublish)" />
- </Target>
+ <!-- now upload the items -->
+ <UploadToAzure Condition="'$(PublishFlatContainer)' == 'true'"
+ AccountKey="$(AccountKey)"
+ AccountName="$(AccountName)"
+ ContainerName="$(ContainerName)"
+ Items="@(ItemsToPush)"
+ Overwrite="$(OverwriteOnPublish)" />
+ </Target>
<Target Name="Build" DependsOnTargets="PublishPackages;PublishSymbolPackages;PublishTestNativeBinaries"/>
</Project>
diff --git a/src/scripts/genXplatEventing.py b/src/scripts/genXplatEventing.py
index 6968d293e9..4c9ce873b7 100644
--- a/src/scripts/genXplatEventing.py
+++ b/src/scripts/genXplatEventing.py
@@ -284,8 +284,7 @@ def generateClrallEvents(eventNodes,allTemplates):
clrallEvents.append(eventName)
clrallEvents.append("() {return ")
clrallEvents.append("EventPipeEventEnabled" + eventName + "() || ")
- clrallEvents.append("(XplatEventLogger::IsEventLoggingEnabled() && EventXplatEnabled")
- clrallEvents.append(eventName+"());}\n\n")
+ clrallEvents.append("EventXplatEnabled" + eventName + "();}\n\n")
#generate FireEtw functions
fnptype = []
fnbody = []
@@ -340,18 +339,7 @@ def generateClrallEvents(eventNodes,allTemplates):
fnbody.append(lindent)
fnbody.append("ULONG status = EventPipeWriteEvent" + eventName + "(" + ''.join(line) + ");\n")
fnbody.append(lindent)
- fnbody.append("if(XplatEventLogger::IsEventLoggingEnabled())\n")
- fnbody.append(lindent)
- fnbody.append("{\n")
- fnbody.append(lindent)
- fnbody.append(lindent)
- fnbody.append("status &= FireEtXplat")
- fnbody.append(eventName)
- fnbody.append("(")
- fnbody.extend(line)
- fnbody.append(");\n")
- fnbody.append(lindent)
- fnbody.append("}\n")
+ fnbody.append("status &= FireEtXplat" + eventName + "(" + ''.join(line) + ");\n")
fnbody.append(lindent)
fnbody.append("return status;\n")
fnbody.append("}\n\n")
diff --git a/src/utilcode/clrconfig.cpp b/src/utilcode/clrconfig.cpp
index 7bd404b5d4..3d1679150b 100644
--- a/src/utilcode/clrconfig.cpp
+++ b/src/utilcode/clrconfig.cpp
@@ -24,13 +24,6 @@
//
CLRConfig::GetConfigValueFunction CLRConfig::s_GetConfigValueCallback = NULL;
-//
-// Initialize the PerformanceDefaults::LookupConfigValue function pointer to NULL. If not initialized, CLRConfig
-// will ignore LookupOptions::MayHavePerformanceDefault.
-//
-CLRConfig::GetPerformanceDefaultValueFunction CLRConfig::s_GetPerformanceDefaultValueCallback = NULL;
-
-
//
// Creating structs using the macro table in CLRConfigValues.h
//
@@ -182,22 +175,6 @@ BOOL CLRConfig::IsConfigEnabled(const ConfigDWORDInfo & info)
}
}
- //
- // If we get here, the option was not listed in REGUTIL or EEConfig; check whether the option
- // has a PerformanceDefault-specified value before falling back to the built-in default
- //
- DWORD performanceDefaultValue;
- if (CheckLookupOption(info, MayHavePerformanceDefault) &&
- s_GetPerformanceDefaultValueCallback != NULL &&
- s_GetPerformanceDefaultValueCallback(info.name, &performanceDefaultValue))
- {
- if (!SUCCEEDED(REGUTIL::GetConfigDWORD_DontUse_(info.name, info.defaultValue, &result, level, prependCOMPlus)))
- {
- if(performanceDefaultValue>0)
- return TRUE;
- }
- }
-
if(info.defaultValue>0)
return TRUE;
else
@@ -337,25 +314,6 @@ DWORD CLRConfig::GetConfigValue(const ConfigDWORDInfo & info, bool acceptExplici
}
}
- //
- // If we get here, the option was not listed in REGUTIL or EEConfig; check whether the option
- // has a PerformanceDefault-specified value before falling back to the built-in default
- //
- DWORD performanceDefaultValue;
- if (CheckLookupOption(info, MayHavePerformanceDefault) &&
- s_GetPerformanceDefaultValueCallback != NULL &&
- s_GetPerformanceDefaultValueCallback(info.name, &performanceDefaultValue))
- {
- // TODO: We ignore explicitly defined default values above, but we do not want to let performance defaults override these.
- // TODO: Ideally, the above would use hresult for success and this check would be removed.
- DWORD resultMaybe;
- if (!SUCCEEDED(REGUTIL::GetConfigDWORD_DontUse_(info.name, info.defaultValue, &resultMaybe, level, prependCOMPlus)))
- {
- *isDefault = true;
- return performanceDefaultValue;
- }
- }
-
*isDefault = true;
return info.defaultValue;
}
@@ -494,10 +452,6 @@ HRESULT CLRConfig::GetConfigValue(const ConfigStringInfo & info, __deref_out_z L
}
}
- // If we ever want a PerformanceDefault for a string value, you can replace this assert
- // with code that follows the pattern for DWORD values above.
- _ASSERTE(!CheckLookupOption(info, MayHavePerformanceDefault));
-
*outVal = result;
RETURN S_OK;
}
@@ -648,17 +602,6 @@ void CLRConfig::RegisterGetConfigValueCallback(GetConfigValueFunction func)
}
//
-// Register PerformanceDefaults' LookupConfigValue so CLRConfig can support 'MayHavePerformanceDefault' values
-//
-//static
-void CLRConfig::RegisterGetPerformanceDefaultValueCallback(GetPerformanceDefaultValueFunction func)
-{
- LIMITED_METHOD_CONTRACT;
- s_GetPerformanceDefaultValueCallback = func;
-}
-
-
-//
// Helper method to translate LookupOptions to REGUTIL::CORConfigLevel.
//
//static
diff --git a/src/vm/CMakeLists.txt b/src/vm/CMakeLists.txt
index aefc77113c..f49d01bc91 100644
--- a/src/vm/CMakeLists.txt
+++ b/src/vm/CMakeLists.txt
@@ -223,7 +223,6 @@ set(VM_SOURCES_WKS
olevariant.cpp
pefingerprint.cpp
pendingload.cpp
- perfdefaults.cpp
profattach.cpp
profattachclient.cpp
profattachserver.cpp
@@ -312,7 +311,6 @@ list(APPEND VM_SOURCES_WKS
dwreport.cpp
eventreporter.cpp
extensibleclassfactory.cpp
- microsoft.comservices_i.c
mngstdinterfaces.cpp
notifyexternals.cpp
olecontexthelpers.cpp
diff --git a/src/vm/ceemain.cpp b/src/vm/ceemain.cpp
index f3b72e01e2..8b44945845 100644
--- a/src/vm/ceemain.cpp
+++ b/src/vm/ceemain.cpp
@@ -182,7 +182,6 @@
#include "stringarraylist.h"
#include "stubhelpers.h"
-#include "perfdefaults.h"
#ifdef FEATURE_STACK_SAMPLING
#include "stacksampler.h"
@@ -3191,107 +3190,6 @@ static int GetThreadUICultureId(__out LocaleIDValue* pLocale)
}
#endif // FEATURE_USE_LCID
-// ---------------------------------------------------------------------------
-// Export shared logging code for JIT, et.al.
-// ---------------------------------------------------------------------------
-#ifdef _DEBUG
-
-extern VOID LogAssert( LPCSTR szFile, int iLine, LPCSTR expr);
-extern "C"
-//__declspec(dllexport)
-VOID STDMETHODCALLTYPE LogHelp_LogAssert( LPCSTR szFile, int iLine, LPCSTR expr)
-{
- CONTRACTL {
- NOTHROW;
- GC_NOTRIGGER;
- MODE_ANY;
- ENTRY_POINT;
- PRECONDITION(CheckPointer(szFile));
- PRECONDITION(CheckPointer(expr));
- } CONTRACTL_END;
-
- BEGIN_ENTRYPOINT_VOIDRET;
- LogAssert(szFile, iLine, expr);
- END_ENTRYPOINT_VOIDRET;
-
-}
-
-extern "C"
-//__declspec(dllexport)
-BOOL STDMETHODCALLTYPE LogHelp_NoGuiOnAssert()
-{
- LIMITED_METHOD_CONTRACT;
- BOOL fRet = FALSE;
- BEGIN_ENTRYPOINT_VOIDRET;
- fRet = NoGuiOnAssert();
- END_ENTRYPOINT_VOIDRET;
- return fRet;
-}
-
-extern "C"
-//__declspec(dllexport)
-VOID STDMETHODCALLTYPE LogHelp_TerminateOnAssert()
-{
- LIMITED_METHOD_CONTRACT;
- BEGIN_ENTRYPOINT_VOIDRET;
-// __asm int 3;
- TerminateOnAssert();
- END_ENTRYPOINT_VOIDRET;
-
-}
-
-#else // !_DEBUG
-
-extern "C"
-//__declspec(dllexport)
-VOID STDMETHODCALLTYPE LogHelp_LogAssert( LPCSTR szFile, int iLine, LPCSTR expr) {
- LIMITED_METHOD_CONTRACT;
-
- //BEGIN_ENTRYPOINT_VOIDRET;
- //END_ENTRYPOINT_VOIDRET;
-}
-
-extern "C"
-//__declspec(dllexport)
-BOOL STDMETHODCALLTYPE LogHelp_NoGuiOnAssert() {
- LIMITED_METHOD_CONTRACT;
-
- //BEGIN_ENTRYPOINT_VOIDRET;
- //END_ENTRYPOINT_VOIDRET;
-
- return FALSE;
-}
-
-extern "C"
-//__declspec(dllexport)
-VOID STDMETHODCALLTYPE LogHelp_TerminateOnAssert() {
- LIMITED_METHOD_CONTRACT;
-
- //BEGIN_ENTRYPOINT_VOIDRET;
- //END_ENTRYPOINT_VOIDRET;
-
-}
-
-#endif // _DEBUG
-
-
-#ifndef ENABLE_PERF_COUNTERS
-//
-// perf counter stubs for builds which don't have perf counter support
-// These are needed because we export these functions in our DLL
-
-
-Perf_Contexts* STDMETHODCALLTYPE GetPrivateContextsPerfCounters()
-{
- LIMITED_METHOD_CONTRACT;
-
- //BEGIN_ENTRYPOINT_VOIDRET;
- //END_ENTRYPOINT_VOIDRET;
-
- return NULL;
-}
-
-#endif
#ifdef ENABLE_CONTRACTS_IMPL
diff --git a/src/vm/comutilnative.cpp b/src/vm/comutilnative.cpp
index c6c3138e07..eab048d98b 100644
--- a/src/vm/comutilnative.cpp
+++ b/src/vm/comutilnative.cpp
@@ -1957,25 +1957,6 @@ void QCALLTYPE COMInterlocked::MemoryBarrierProcessWide()
FlushProcessWriteBuffers();
}
-FCIMPL3(INT32, ManagedLoggingHelper::GetRegistryLoggingValues, CLR_BOOL* bLoggingEnabled, CLR_BOOL* bLogToConsole, INT32 *iLogLevel)
-{
- FCALL_CONTRACT;
-
- INT32 logFacility = 0;
-
- HELPER_METHOD_FRAME_BEGIN_RET_0();
-
- *bLoggingEnabled = (bool)(g_pConfig->GetConfigDWORD_DontUse_(CLRConfig::INTERNAL_LogEnable, 0)!=0);
- *bLogToConsole = (bool)(g_pConfig->GetConfigDWORD_DontUse_(CLRConfig::INTERNAL_LogToConsole, 0)!=0);
- *iLogLevel = (INT32)(g_pConfig->GetConfigDWORD_DontUse_(CLRConfig::EXTERNAL_LogLevel, 0));
- logFacility = (INT32)(g_pConfig->GetConfigDWORD_DontUse_(CLRConfig::INTERNAL_ManagedLogFacility, 0));
-
- HELPER_METHOD_FRAME_END();
-
- return logFacility;
-}
-FCIMPLEND
-
static BOOL HasOverriddenMethod(MethodTable* mt, MethodTable* classMT, WORD methodSlot)
{
CONTRACTL{
diff --git a/src/vm/comutilnative.h b/src/vm/comutilnative.h
index b9737cedb7..2ecaaa6b57 100644
--- a/src/vm/comutilnative.h
+++ b/src/vm/comutilnative.h
@@ -201,12 +201,6 @@ public:
static void QCALLTYPE MemoryBarrierProcessWide();
};
-class ManagedLoggingHelper {
-
-public:
- static FCDECL3(INT32, GetRegistryLoggingValues, CLR_BOOL* bLoggingEnabled, CLR_BOOL* bLogToConsole, INT32 *bLogLevel);
-};
-
class ValueTypeHelper {
public:
static FCDECL1(FC_BOOL_RET, CanCompareBits, Object* obj);
diff --git a/src/vm/debugdebugger.cpp b/src/vm/debugdebugger.cpp
index 489c623df9..8d8557a76b 100644
--- a/src/vm/debugdebugger.cpp
+++ b/src/vm/debugdebugger.cpp
@@ -32,8 +32,6 @@
#include "eemessagebox.h"
#include "stackwalk.h"
-LogHashTable g_sLogHashTable;
-
#ifndef DACCESS_COMPILE
//----------------------------------------------------------------------------
//
@@ -1219,432 +1217,4 @@ void DebugStackTrace::DebugStackTraceElement::InitPass2()
}
}
-FCIMPL4(INT32, DebuggerAssert::ShowDefaultAssertDialog,
- StringObject* strConditionUNSAFE,
- StringObject* strMessageUNSAFE,
- StringObject* strStackTraceUNSAFE,
- StringObject* strWindowTitleUNSAFE
- )
-{
- CONTRACTL
- {
- FCALL_CHECK;
- PRECONDITION(CheckPointer(strConditionUNSAFE, NULL_OK));
- PRECONDITION(CheckPointer(strMessageUNSAFE, NULL_OK));
- PRECONDITION(CheckPointer(strStackTraceUNSAFE, NULL_OK));
- PRECONDITION(CheckPointer(strWindowTitleUNSAFE, NULL_OK));
- }
- CONTRACTL_END;
-
- int result = IDRETRY;
-
- struct _gc {
- STRINGREF strCondition;
- STRINGREF strMessage;
- STRINGREF strStackTrace;
- STRINGREF strWindowTitle;
- } gc;
-
- gc.strCondition = (STRINGREF) ObjectToOBJECTREF(strConditionUNSAFE);
- gc.strMessage = (STRINGREF) ObjectToOBJECTREF(strMessageUNSAFE);
- gc.strStackTrace = (STRINGREF) ObjectToOBJECTREF(strStackTraceUNSAFE);
- gc.strWindowTitle = (STRINGREF) ObjectToOBJECTREF(strWindowTitleUNSAFE);
-
- HELPER_METHOD_FRAME_BEGIN_RET_PROTECT(gc);
-
- StackSString condition;
- StackSString message;
- StackSString stackTrace;
- StackSString windowTitle;
-
- if (gc.strCondition != NULL)
- gc.strCondition->GetSString(condition);
- if (gc.strMessage != NULL)
- gc.strMessage->GetSString(message);
- if (gc.strStackTrace != NULL)
- gc.strStackTrace->GetSString(stackTrace);
- if (gc.strWindowTitle != NULL)
- gc.strWindowTitle->GetSString(windowTitle);
-
- StackSString msgText;
- if (gc.strCondition != NULL) {
- msgText.Append(W("Expression: "));
- msgText.Append(condition);
- msgText.Append(W("\n"));
- }
- msgText.Append(W("Description: "));
- msgText.Append(message);
-
- StackSString stackTraceText;
- if (gc.strStackTrace != NULL) {
- stackTraceText.Append(W("Stack Trace:\n"));
- stackTraceText.Append(stackTrace);
- }
-
- if (gc.strWindowTitle == NULL) {
- windowTitle.Set(W("Assert Failure"));
- }
-
- if (NoGuiOnAssert())
- {
- fwprintf(stderr, W("%s\n%s\n%s\n"), windowTitle.GetUnicode(), msgText.GetUnicode(), stackTraceText.GetUnicode());
- result = FailTerminate;
- }
- else
- {
- // We're taking a string from managed code, and we can't be sure it doesn't have stuff like %s or \n in it.
- // So, pass a format string of %s and pass the text as a vararg to our message box method.
- // Also, varargs and StackSString don't mix. Convert to string first.
- const WCHAR* msgTextAsUnicode = msgText.GetUnicode();
- result = EEMessageBoxNonLocalizedNonFatal(W("%s"), windowTitle, stackTraceText, MB_ABORTRETRYIGNORE | MB_ICONEXCLAMATION, msgTextAsUnicode);
-
- // map the user's choice to the values recognized by
- // the System.Diagnostics.Assert package
- if (result == IDRETRY)
- {
- result = FailDebug;
- }
- else if (result == IDIGNORE)
- {
- result = FailIgnore;
- }
- else
- {
- result = FailTerminate;
- }
- }
-
- HELPER_METHOD_FRAME_END();
- return result;
-}
-FCIMPLEND
-
-
-FCIMPL1( void, Log::AddLogSwitch,
- LogSwitchObject* logSwitchUNSAFE
- )
-{
- CONTRACTL
- {
- FCALL_CHECK;
- PRECONDITION(CheckPointer(logSwitchUNSAFE));
- }
- CONTRACTL_END;
-
- Thread *pThread = GetThread();
- _ASSERTE(pThread);
-
- HRESULT hresult = S_OK;
-
- struct _gc {
- LOGSWITCHREF m_LogSwitch;
- STRINGREF Name;
- OBJECTREF tempObj;
- STRINGREF strrefParentName;
- } gc;
-
- ZeroMemory(&gc, sizeof(gc));
-
- HELPER_METHOD_FRAME_BEGIN_PROTECT(gc);
-
- gc.m_LogSwitch = (LOGSWITCHREF)ObjectToOBJECTREF(logSwitchUNSAFE);
-
- // From the given args, extract the LogSwitch name
- gc.Name = ((LogSwitchObject*) OBJECTREFToObject(gc.m_LogSwitch))->GetName();
-
- _ASSERTE( gc.Name != NULL );
- WCHAR *pstrCategoryName = NULL;
- int iCategoryLength = 0;
- WCHAR wszParentName [MAX_LOG_SWITCH_NAME_LEN+1];
- WCHAR wszSwitchName [MAX_LOG_SWITCH_NAME_LEN+1];
- wszParentName [0] = W('\0');
- wszSwitchName [0] = W('\0');
-
- // extract the (WCHAR) name from the STRINGREF object
- gc.Name->RefInterpretGetStringValuesDangerousForGC(&pstrCategoryName, &iCategoryLength);
-
- _ASSERTE (iCategoryLength > 0);
- wcsncpy_s(wszSwitchName, COUNTOF(wszSwitchName), pstrCategoryName, _TRUNCATE);
-
- // check if an entry with this name already exists in the hash table.
- // Duplicates are not allowed.
- // <REVISIT_TODO>: access to the hashtable is not synchronized!</REVISIT_TODO>
- if(g_sLogHashTable.GetEntryFromHashTable(pstrCategoryName) != NULL)
- {
- hresult = TYPE_E_DUPLICATEID;
- }
- else
- {
- // Create a strong reference handle to the LogSwitch object
- OBJECTHANDLE ObjHandle = pThread->GetDomain()->CreateStrongHandle(NULL);
- StoreObjectInHandle(ObjHandle, ObjectToOBJECTREF(gc.m_LogSwitch));
- // Use ObjectFromHandle(ObjHandle) to get back the object.
-
- hresult = g_sLogHashTable.AddEntryToHashTable(pstrCategoryName, ObjHandle);
-
- // If we failed to insert this into the hash table, destroy the handle so
- // that we don't leak it.
- if (FAILED(hresult))
- {
- ::DestroyStrongHandle(ObjHandle);
- }
-
-#ifdef DEBUGGING_SUPPORTED
- if (hresult == S_OK)
- {
- // tell the attached debugger about this switch
- if (CORDebuggerAttached())
- {
- int iLevel = gc.m_LogSwitch->GetLevel();
- WCHAR *pstrParentName = NULL;
- int iParentNameLength = 0;
-
- gc.tempObj = gc.m_LogSwitch->GetParent();
-
- LogSwitchObject* pParent = (LogSwitchObject*) OBJECTREFToObject( gc.tempObj );
-
- if (pParent != NULL)
- {
- // From the given args, extract the ParentLogSwitch's name
- gc.strrefParentName = pParent->GetName();
-
- // extract the (WCHAR) name from the STRINGREF object
- gc.strrefParentName->RefInterpretGetStringValuesDangerousForGC(&pstrParentName, &iParentNameLength );
-
- if (iParentNameLength > MAX_LOG_SWITCH_NAME_LEN)
- {
- wcsncpy_s (wszParentName, COUNTOF(wszParentName), pstrParentName, _TRUNCATE);
- }
- else
- {
- wcscpy_s (wszParentName, COUNTOF(wszParentName), pstrParentName);
- }
- }
-
- g_pDebugInterface->SendLogSwitchSetting (iLevel, SWITCH_CREATE, wszSwitchName, wszParentName );
- }
- }
-#endif // DEBUGGING_SUPPORTED
- }
-
- HELPER_METHOD_FRAME_END();
-}
-FCIMPLEND
-
-
-FCIMPL3(void, Log::ModifyLogSwitch,
- INT32 Level,
- StringObject* strLogSwitchNameUNSAFE,
- StringObject* strParentNameUNSAFE
- )
-{
- CONTRACTL
- {
- FCALL_CHECK;
- PRECONDITION(CheckPointer(strLogSwitchNameUNSAFE));
- PRECONDITION(CheckPointer(strParentNameUNSAFE));
- }
- CONTRACTL_END;
-
- STRINGREF strLogSwitchName = (STRINGREF) ObjectToOBJECTREF(strLogSwitchNameUNSAFE);
- STRINGREF strParentName = (STRINGREF) ObjectToOBJECTREF(strParentNameUNSAFE);
-
- HELPER_METHOD_FRAME_BEGIN_2(strLogSwitchName, strParentName);
-
- _ASSERTE (strLogSwitchName != NULL);
-
- WCHAR *pstrLogSwitchName = NULL;
- WCHAR *pstrParentName = NULL;
- int iSwitchNameLength = 0;
- int iParentNameLength = 0;
- WCHAR wszParentName [MAX_LOG_SWITCH_NAME_LEN+1];
- WCHAR wszSwitchName [MAX_LOG_SWITCH_NAME_LEN+1];
- wszParentName [0] = W('\0');
- wszSwitchName [0] = W('\0');
-
- // extract the (WCHAR) name from the STRINGREF object
- strLogSwitchName->RefInterpretGetStringValuesDangerousForGC (
- &pstrLogSwitchName,
- &iSwitchNameLength);
-
- if (iSwitchNameLength > MAX_LOG_SWITCH_NAME_LEN)
- {
- wcsncpy_s (wszSwitchName, COUNTOF(wszSwitchName), pstrLogSwitchName, _TRUNCATE);
- }
- else
- {
- wcscpy_s (wszSwitchName, COUNTOF(wszSwitchName), pstrLogSwitchName);
- }
-
- // extract the (WCHAR) name from the STRINGREF object
- strParentName->RefInterpretGetStringValuesDangerousForGC (
- &pstrParentName,
- &iParentNameLength);
-
- if (iParentNameLength > MAX_LOG_SWITCH_NAME_LEN)
- {
- wcsncpy_s (wszParentName, COUNTOF(wszParentName), pstrParentName, _TRUNCATE);
- }
- else
- {
- wcscpy_s (wszParentName, COUNTOF(wszParentName), pstrParentName);
- }
-
-#ifdef DEBUGGING_SUPPORTED
- if (g_pDebugInterface)
- {
- g_pDebugInterface->SendLogSwitchSetting (Level,
- SWITCH_MODIFY,
- wszSwitchName,
- wszParentName
- );
- }
-#endif // DEBUGGING_SUPPORTED
-
- HELPER_METHOD_FRAME_END();
-}
-FCIMPLEND
-
-
-void Log::DebuggerModifyingLogSwitch (int iNewLevel,
- const WCHAR *pLogSwitchName
- )
-{
- CONTRACTL
- {
- GC_NOTRIGGER;
- }
- CONTRACTL_END;
-
- // check if an entry with this name exists in the hash table.
- OBJECTHANDLE ObjHandle = g_sLogHashTable.GetEntryFromHashTable (pLogSwitchName);
- if ( ObjHandle != NULL)
- {
- OBJECTREF obj = ObjectFromHandle (ObjHandle);
- LogSwitchObject *pLogSwitch = (LogSwitchObject *)(OBJECTREFToObject (obj));
-
- pLogSwitch->SetLevel (iNewLevel);
- }
-}
-
-
-// Note: Caller should ensure that it's not adding a duplicate
-// entry by calling GetEntryFromHashTable before calling this
-// function.
-HRESULT LogHashTable::AddEntryToHashTable (const WCHAR *pKey,
- OBJECTHANDLE pData
- )
-{
- CONTRACTL
- {
- THROWS;
- GC_NOTRIGGER;
- }
- CONTRACTL_END;
-
- HashElement *pElement;
-
- // check that the length is non-zero
- if (pKey == NULL)
- {
- return (E_INVALIDARG);
- }
-
- int iHashKey = 0;
- int iLength = (int)wcslen (pKey);
-
- for (int i= 0; i<iLength; i++)
- {
- iHashKey += pKey [i];
- }
-
- iHashKey = iHashKey % MAX_HASH_BUCKETS;
-
- // Create a new HashElement. This throws on oom, nothing to cleanup.
- pElement = new HashElement;
-
- pElement->SetData (pData, pKey);
-
- if (m_Buckets [iHashKey] == NULL)
- {
- m_Buckets [iHashKey] = pElement;
- }
- else
- {
- pElement->SetNext (m_Buckets [iHashKey]);
- m_Buckets [iHashKey] = pElement;
- }
-
- return S_OK;
-}
-
-
-OBJECTHANDLE LogHashTable::GetEntryFromHashTable (const WCHAR *pKey)
-{
- CONTRACTL
- {
- THROWS;
- GC_NOTRIGGER;
- }
- CONTRACTL_END;
-
- if (pKey == NULL)
- {
- return NULL;
- }
-
- int iHashKey = 0;
- int iLength = (int)wcslen (pKey);
-
- // Calculate the hash value of the given key
- for (int i= 0; i<iLength; i++)
- {
- iHashKey += pKey [i];
- }
-
- iHashKey = iHashKey % MAX_HASH_BUCKETS;
-
- HashElement *pElement = m_Buckets [iHashKey];
-
- // Find and return the data
- while (pElement != NULL)
- {
- if (wcscmp(pElement->GetKey(), pKey) == 0)
- {
- return (pElement->GetData());
- }
-
- pElement = pElement->GetNext();
- }
-
- return NULL;
-}
-
-//
-// Returns a textual representation of the current stack trace. The format of the stack
-// trace is the same as returned by StackTrace.ToString.
-//
-void GetManagedStackTraceString(BOOL fNeedFileInfo, SString &result)
-{
- CONTRACTL
- {
- THROWS;
- GC_TRIGGERS;
- MODE_ANY;
- }
- CONTRACTL_END;
-
- // Switch to cooperative GC mode before we call into managed code.
- GCX_COOP();
-
- MethodDescCallSite managedHelper(METHOD__STACK_TRACE__GET_MANAGED_STACK_TRACE_HELPER);
- ARG_SLOT args[] =
- {
- BoolToArgSlot(fNeedFileInfo)
- };
-
- STRINGREF resultStringRef = (STRINGREF) managedHelper.Call_RetOBJECTREF(args);
- resultStringRef->GetSString(result);
-}
-
#endif // !DACCESS_COMPILE
diff --git a/src/vm/debugdebugger.h b/src/vm/debugdebugger.h
index 6c4d383765..11045d3ffa 100644
--- a/src/vm/debugdebugger.h
+++ b/src/vm/debugdebugger.h
@@ -17,48 +17,17 @@
#include <object.h>
-// ! WARNING !
-// The following constants mirror the constants
-// declared in the class LoggingLevelEnum in the
-// System.Diagnostic package. Any changes here will also
-// need to be made there.
-#define TraceLevel0 0
-#define TraceLevel1 1
-#define TraceLevel2 2
-#define TraceLevel3 3
-#define TraceLevel4 4
-#define StatusLevel0 20
-#define StatusLevel1 21
-#define StatusLevel2 22
-#define StatusLevel3 23
-#define StatusLevel4 24
-#define WarningLevel 40
-#define ErrorLevel 50
-#define PanicLevel 100
-
-// ! WARNING !
-// The following constants mirror the constants
-// declared in the class AssertLevelEnum in the
-// System.Diagnostic package. Any changes here will also
-// need to be made there.
-#define FailDebug 0
-#define FailIgnore 1
-#define FailTerminate 2
-#define FailContinueFilter 3
-
-#define MAX_LOG_SWITCH_NAME_LEN 256
-
class DebugDebugger
{
public:
- static FCDECL0(void, Break);
+ static FCDECL0(void, Break);
static FCDECL0(FC_BOOL_RET, Launch);
static FCDECL0(FC_BOOL_RET, IsDebuggerAttached);
- static FCDECL3(void, Log, INT32 Level, StringObject* strModule, StringObject* strMessage);
+ static FCDECL3(void, Log, INT32 Level, StringObject* strModule, StringObject* strMessage);
// receives a custom notification object from the target and sends it to the RS via
// code:Debugger::SendCustomDebuggerNotification
- static FCDECL1(void, CustomNotification, Object * dataUNSAFE);
+ static FCDECL1(void, CustomNotification, Object * dataUNSAFE);
static FCDECL0(FC_BOOL_RET, IsLogging);
@@ -67,8 +36,6 @@ protected:
};
-
-
class StackFrameHelper : public Object
{
// READ ME:
@@ -78,9 +45,9 @@ public:
THREADBASEREF targetThread;
I4ARRAYREF rgiOffset;
I4ARRAYREF rgiILOffset;
- BASEARRAYREF rgMethodBase;
- PTRARRAYREF dynamicMethods;
- BASEARRAYREF rgMethodHandle;
+ BASEARRAYREF rgMethodBase;
+ PTRARRAYREF dynamicMethods;
+ BASEARRAYREF rgMethodHandle;
PTRARRAYREF rgAssemblyPath;
BASEARRAYREF rgLoadedPeAddress;
I4ARRAYREF rgiLoadedPeSize;
@@ -102,13 +69,13 @@ protected:
~StackFrameHelper() {}
public:
- void SetFrameCount (int iCount)
- {
+ void SetFrameCount(int iCount)
+ {
iFrameCount = iCount;
}
- int GetFrameCount (void)
- {
+ int GetFrameCount(void)
+ {
return iFrameCount;
}
@@ -122,7 +89,7 @@ typedef StackFrameHelper* STACKFRAMEHELPERREF;
class DebugStackTrace
-{
+{
public:
#ifndef DACCESS_COMPILE
@@ -209,175 +176,4 @@ private:
};
-class DebuggerAssert
-{
-private:
-
-public:
-
- static FCDECL4(INT32,
- ShowDefaultAssertDialog,
- StringObject* strConditionUNSAFE,
- StringObject* strMessageUNSAFE,
- StringObject* strStackTraceUNSAFE,
- StringObject* strWindowTitleUNSAFE
- );
-
-};
-
-
-// The following code is taken from object.h and modified to suit
-// LogSwitchBaseObject
-//
-class LogSwitchObject : public Object
-{
- protected:
- // README:
- // Modifying the order or fields of this object may require other changes to the
- // classlib class defintion of the LogSwitch object.
-
- STRINGREF m_strName;
- STRINGREF strDescription;
- OBJECTREF m_ParentSwitch;
- INT32 m_iLevel;
- INT32 m_iOldLevel;
-
- protected:
- LogSwitchObject() {}
- ~LogSwitchObject() {}
-
- public:
- // check for classes that wrap Ole classes
-
- void SetLevel(INT32 iLevel)
- {
- m_iLevel = iLevel;
- }
-
- INT32 GetLevel(void)
- {
- return m_iLevel;
- }
-
- OBJECTREF GetParent (void)
- {
- return m_ParentSwitch;
- }
-
- STRINGREF GetName (void)
- {
- return m_strName;
- }
-};
-
-#ifdef USE_CHECKED_OBJECTREFS
-typedef REF <LogSwitchObject> LOGSWITCHREF;
-#else
-typedef LogSwitchObject* LOGSWITCHREF;
-#endif
-
-
-#define MAX_KEY_LENGTH 64
-#define MAX_HASH_BUCKETS 20
-
-class HashElement
-{
-private:
-
- OBJECTHANDLE m_pData;
- SString m_strKey;
- HashElement *m_pNext;
-
-public:
-
- HashElement ()
- {
- LIMITED_METHOD_CONTRACT;
- m_pData = NULL;
- m_pNext = NULL;
- }
-
- ~HashElement()
- {
- if (m_pNext!= NULL)
- {
- delete m_pNext;
- }
-
- m_pNext=NULL;
-
- }// ~HashElement
-
- void SetData (OBJECTHANDLE pData, const WCHAR *pKey)
- {
- m_pData = pData;
- m_strKey.Set(pKey);
- }
-
- OBJECTHANDLE GetData (void)
- {
- return m_pData;
- }
-
- const WCHAR *GetKey (void)
- {
- return m_strKey.GetUnicode();
- }
-
- void SetNext (HashElement *pNext)
- {
- m_pNext = pNext;
- }
-
- HashElement *GetNext (void)
- {
- return m_pNext;
- }
-
-};
-
-class LogHashTable
-{
-private:
-
- HashElement *m_Buckets [MAX_HASH_BUCKETS];
-
-public:
- // static global object, no constructors/destructors, assumes zero initialized memory
-
- HRESULT AddEntryToHashTable (const WCHAR *pKey, OBJECTHANDLE pData);
-
- OBJECTHANDLE GetEntryFromHashTable (const WCHAR *pKey);
-
-};
-
-extern LogHashTable g_sLogHashTable;
-
-
-class Log
-{
-private:
-
-public:
- static FCDECL1(void, AddLogSwitch, LogSwitchObject * m_LogSwitch);
-
- static FCDECL3(void,
- ModifyLogSwitch,
- INT32 Level,
- StringObject* strLogSwitchNameUNSAFE,
- StringObject* strParentNameUNSAFE
- );
-
- // The following method is called when the level of a log switch is modified
- // from the debugger. It is not an ecall.
- static void DebuggerModifyingLogSwitch (int iNewLevel, const WCHAR *pLogSwitchName);
-
-};
-
-//
-// Returns a textual representation of the current stack trace. The format of the stack
-// trace is the same as returned by StackTrace.ToString.
-//
-void GetManagedStackTraceString(BOOL fNeedFileInfo, SString &result);
-
#endif // __DEBUG_DEBUGGER_h__
diff --git a/src/vm/ecalllist.h b/src/vm/ecalllist.h
index 83b6539f42..35bd0c7614 100644
--- a/src/vm/ecalllist.h
+++ b/src/vm/ecalllist.h
@@ -145,15 +145,6 @@ FCFuncStart(gDiagnosticsStackTrace)
FCFuncElement("GetStackFramesInternal", DebugStackTrace::GetStackFramesInternal)
FCFuncEnd()
-FCFuncStart(gDiagnosticsLog)
- FCFuncElement("AddLogSwitch", Log::AddLogSwitch)
- FCFuncElement("ModifyLogSwitch", Log::ModifyLogSwitch)
-FCFuncEnd()
-
-FCFuncStart(gDiagnosticsAssert)
- FCFuncElement("ShowDefaultAssertDialog", DebuggerAssert::ShowDefaultAssertDialog)
-FCFuncEnd()
-
FCFuncStart(gDateTimeFuncs)
FCFuncElement("GetSystemTimeAsFileTime", SystemNative::__GetSystemTimeAsFileTime)
FCFuncEnd()
@@ -467,10 +458,6 @@ FCFuncStart(gCompatibilitySwitchFuncs)
FCFuncEnd()
-FCFuncStart(gBCLDebugFuncs)
- FCFuncElement("GetRegistryLoggingValues", ManagedLoggingHelper::GetRegistryLoggingValues)
-FCFuncEnd()
-
FCFuncStart(gAppDomainManagerFuncs)
QCFuncElement("GetEntryAssembly", AssemblyNative::GetEntryAssembly)
FCFuncEnd()
@@ -1317,8 +1304,6 @@ FCClassElement("AssemblyExtensions", "System.Reflection.Metadata", gAssemblyExte
FCClassElement("AssemblyLoadContext", "System.Runtime.Loader", gAssemblyLoadContextFuncs)
FCClassElement("AssemblyName", "System.Reflection", gAssemblyNameFuncs)
-FCClassElement("Assert", "System.Diagnostics", gDiagnosticsAssert)
-FCClassElement("BCLDebug", "System", gBCLDebugFuncs)
FCClassElement("Buffer", "System", gBufferFuncs)
FCClassElement("CLRConfig", "System", gClrConfig)
FCClassElement("CompareInfo", "System.Globalization", gCompareInfoFuncs)
@@ -1360,7 +1345,6 @@ FCClassElement("InterfaceMarshaler", "System.StubHelpers", gInterfaceMarshalerFu
FCClassElement("Interlocked", "System.Threading", gInterlockedFuncs)
FCClassElement("JitHelpers", "System.Runtime.CompilerServices", gJitHelpers)
FCClassElement("LoaderAllocatorScout", "System.Reflection", gLoaderAllocatorFuncs)
-FCClassElement("Log", "System.Diagnostics", gDiagnosticsLog)
FCClassElement("ManifestBasedResourceGroveler", "System.Resources", gManifestBasedResourceGrovelerFuncs)
FCClassElement("Marshal", "System.Runtime.InteropServices", gInteropMarshalFuncs)
FCClassElement("Math", "System", gMathFuncs)
diff --git a/src/vm/eedbginterfaceimpl.cpp b/src/vm/eedbginterfaceimpl.cpp
index e9f59d25d2..976e6b6745 100644
--- a/src/vm/eedbginterfaceimpl.cpp
+++ b/src/vm/eedbginterfaceimpl.cpp
@@ -1457,8 +1457,6 @@ void EEDbgInterfaceImpl::DebuggerModifyingLogSwitch (int iNewLevel,
GC_NOTRIGGER;
}
CONTRACTL_END;
-
- Log::DebuggerModifyingLogSwitch (iNewLevel, pLogSwitchName);
}
diff --git a/src/vm/i386/stublinkerx86.cpp b/src/vm/i386/stublinkerx86.cpp
index e07b6e1c37..14b9701a29 100644
--- a/src/vm/i386/stublinkerx86.cpp
+++ b/src/vm/i386/stublinkerx86.cpp
@@ -5925,6 +5925,17 @@ static void AppendGCLayout(ULONGARRAY &gcLayout, size_t baseOffset, BOOL fIsType
_ASSERTE(pMT);
_ASSERTE(pMT->IsValueType());
+ if (pMT->IsByRefLike())
+ {
+ FindByRefPointerOffsetsInByRefLikeObject(
+ pMT,
+ baseOffset,
+ [&](size_t pointerOffset)
+ {
+ *gcLayout.AppendThrowing() = (ULONG)(pointerOffset | 1); // "| 1" to mark it as an interior pointer
+ });
+ }
+
// walk the GC descriptors, reporting the correct offsets
if (pMT->ContainsPointers())
{
diff --git a/src/vm/microsoft.comservices.h b/src/vm/microsoft.comservices.h
deleted file mode 100644
index e112392ecc..0000000000
--- a/src/vm/microsoft.comservices.h
+++ /dev/null
@@ -1,277 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-#pragma warning( disable: 4049 ) /* more than 64k source lines */
-
-/* this ALWAYS GENERATED file contains the definitions for the interfaces */
-
-
- /* File created by MIDL compiler version 5.03.0280 */
-/* at Mon Jul 17 19:19:10 2000
- */
-/* Compiler settings for Z:\urt\inst\v1.x86chk\Microsoft.ComServices.idl:
- Os (OptLev=s), W1, Zp8, env=Win32 (32b run), ms_ext, c_ext
- error checks: allocation ref bounds_check enum stub_data
- VC __declspec() decoration level:
- __declspec(uuid()), __declspec(selectany), __declspec(novtable)
- DECLSPEC_UUID(), MIDL_INTERFACE()
-*/
-//@@MIDL_FILE_HEADING( )
-
-
-/* verify that the <rpcndr.h> version is high enough to compile this file*/
-#ifndef __REQUIRED_RPCNDR_H_VERSION__
-#define __REQUIRED_RPCNDR_H_VERSION__ 440
-#endif
-
-#include "rpc.h"
-#include "rpcndr.h"
-
-#ifndef __Microsoft2EComServices_h__
-#define __Microsoft2EComServices_h__
-
-/* Forward Declarations */
-
-#ifndef __IRegistrationHelper_FWD_DEFINED__
-#define __IRegistrationHelper_FWD_DEFINED__
-typedef interface IRegistrationHelper IRegistrationHelper;
-#endif /* __IRegistrationHelper_FWD_DEFINED__ */
-
-
-#ifndef __RegistrationHelperTx_FWD_DEFINED__
-#define __RegistrationHelperTx_FWD_DEFINED__
-
-#ifdef __cplusplus
-typedef class RegistrationHelperTx RegistrationHelperTx;
-#else
-typedef struct RegistrationHelperTx RegistrationHelperTx;
-#endif /* __cplusplus */
-
-#endif /* __RegistrationHelperTx_FWD_DEFINED__ */
-
-
-#ifdef __cplusplus
-extern "C"{
-#endif
-
-void __RPC_FAR * __RPC_USER MIDL_user_allocate(size_t);
-void __RPC_USER MIDL_user_free( void __RPC_FAR * );
-
-
-#ifndef __Microsoft_ComServices_LIBRARY_DEFINED__
-#define __Microsoft_ComServices_LIBRARY_DEFINED__
-
-/* library Microsoft_ComServices */
-/* [version][uuid] */
-
-
-typedef /* [public][public][uuid] */ DECLSPEC_UUID("9D667CBC-FE79-3B45-AEBB-6303106B137A")
-enum __MIDL___MIDL_itf_Microsoft2EComServices_0000_0001
- { InstallationFlags_Default = 0,
- InstallationFlags_ExpectExistingTypeLib = 1,
- InstallationFlags_CreateTargetApplication = 2,
- InstallationFlags_FindOrCreateTargetApplication = 4,
- InstallationFlags_ReconfigureExistingApplication = 8,
- InstallationFlags_Register = 256,
- InstallationFlags_Install = 512,
- InstallationFlags_Configure = 1024
- } InstallationFlags;
-
-
-EXTERN_C const IID LIBID_Microsoft_ComServices;
-
-#ifndef __IRegistrationHelper_INTERFACE_DEFINED__
-#define __IRegistrationHelper_INTERFACE_DEFINED__
-
-/* interface IRegistrationHelper */
-/* [object][custom][oleautomation][uuid] */
-
-
-EXTERN_C const IID IID_IRegistrationHelper;
-
-#if defined(__cplusplus) && !defined(CINTERFACE)
-
- MIDL_INTERFACE("55E3EA25-55CB-4650-8887-18E8D30BB4BC")
- IRegistrationHelper : public IUnknown
- {
- public:
- virtual HRESULT __stdcall InstallAssembly(
- /* [in] */ BSTR assembly,
- /* [out][in] */ BSTR __RPC_FAR *application,
- /* [out][in] */ BSTR __RPC_FAR *tlb,
- /* [in] */ InstallationFlags installFlags) = 0;
-
- virtual HRESULT __stdcall RegisterAssembly(
- /* [in] */ BSTR assembly,
- /* [out][in] */ BSTR __RPC_FAR *tlb) = 0;
-
- virtual HRESULT __stdcall ConfigureAssembly(
- /* [in] */ BSTR assembly,
- /* [in] */ BSTR application) = 0;
-
- virtual HRESULT __stdcall UninstallAssembly(
- /* [in] */ BSTR assembly,
- /* [in] */ BSTR application) = 0;
-
- };
-
-#else /* C style interface */
-
- typedef struct IRegistrationHelperVtbl
- {
- BEGIN_INTERFACE
-
- HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )(
- IRegistrationHelper __RPC_FAR * This,
- /* [in] */ REFIID riid,
- /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
-
- ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )(
- IRegistrationHelper __RPC_FAR * This);
-
- ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )(
- IRegistrationHelper __RPC_FAR * This);
-
- HRESULT ( __stdcall __RPC_FAR *InstallAssembly )(
- IRegistrationHelper __RPC_FAR * This,
- /* [in] */ BSTR assembly,
- /* [out][in] */ BSTR __RPC_FAR *application,
- /* [out][in] */ BSTR __RPC_FAR *tlb,
- /* [in] */ InstallationFlags installFlags);
-
- HRESULT ( __stdcall __RPC_FAR *RegisterAssembly )(
- IRegistrationHelper __RPC_FAR * This,
- /* [in] */ BSTR assembly,
- /* [out][in] */ BSTR __RPC_FAR *tlb);
-
- HRESULT ( __stdcall __RPC_FAR *ConfigureAssembly )(
- IRegistrationHelper __RPC_FAR * This,
- /* [in] */ BSTR assembly,
- /* [in] */ BSTR application);
-
- HRESULT ( __stdcall __RPC_FAR *UninstallAssembly )(
- IRegistrationHelper __RPC_FAR * This,
- /* [in] */ BSTR assembly,
- /* [in] */ BSTR application);
-
- END_INTERFACE
- } IRegistrationHelperVtbl;
-
- interface IRegistrationHelper
- {
- CONST_VTBL struct IRegistrationHelperVtbl __RPC_FAR *lpVtbl;
- };
-
-
-
-#ifdef COBJMACROS
-
-
-#define IRegistrationHelper_QueryInterface(This,riid,ppvObject) \
- (This)->lpVtbl -> QueryInterface(This,riid,ppvObject)
-
-#define IRegistrationHelper_AddRef(This) \
- (This)->lpVtbl -> AddRef(This)
-
-#define IRegistrationHelper_Release(This) \
- (This)->lpVtbl -> Release(This)
-
-
-#define IRegistrationHelper_InstallAssembly(This,assembly,application,tlb,installFlags) \
- (This)->lpVtbl -> InstallAssembly(This,assembly,application,tlb,installFlags)
-
-#define IRegistrationHelper_RegisterAssembly(This,assembly,tlb) \
- (This)->lpVtbl -> RegisterAssembly(This,assembly,tlb)
-
-#define IRegistrationHelper_ConfigureAssembly(This,assembly,application) \
- (This)->lpVtbl -> ConfigureAssembly(This,assembly,application)
-
-#define IRegistrationHelper_UninstallAssembly(This,assembly,application) \
- (This)->lpVtbl -> UninstallAssembly(This,assembly,application)
-
-#endif /* COBJMACROS */
-
-
-#endif /* C style interface */
-
-
-
-HRESULT __stdcall IRegistrationHelper_InstallAssembly_Proxy(
- IRegistrationHelper __RPC_FAR * This,
- /* [in] */ BSTR assembly,
- /* [out][in] */ BSTR __RPC_FAR *application,
- /* [out][in] */ BSTR __RPC_FAR *tlb,
- /* [in] */ InstallationFlags installFlags);
-
-
-void __RPC_STUB IRegistrationHelper_InstallAssembly_Stub(
- IRpcStubBuffer *This,
- IRpcChannelBuffer *_pRpcChannelBuffer,
- PRPC_MESSAGE _pRpcMessage,
- DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRegistrationHelper_RegisterAssembly_Proxy(
- IRegistrationHelper __RPC_FAR * This,
- /* [in] */ BSTR assembly,
- /* [out][in] */ BSTR __RPC_FAR *tlb);
-
-
-void __RPC_STUB IRegistrationHelper_RegisterAssembly_Stub(
- IRpcStubBuffer *This,
- IRpcChannelBuffer *_pRpcChannelBuffer,
- PRPC_MESSAGE _pRpcMessage,
- DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRegistrationHelper_ConfigureAssembly_Proxy(
- IRegistrationHelper __RPC_FAR * This,
- /* [in] */ BSTR assembly,
- /* [in] */ BSTR application);
-
-
-void __RPC_STUB IRegistrationHelper_ConfigureAssembly_Stub(
- IRpcStubBuffer *This,
- IRpcChannelBuffer *_pRpcChannelBuffer,
- PRPC_MESSAGE _pRpcMessage,
- DWORD *_pdwStubPhase);
-
-
-HRESULT __stdcall IRegistrationHelper_UninstallAssembly_Proxy(
- IRegistrationHelper __RPC_FAR * This,
- /* [in] */ BSTR assembly,
- /* [in] */ BSTR application);
-
-
-void __RPC_STUB IRegistrationHelper_UninstallAssembly_Stub(
- IRpcStubBuffer *This,
- IRpcChannelBuffer *_pRpcChannelBuffer,
- PRPC_MESSAGE _pRpcMessage,
- DWORD *_pdwStubPhase);
-
-
-
-#endif /* __IRegistrationHelper_INTERFACE_DEFINED__ */
-
-
-EXTERN_C const CLSID CLSID_RegistrationHelperTx;
-
-#ifdef __cplusplus
-
-class DECLSPEC_UUID("89A86E7B-C229-4008-9BAA-2F5C8411D7E0")
-RegistrationHelperTx;
-#endif
-#endif /* __Microsoft_ComServices_LIBRARY_DEFINED__ */
-
-/* Additional Prototypes for ALL interfaces */
-
-/* end of Additional Prototypes */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
-
diff --git a/src/vm/microsoft.comservices_i.c b/src/vm/microsoft.comservices_i.c
deleted file mode 100644
index f31a92f53e..0000000000
--- a/src/vm/microsoft.comservices_i.c
+++ /dev/null
@@ -1,173 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-#pragma warning( disable: 4049 ) /* more than 64k source lines */
-
-/* this ALWAYS GENERATED file contains the IIDs and CLSIDs */
-
-/* link this file in with the server and any clients */
-
-
- /* File created by MIDL compiler version 5.03.0280 */
-/* at Mon Jul 17 19:19:10 2000
- */
-/* Compiler settings for Z:\urt\inst\v1.x86chk\Microsoft.ComServices.idl:
- Os (OptLev=s), W1, Zp8, env=Win32 (32b run), ms_ext, c_ext
- error checks: allocation ref bounds_check enum stub_data
- VC __declspec() decoration level:
- __declspec(uuid()), __declspec(selectany), __declspec(novtable)
- DECLSPEC_UUID(), MIDL_INTERFACE()
-*/
-//@@MIDL_FILE_HEADING( )
-
-#if !defined(_M_IA64) && !defined(_M_AXP64)
-
-#include <rpc.h>
-#include <rpcndr.h>
-
-#ifdef __cplusplus
-extern "C"{
-#endif
-
-#ifdef _MIDL_USE_GUIDDEF_
-
-#ifndef INITGUID
-#define INITGUID
-#include <guiddef.h>
-#undef INITGUID
-#else
-#include <guiddef.h>
-#endif
-
-#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \
- DEFINE_GUID(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8)
-
-#else // !_MIDL_USE_GUIDDEF_
-
-#ifndef __IID_DEFINED__
-#define __IID_DEFINED__
-
-typedef struct _IID
-{
- unsigned long x;
- unsigned short s1;
- unsigned short s2;
- unsigned char c[8];
-} IID;
-
-#endif // __IID_DEFINED__
-
-#ifndef CLSID_DEFINED
-#define CLSID_DEFINED
-typedef IID CLSID;
-#endif // CLSID_DEFINED
-
-#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \
- const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}
-
-#endif // !_MIDL_USE_GUIDDEF_
-
-MIDL_DEFINE_GUID(IID, LIBID_Microsoft_ComServices,0xD7F68C66,0x3833,0x3832,0xB6,0xD0,0xB7,0x96,0xBB,0x7D,0x2D,0xFF);
-
-
-MIDL_DEFINE_GUID(IID, IID_IRegistrationHelper,0x55E3EA25,0x55CB,0x4650,0x88,0x87,0x18,0xE8,0xD3,0x0B,0xB4,0xBC);
-
-
-MIDL_DEFINE_GUID(CLSID, CLSID_RegistrationHelperTx,0x89A86E7B,0xC229,0x4008,0x9B,0xAA,0x2F,0x5C,0x84,0x11,0xD7,0xE0);
-
-#undef MIDL_DEFINE_GUID
-
-#ifdef __cplusplus
-}
-#endif
-
-
-
-#endif /* !defined(_M_IA64) && !defined(_M_AXP64)*/
-
-
-#pragma warning( disable: 4049 ) /* more than 64k source lines */
-
-/* this ALWAYS GENERATED file contains the IIDs and CLSIDs */
-
-/* link this file in with the server and any clients */
-
-
- /* File created by MIDL compiler version 5.03.0280 */
-/* at Mon Jul 17 19:19:10 2000
- */
-/* Compiler settings for Z:\urt\inst\v1.x86chk\Microsoft.ComServices.idl:
- Oicf (OptLev=i2), W1, Zp8, env=Win64 (32b run,appending), ms_ext, c_ext, robust
- error checks: allocation ref bounds_check enum stub_data
- VC __declspec() decoration level:
- __declspec(uuid()), __declspec(selectany), __declspec(novtable)
- DECLSPEC_UUID(), MIDL_INTERFACE()
-*/
-//@@MIDL_FILE_HEADING( )
-
-#if defined(_M_IA64) || defined(_M_AXP64)
-
-#include <rpc.h>
-#include <rpcndr.h>
-
-#ifdef __cplusplus
-extern "C"{
-#endif
-
-#ifdef _MIDL_USE_GUIDDEF_
-
-#ifndef INITGUID
-#define INITGUID
-#include <guiddef.h>
-#undef INITGUID
-#else
-#include <guiddef.h>
-#endif
-
-#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \
- DEFINE_GUID(name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8)
-
-#else // !_MIDL_USE_GUIDDEF_
-
-#ifndef __IID_DEFINED__
-#define __IID_DEFINED__
-
-typedef struct _IID
-{
- unsigned long x;
- unsigned short s1;
- unsigned short s2;
- unsigned char c[8];
-} IID;
-
-#endif // __IID_DEFINED__
-
-#ifndef CLSID_DEFINED
-#define CLSID_DEFINED
-typedef IID CLSID;
-#endif // CLSID_DEFINED
-
-#define MIDL_DEFINE_GUID(type,name,l,w1,w2,b1,b2,b3,b4,b5,b6,b7,b8) \
- const type name = {l,w1,w2,{b1,b2,b3,b4,b5,b6,b7,b8}}
-
-#endif // !_MIDL_USE_GUIDDEF_
-
-MIDL_DEFINE_GUID(IID, LIBID_Microsoft_ComServices,0xD7F68C66,0x3833,0x3832,0xB6,0xD0,0xB7,0x96,0xBB,0x7D,0x2D,0xFF);
-
-
-MIDL_DEFINE_GUID(IID, IID_IRegistrationHelper,0x55E3EA25,0x55CB,0x4650,0x88,0x87,0x18,0xE8,0xD3,0x0B,0xB4,0xBC);
-
-
-MIDL_DEFINE_GUID(CLSID, CLSID_RegistrationHelperTx,0x89A86E7B,0xC229,0x4008,0x9B,0xAA,0x2F,0x5C,0x84,0x11,0xD7,0xE0);
-
-#undef MIDL_DEFINE_GUID
-
-#ifdef __cplusplus
-}
-#endif
-
-
-
-#endif /* defined(_M_IA64) || defined(_M_AXP64)*/
-
diff --git a/src/vm/mscorlib.h b/src/vm/mscorlib.h
index f20e8d30b1..addcaf9053 100644
--- a/src/vm/mscorlib.h
+++ b/src/vm/mscorlib.h
@@ -840,9 +840,6 @@ DEFINE_FIELD_U(rgiLastFrameFromForeignExceptionStackTrace, StackFrame
DEFINE_FIELD_U(getSourceLineInfo, StackFrameHelper, getSourceLineInfo)
DEFINE_FIELD_U(iFrameCount, StackFrameHelper, iFrameCount)
-DEFINE_CLASS(STACK_TRACE, Diagnostics, StackTrace)
-DEFINE_METHOD(STACK_TRACE, GET_MANAGED_STACK_TRACE_HELPER, GetManagedStackTraceStringHelper, SM_Bool_RetStr)
-
DEFINE_CLASS(STREAM, IO, Stream)
DEFINE_METHOD(STREAM, BEGIN_READ, BeginRead, IM_ArrByte_Int_Int_AsyncCallback_Object_RetIAsyncResult)
DEFINE_METHOD(STREAM, END_READ, EndRead, IM_IAsyncResult_RetInt)
diff --git a/src/vm/object.inl b/src/vm/object.inl
index 5dc3d6d116..495f7bff71 100644
--- a/src/vm/object.inl
+++ b/src/vm/object.inl
@@ -325,4 +325,41 @@ inline TypeHandle Object::GetGCSafeTypeHandle() const
return TypeHandle(pMT);
}
+template<class F>
+inline void FindByRefPointerOffsetsInByRefLikeObject(PTR_MethodTable pMT, SIZE_T baseOffset, const F processPointerOffset)
+{
+ WRAPPER_NO_CONTRACT;
+ _ASSERTE(pMT != nullptr);
+ _ASSERTE(pMT->IsByRefLike());
+
+ // TODO: TypedReference should ideally be implemented as a by-ref-like struct containing a ByReference<T> field,
+ // in which case the check for g_TypedReferenceMT below would not be necessary
+ if (pMT == g_TypedReferenceMT || pMT->HasSameTypeDefAs(g_pByReferenceClass))
+ {
+ processPointerOffset(baseOffset);
+ return;
+ }
+
+ ApproxFieldDescIterator fieldIterator(pMT, ApproxFieldDescIterator::INSTANCE_FIELDS);
+ for (FieldDesc *pFD = fieldIterator.Next(); pFD != NULL; pFD = fieldIterator.Next())
+ {
+ if (pFD->GetFieldType() != ELEMENT_TYPE_VALUETYPE)
+ {
+ continue;
+ }
+
+ // TODO: GetApproxFieldTypeHandleThrowing may throw. This is a potential stress problem for fragile NGen of non-CoreLib
+ // assemblies. It won't ever throw for CoreCLR with R2R. Figure out if anything needs to be done to deal with the
+ // exception.
+ PTR_MethodTable pFieldMT = pFD->GetApproxFieldTypeHandleThrowing().AsMethodTable();
+ if (!pFieldMT->IsByRefLike())
+ {
+ continue;
+ }
+
+ SIZE_T fieldStartIndex = pFD->GetOffset() / sizeof(void *);
+ FindByRefPointerOffsetsInByRefLikeObject(pFieldMT, baseOffset + fieldStartIndex, processPointerOffset);
+ }
+}
+
#endif // _OBJECT_INL_
diff --git a/src/vm/perfdefaults.cpp b/src/vm/perfdefaults.cpp
deleted file mode 100644
index f6352bcd53..0000000000
--- a/src/vm/perfdefaults.cpp
+++ /dev/null
@@ -1,147 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-//*************************************************************************************************
-// PerfDefaults.cpp
-//
-
-//
-// Implementation of the "PerformanceScenario" config option, which defines a workload-specific
-// set of performance defaults. The key point of the code below is that it be clear exactly what
-// gets enabled for each scenario -- see the switch statements
-//
-// for host STARTUP_FLAGS, in GetModifiedStartupFlags
-// for environment, registry, or config CLRConfig values, in LookupConfigValue
-// for other global initialization, in InitializeForScenario
-//
-//*************************************************************************************************
-
-#include "common.h"
-#include "perfdefaults.h"
-
-// Useful to the readability of lists of settings below
-#define MATCHES(a,b) (SString::_wcsicmp((a),(b)) == 0)
-
-// The scenario we have been asked to run under
-PerformanceDefaults::PerformanceScenario PerformanceDefaults::s_Scenario = Uninitialized;
-
-// See use in code:PerformanceDefaults:InitializeForScenario
-extern int32_t g_bLowMemoryFromHost;
-
-
-//
-// Initialize our system to provide performance defaults for a given scenario.
-// If the scenario name is not recognized, intentionally ignore it and operate as if not specified.
-//
- void PerformanceDefaults::InitializeForScenario(__in_opt LPWSTR scenarioName)
-{
- LIMITED_METHOD_CONTRACT;
-
- // First convert the scenario name to the corresponding enum value
- s_Scenario = None;
- if (scenarioName != NULL)
- {
- if (MATCHES(scenarioName, W("HighDensityWebHosting"))) s_Scenario = HighDensityWebHosting;
- }
-
- // Next do any scenario-specific initialization
- switch (s_Scenario)
- {
- case None:
- break;
-
- case HighDensityWebHosting:
- // Tell the hosting API that we want the GC to operate as if the machine is under memory pressure.
- // This is a workaround because we do not want to expose "force low memory mode" as either a CLR
- // config option or a host startup flag (the two types of knob that PerformanceDefaults can alter) and
- // ASP.Net has not yet become a memory host. When they do, this can be removed and they can
- // make an initial call to ICLRMemoryNotificationCallback:OnMemoryNotification(eMemoryAvailableLow).
- //
- // Note that in order for ASP.Net to become a memory host the CLR will need to support profiler attach
- // in that condition.
- g_bLowMemoryFromHost = 1;
- break;
-
- case Uninitialized:
- // Unreachable, but make GCC happy
- break;
- }
-
- // Finally register our lookup function with the CLRConfig system so we get called when a 'MayHavePerformanceDefault'
- // config option is about to resolve to its runtime default
- if (s_Scenario != None)
- {
- CLRConfig::RegisterGetPerformanceDefaultValueCallback(&LookupConfigValue);
- }
-}
-
-
-//
-// Called at runtime startup to allow host-specified STARTUP_FLAGS to be overridden when running
-// under a scenario.
-//
-// Note that we are comfortable overriding the values the host has asked us to use (see
-// file:PerfDefaults.h), but we never want to override a value specified by a user to CLRConfig.
-// This comes up here because there are settings that are configurable through both systems.
-// So where an option has both STARTUP_FLAG A and CLRConfig value B, first check whether B has
-// been specified before altering the value of A. This way, we maintain complete compatibility
-// with whatever the interaction of A and B has produced in the past.
-//
-STARTUP_FLAGS PerformanceDefaults::GetModifiedStartupFlags(STARTUP_FLAGS originalFlags)
-{
- LIMITED_METHOD_CONTRACT;
-
- DWORD newFlags = (DWORD)originalFlags;
-
- switch (s_Scenario)
- {
- case None:
- break;
-
- case HighDensityWebHosting:
- if (!CLRConfig::IsConfigOptionSpecified(W("gcServer"))) newFlags &= ~STARTUP_SERVER_GC;
- if (!CLRConfig::IsConfigOptionSpecified(W("gcConcurrent"))) newFlags &= ~STARTUP_CONCURRENT_GC;
- if (!CLRConfig::IsConfigOptionSpecified(W("gcTrimCommitOnLowMemory"))) newFlags |= STARTUP_TRIM_GC_COMMIT;
-
- break;
-
- case Uninitialized:
- // Check that no request for startup flags happens before our code has been initialized
- // and given a chance to modify them.
- _ASSERTE(!"PerformanceDefaults::InitializeForScenario should have already been called");
- break;
- }
-
- return (STARTUP_FLAGS)newFlags;
-}
-
-
-//
-// Called by the CLRConfig system whenever a 'MayHavePerformanceDefault' config option is about
-// to resolve to its runtime default (i.e. none of the corresponding environment variable, registry, or
-// config file values were specified).
-//
-BOOL PerformanceDefaults::LookupConfigValue(LPCWSTR name, DWORD *pValue)
-{
- LIMITED_METHOD_CONTRACT;
- _ASSERTE(pValue != NULL);
-
- switch (s_Scenario)
- {
- case None:
- return FALSE;
-
- case HighDensityWebHosting:
- if (MATCHES(name, W("shadowCopyVerifyByTimestamp"))) { *pValue = 1; return TRUE; }
- return FALSE;
-
- case Uninitialized:
- // Check that no request for a MayHavePerformanceDefault CLRConfig option happens
- // before our code has been initialized and given a chance to provide a default value.
- _ASSERTE(!"PerformanceDefaults::InitializeForScenario should have already been called");
- break;
- }
-
- return FALSE;
-}
-
diff --git a/src/vm/perfdefaults.h b/src/vm/perfdefaults.h
deleted file mode 100644
index 1420995a98..0000000000
--- a/src/vm/perfdefaults.h
+++ /dev/null
@@ -1,90 +0,0 @@
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-//
-// --------------------------------------------------------------------------------------------------
-// PerfDefaults.h
-//
-
-//
-// Implementation of the "PerformanceScenario" config option, which defines a workload-specific
-// set of performance defaults.
-//
-// The motivation is that every release we work closely with a partner to understand the performance
-// of their scenario and provide CLR behavior to improve it. Sometimes we are able to give them
-// an entirely different build of the CLR (because it happens to be on a different architecture, or
-// it needs to have a small size, etc), but not always. Sometimes we are able to change the
-// runtime to have the new behavior by default, but not always. When neither applies, we fall to
-// the ugly option of a set of one-off config values for the scenario (or machine administrators)
-// to opt in. This then creates the problem of a huge number of generic knobs that any application
-// can use in any combination. It also means that as we add additional improvements for the same
-// scenario, we need to ask developers or machine administrators to keep up with the growing list.
-//
-// Our solution is to opt-in to a set of performance settings all at once and based on the workload.
-// When a recognized 'PerformanceScenario' is specified in a config file, we want the runtime to
-// operate with a defined set of performance settings. This set may evolve over time to
-// automatically provide additional behavior to the same workload, just as we would for runtime
-// defaults. Note however that a key design point is that in any conflict between these performance
-// settings and one that is explicitly set by the user, the explicit user setting wins. Hence the
-// name PerformanceDefaults -- it is as if we had created a separate build of the runtime for a
-// particular scenario, changing only the default performance behavior, and continued to let people
-// opt in or opt-out individually to those settings that are important and general-purpose enough
-// to have an individual setting.
-//
-// To add a scenario,
-// Update the PerformanceScenario enum and InitializeForScenario so that it is recognized
-//
-// To add an overridden host STARTUP_FLAG,
-// Update the switch statement in GetModifiedStartupFlags; see note about IsConfigOptionSpecified
-//
-// To add an overridden CLRConfig default value,
-// Mark it with LookupOption CLRConfig::MayHavePerformanceDefault in clrconfigvalues.h
-// Update the switch statement in LookupConfigValue
-// If a new CLRConfig option, decide if it needs to be a general-purpose switch (hopefully no)
-// and if not create it as INTERNAL_
-//
-// --------------------------------------------------------------------------------------------------
-
-
-#ifndef __PerfDefaults_h__
-#define __PerfDefaults_h__
-
-class PerformanceDefaults
-{
-public:
-
- static void InitializeForScenario(__in_opt LPWSTR scenarioName);
-
- // Called at runtime startup to allow host-specified STARTUP_FLAGS to be overridden when running
- // under a scenario.
- //
- // Note that this does not follow the model of "only override if not specified." By the nature
- // of the startup flags being bits, they are all specified (as on or off). We have no way of
- // knowing which the host actually care about and which were left as the runtime default
- // out of lack of concern. However we found that so far the specified startup flags are hard
- // coded by the host (no way for the user to override at run time) and so we can build in
- // to the set of defaults which the host allows us to override.
- //
- // In the future, if a host needs us to be able to override startup flags conditionally, the
- // solution would be a new hosting API ICLRRuntimeInfo::SetOverridableStartupFlags.
- static STARTUP_FLAGS GetModifiedStartupFlags(STARTUP_FLAGS originalFlags);
-
- // Called by the CLRConfig system whenever a 'MayHavePerformanceDefault' config option is about
- // to resolve to its runtime default (i.e. none of the corresponding environment variable,
- // registry, or config file values were specified).
- static BOOL LookupConfigValue(LPCWSTR name, DWORD *pValue);
-
-private:
-
- enum PerformanceScenario
- {
- Uninitialized,
- None,
- HighDensityWebHosting,
- };
-
- static PerformanceScenario s_Scenario;
-
-};
-
-#endif //__PerfDefaults_h__
diff --git a/src/vm/siginfo.cpp b/src/vm/siginfo.cpp
index be919c8b7e..bc16bdffda 100644
--- a/src/vm/siginfo.cpp
+++ b/src/vm/siginfo.cpp
@@ -4946,50 +4946,20 @@ void PromoteCarefully(promote_func fn,
(*fn) (ppObj, sc, flags);
}
-void ReportByRefPointersFromByRefLikeObject(promote_func *fn, ScanContext *sc, PTR_MethodTable pMT, PTR_VOID pSrc)
-{
- WRAPPER_NO_CONTRACT;
-
- _ASSERTE(pMT->IsByRefLike());
-
- // TODO: TypedReference should ideally be implemented as a by-ref-like struct containing a ByReference<T> field,
- // in which case the check for g_TypedReferenceMT below would not be necessary
- if (pMT == g_TypedReferenceMT || pMT->HasSameTypeDefAs(g_pByReferenceClass))
- {
- (*fn)(dac_cast<PTR_PTR_Object>(pSrc), sc, GC_CALL_INTERIOR);
- return;
- }
-
- ApproxFieldDescIterator fieldIterator(pMT, ApproxFieldDescIterator::INSTANCE_FIELDS);
- for (FieldDesc *pFD = fieldIterator.Next(); pFD != NULL; pFD = fieldIterator.Next())
- {
- if (pFD->GetFieldType() != ELEMENT_TYPE_VALUETYPE)
- {
- continue;
- }
-
- // TODO: GetApproxFieldTypeHandleThrowing may throw. This is a potential stress problem for fragile NGen of non-CoreLib
- // assemblies. It won't ever throw for CoreCLR with R2R. Figure out if anything needs to be done to deal with the
- // exception.
- PTR_MethodTable pFieldMT = pFD->GetApproxFieldTypeHandleThrowing().AsMethodTable();
- if (!pFieldMT->IsByRefLike())
- {
- continue;
- }
-
- int fieldStartIndex = pFD->GetOffset() / sizeof(void *);
- PTR_PTR_Object fieldRef = dac_cast<PTR_PTR_Object>(PTR_BYTE(pSrc) + fieldStartIndex);
- ReportByRefPointersFromByRefLikeObject(fn, sc, pFieldMT, fieldRef);
- }
-}
-
void ReportPointersFromValueType(promote_func *fn, ScanContext *sc, PTR_MethodTable pMT, PTR_VOID pSrc)
{
WRAPPER_NO_CONTRACT;
if (pMT->IsByRefLike())
{
- ReportByRefPointersFromByRefLikeObject(fn, sc, pMT, pSrc);
+ FindByRefPointerOffsetsInByRefLikeObject(
+ pMT,
+ 0 /* baseOffset */,
+ [&](SIZE_T pointerOffset)
+ {
+ PTR_PTR_Object fieldRef = dac_cast<PTR_PTR_Object>(PTR_BYTE(pSrc) + pointerOffset);
+ (*fn)(fieldRef, sc, GC_CALL_INTERIOR);
+ });
}
if (!pMT->ContainsPointers())
diff --git a/src/vm/siginfo.hpp b/src/vm/siginfo.hpp
index 52b05928db..4cfa548270 100644
--- a/src/vm/siginfo.hpp
+++ b/src/vm/siginfo.hpp
@@ -1191,4 +1191,3 @@ BOOL IsTypeDefExternallyVisible(mdToken tk, Module *pModule, DWORD dwAttrs);
void ReportPointersFromValueType(promote_func *fn, ScanContext *sc, PTR_MethodTable pMT, PTR_VOID pSrc);
#endif /* _H_SIGINFO */
-
diff --git a/src/vm/wks/CMakeLists.txt b/src/vm/wks/CMakeLists.txt
index 1da2ab8477..3a796ae0ea 100644
--- a/src/vm/wks/CMakeLists.txt
+++ b/src/vm/wks/CMakeLists.txt
@@ -3,8 +3,6 @@ if (WIN32)
add_precompiled_header(common.h ../common.cpp VM_SOURCES_WKS)
# mscorlib.cpp does not compile with precompiled header file
set_source_files_properties(../mscorlib.cpp PROPERTIES COMPILE_FLAGS "/Y-")
- # .c file cannot use cpp precompiled header
- set_source_files_properties(../microsoft.comservices_i.c PROPERTIES COMPILE_FLAGS "/Y-")
# asm files require preprocessing using cl.exe on arm32 and arm64
if(CLR_CMAKE_PLATFORM_ARCH_ARM64)
diff --git a/tests/scripts/run-corefx-tests.py b/tests/scripts/run-corefx-tests.py
index aae6d2cb3c..ba49631e1c 100644
--- a/tests/scripts/run-corefx-tests.py
+++ b/tests/scripts/run-corefx-tests.py
@@ -60,6 +60,7 @@ description = 'Tool to facilitate running CoreFx tests from the CoreCLR repo'
parser = argparse.ArgumentParser(description=description)
parser.add_argument('-arch', dest='arch', default='x64')
+parser.add_argument('-ci_arch', dest='ci_arch', default=None)
parser.add_argument('-build_type', dest='build_type', default='Debug')
parser.add_argument('-clr_root', dest='clr_root', default=None)
parser.add_argument('-fx_root', dest='fx_root', default=None)
@@ -77,14 +78,15 @@ def validate_args(args):
Args:
args (argparser.ArgumentParser): Args parsed by the argument parser.
Returns:
- (arch, build_type, clr_root, fx_root, fx_branch, fx_commit, env_script)
- (str, str, str, str, str, str, str)
+ (arch, ci_arch, build_type, clr_root, fx_root, fx_branch, fx_commit, env_script)
+ (str, str, str, str, str, str, str, str)
Notes:
If the arguments are valid then return them all in a tuple. If not, raise
an exception stating x argument is incorrect.
"""
arch = args.arch
+ ci_arch = args.ci_arch
build_type = args.build_type
clr_root = args.clr_root
fx_root = args.fx_root
@@ -136,10 +138,11 @@ def validate_args(args):
validate_arg(env_script, lambda item: os.path.isfile(env_script))
env_script = os.path.abspath(env_script)
- args = (arch, build_type, clr_root, fx_root, fx_branch, fx_commit, env_script)
+ args = (arch, ci_arch, build_type, clr_root, fx_root, fx_branch, fx_commit, env_script)
log('Configuration:')
log(' arch: %s' % arch)
+ log(' ci_arch: %s' % ci_arch)
log(' build_type: %s' % build_type)
log(' clr_root: %s' % clr_root)
log(' fx_root: %s' % fx_root)
@@ -185,7 +188,7 @@ def main(args):
testing = False
- arch, build_type, clr_root, fx_root, fx_branch, fx_commit, env_script = validate_args(
+ arch, ci_arch, build_type, clr_root, fx_root, fx_branch, fx_commit, env_script = validate_args(
args)
clr_os = 'Windows_NT' if Is_windows else Unix_name_map[os.uname()[0]]
@@ -272,11 +275,22 @@ def main(args):
else:
command = './build-tests.sh'
+ # If we're doing altjit testing, then don't run any tests that don't work with altjit.
+ if ci_arch is not None and (ci_arch == 'x86_arm_altjit' or ci_arch == 'x64_arm64_altjit'):
+ # The property value we need to specify is a semicolon separated list of two values,
+ # so the two values must be enclosed in double quotes. Without the quotes, msbuild
+ # thinks the item after the semicolon is a different named property. Also, the double
+ # quotes need preceeding backslashes or else run.exe (invoked from build-tests.cmd)
+ # will eat them. They need to be double backslashes so Python preserves the backslashes.
+ without_categories = '/p:WithoutCategories=\\"IgnoreForCI;XsltcExeRequired\\"'
+ else:
+ without_categories = '/p:WithoutCategories=IgnoreForCI'
+
command = ' '.join((
command,
config_args,
'--',
- '/p:WithoutCategories=IgnoreForCI'
+ without_categories
))
if env_script is not None:
diff --git a/tests/src/AllTestProjects.sln b/tests/src/AllTestProjects.sln
deleted file mode 100644
index 679f2d7804..0000000000
--- a/tests/src/AllTestProjects.sln
+++ /dev/null
@@ -1,34953 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 14
-VisualStudioVersion = 14.0.25420.1
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Finalizer", "Exceptions\Finalization\Finalizer.csproj", "{95DFC527-4DC1-495E-97D7-E94EE1F7140D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CoreCLRTestLibrary", "Common\CoreCLRTestLibrary\CoreCLRTestLibrary.csproj", "{C8C0DC74-FAC4-45B1-81FE-70C4808366E0}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Common", "Common", "{0FBFD943-4808-4CB0-B9A3-B79326AE92EE}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Exceptions", "Exceptions", "{210C3FE7-130B-4D37-8030-16BC2E6A0927}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JIT", "JIT", "{F03E5C26-F7BE-4BEF-9CBC-EAFC5A2C7760}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CodeGenBringUpTests", "CodeGenBringUpTests", "{954F04D0-2FFD-4923-BE9A-2F9F58145708}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Finalizer", "Finalizer", "{7EBCCEA9-F217-49A2-9394-6502C13279F0}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Loader", "Loader", "{3E36F081-F511-4C52-BC3D-2EEFECD3E880}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Regressions", "Regressions", "{01516861-E37C-433B-9D12-CA4F8E05CB13}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Polyrec", "loader\regressions\polyrec\Polyrec.csproj", "{B50A2D18-32B1-4051-A3E4-B004A6BBBF4D}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Regressions", "Regressions", "{519B3923-0366-4664-876B-BAA9B87E13D1}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Common", "Common", "{7297C67A-D3D7-49D5-9DEC-0EE946B1D9C7}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "assemblyref", "assemblyref", "{76C9FF34-242B-4B47-BC2B-DD78E173D69E}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "expl_double", "expl_double", "{F3E708D4-38A7-4CB6-A92A-A1ABA6186CE2}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "expl_double", "Regressions\expl_double\expl_double.csproj", "{8E3244CB-407F-4142-BAAB-E7A55901A5FA}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "assem", "Regressions\assemblyref\assem.csproj", "{946AE2D9-F656-4771-81DB-6D02EEEEFFCB}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test", "Regressions\assemblyref\test.csproj", "{CDA666E1-9A22-4795-9FBD-3B3FAEB759A4}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GC", "GC", "{68C05500-0698-4309-AFB0-14485AFA1BDB}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Stress", "Stress", "{A0C4F281-CA64-4794-A786-F3F80FCC5A06}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Framework", "Framework", "{776B49A7-C77A-42ED-AFA7-73E255FC889E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReliabilityFramework", "GC\Stress\Framework\ReliabilityFramework.csproj", "{65972FF1-AE77-4CB3-B31D-9CA483DD9E2E}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tests", "Tests", "{48E19BDB-F7F5-4FEF-ABA9-7FEEAC96D265}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Directed", "Directed", "{86AB78FA-656D-47D1-B156-F8165542A6C1}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Arrays", "Arrays", "{168FB13B-74F9-4056-BF11-A46F2DAAADF8}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Managed", "Managed", "{1E0A9AAE-133F-4881-8DC6-571F12B96B8B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Compilation", "managed\Compilation\Compilation.csproj", "{39DD9A75-2535-4EBD-94A4-C7DF7EF12CF5}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Compilation", "Compilation", "{6B543CA2-10A2-4771-9F93-1733AA7A2DB8}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "jit64", "jit64", "{D9FFDA0F-00A2-458C-B3D3-77D0811E969E}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "gc", "gc", "{BD5A2705-2A6A-46A5-8EB1-8F4682B6B025}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "misc", "misc", "{17842328-DBEB-4209-BAE6-512FCA163DC5}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "regress", "regress", "{76DA480B-E2C8-4BE7-B012-3F89384C3184}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vswhidbey", "vswhidbey", "{EDC4C742-D1C9-419B-A37D-3C687371F931}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "opt", "opt", "{3B576AFC-FF4F-4C40-81BF-465767683FB9}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "cse", "cse", "{816A193E-2D3A-4E4B-80FB-C9C322281F53}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CheckedCtor", "CheckedCtor", "{3AC4E363-B239-4D48-AEB8-A9177554E156}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "cmov", "cmov", "{BA784A0F-E788-40CC-A76D-EB4041808897}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Generics", "Generics", "{4528D9E6-C6F8-448E-BD36-5E5DAAFE90D3}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Arrays", "Arrays", "{C3F22F91-FE0E-4181-864B-D7EE7225382D}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ConstructedTypes", "ConstructedTypes", "{C5825007-742C-4F16-BAB5-09D6EAF2AEF6}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TypeParameters", "TypeParameters", "{1E8B3DDB-15DC-4BB9-BAFB-8252848A8784}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Jagged", "Jagged", "{A1C4D795-DE5B-4CB0-BFF6-13E1D5A787FD}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MultiDim", "MultiDim", "{ADB4CA4A-288C-4C09-A5BE-D46112A52124}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Jagged", "Jagged", "{824E2C6A-EE65-43DA-B848-5FF3E4C68BDC}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MultiDim", "MultiDim", "{7C6A86B2-9A8D-489B-A79B-A5721B0AAB62}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "opt", "opt", "{0957EF12-6D74-4438-BAD1-D720433C2162}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Inline", "Inline", "{8C754381-F489-4B5F-885A-415D323D88BF}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Fields", "Fields", "{469D4D65-45B3-4641-9C04-480102731EF9}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StructPromote", "StructPromote", "{A8B34174-E462-48BE-975C-604B8B1DB0A0}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MDArray", "MDArray", "{1E30345B-4538-426B-8F15-94C7EDD9F6A1}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DataTypes", "DataTypes", "{48E311DE-F4D4-4F54-8C2B-FEDA15FE2D40}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Methodical", "Methodical", "{D83DE650-AD2D-4122-9AE2-53AB5364D032}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Exceptions", "Exceptions", "{165B27F0-A2BA-4961-B718-0E381B8B92BD}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NaN", "NaN", "{06633516-0C78-433B-BFFB-A8BCE5006CB7}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TypedReference", "JIT\Directed\TypedReference\TypedReference.csproj", "{47849C79-F7B8-47C6-BBA7-8E6FCE66B9F1}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ConstrainedCall", "ConstrainedCall", "{2CBD872D-5257-46BD-8331-C73E4E8649B0}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Constraints", "Constraints", "{8B7F7CB1-2377-45A1-B24F-01B1ECEEB49B}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Conversions", "Conversions", "{F24A8F3D-8C25-4283-A95B-8BB9F0722464}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Boxing", "Boxing", "{83AEA271-7FBD-4218-91D5-056796194EDC}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Reference", "Reference", "{0C6514BE-9895-4361-9C9F-4D2C3E5DCAE7}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Coverage", "Coverage", "{B8C4748A-787E-4ED4-A290-3A9A8C3B8EC2}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Instantiation", "Instantiation", "{8CD7C05F-F440-4AE5-A5D3-195CA918865B}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Classes", "Classes", "{733E3760-7FC1-4A1C-B04E-6FAEC969D9E1}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Interfaces", "Interfaces", "{DF82AF85-2649-4708-A0DF-07E91026422F}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Structs", "Structs", "{0014E7B8-2130-4CED-85F1-5E7E246BB6DC}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Locals", "Locals", "{C2A681ED-16D8-40EE-BDD3-AEF624EA2DDE}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MemberAccess", "MemberAccess", "{9D7E0A3F-37EE-4950-B5C9-280DEE1FD616}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Parameters", "Parameters", "{8F32B13F-C23D-42D5-95F4-88DA41A3DF04}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TypeParameters", "TypeParameters", "{C299AD86-AD7A-4DD3-80A7-CD6BE9485D9A}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Typeof", "Typeof", "{3C6F738C-461F-48A9-9FCF-3AC2126B84CF}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "coverage", "coverage", "{7D785F10-A09E-4D87-8886-0A2CC3D2368A}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "flowgraph", "flowgraph", "{9A80A82E-FFB4-4627-9F9B-FA3C1AC4D8EC}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "oldtests", "oldtests", "{B580B9F8-736D-41E9-9DDF-F1BE30339BFF}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "intrinsic", "intrinsic", "{8E0C6786-8E9C-4E88-BCD7-2E6EF691E3E4}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "lifetime", "lifetime", "{DC77471A-DAFE-4C18-8433-F43B4442299B}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "interlocked", "interlocked", "{F205E7D7-9D9E-4BAA-A0E5-099D453B564A}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "pow", "pow", "{3932CB77-7B02-4475-99CF-27964B6B8983}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "localloc", "localloc", "{C501AB5C-932F-4908-B6F8-E30539121E19}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "newarr", "newarr", "{C0242768-ECBC-42EE-9F6B-F8D5F3DE15BC}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "shift", "shift", "{74EFC15D-717E-40EF-88FC-764448DE48B8}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "StrAccess", "StrAccess", "{914255B3-E09C-4C4D-82C4-B4ED32C0F4F9}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TypedReference", "TypedReference", "{D9353523-E09E-484A-912A-7AD9AFFE1597}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UnrollLoop", "UnrollLoop", "{A687C73B-E578-4129-B7EB-7B46DA1FBFE2}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "newarr", "JIT\Directed\newarr\newarr.csproj", "{996021AF-AB49-4B39-A3C7-3D874E9B4230}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Arrays", "Arrays", "{C93C48B0-938B-494F-A236-F36B325B1CC9}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AsgOp", "AsgOp", "{E0F90CC2-88BF-4234-86DF-9543C9BA62B8}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Boxing", "Boxing", "{11A2B330-6120-4E69-980A-EF9F3EFE77A2}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "casts", "casts", "{EB9C39C6-EB49-4877-AD25-CC2E18BF9F9D}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "cctor", "cctor", "{F98FB139-181C-4210-83CA-2E759339E0F1}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Coverage", "Coverage", "{02069CAC-FD56-4B23-BEA7-9B7C1BB1028F}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "divrem", "divrem", "{4A9DD8B9-FDA4-4F35-9CD3-4CFF95D0B62A}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "eh", "eh", "{7C09D718-F344-4E3C-98A2-195402FCEF9C}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "explicit", "explicit", "{DDFFDDE9-5E15-4C95-8EC8-40AC7F9F7B09}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "flowgraph", "flowgraph", "{9DD92D41-8BC9-4DE1-8CE8-4A0E49B1E620}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "FPtrunc", "FPtrunc", "{E0CC9DE7-BC2C-4586-BB1B-D808AFD1D5C4}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "inlining", "inlining", "{281BD2C1-C409-444F-9E97-842893F853C0}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "int64", "int64", "{94F0E975-7665-4F47-84A2-47BF29210957}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Invoke", "Invoke", "{17C84DAE-53CF-4045-BE70-80B4785633D9}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "nonvirtualcall", "nonvirtualcall", "{09CE9E0E-F603-4AF4-A602-F74B162E738A}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Overflow", "Overflow", "{D5A4FAAA-403E-40A4-BA02-C966DCF1B28F}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "refany", "refany", "{06AB5EB6-C14B-4A7D-90B6-99DFF6E168E5}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tailcall_v4", "tailcall_v4", "{F0911E3F-3473-4893-BA9D-3C275D1F773F}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "VT", "VT", "{F7A45588-2202-457B-A413-F1DDC489CD66}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "xxobj", "xxobj", "{80064E95-11D3-408B-87BA-9AB491B5C5AE}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "lcs", "lcs", "{4D6F65F2-CCC5-481C-96BF-A5F1AAC934F7}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "misc", "misc", "{DA0C9DD7-BB9E-40EC-9F5A-DC8844D82B12}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "i4", "i4", "{0AA7C3E2-6243-478E-B59E-B3160A0714D7}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "i8", "i8", "{9B8577AB-31EC-4EF5-B9DB-ED194D79AF31}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "r4", "r4", "{C673F534-AC1B-4B1C-9D00-65E4FA7A2CCD}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "r8", "r8", "{B406CD4A-75A3-4499-ACDA-B7F52C14407E}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "misc", "misc", "{88FCFFC0-421A-4E3D-BE96-306CD990A0A1}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "coverage", "coverage", "{B925EF22-3EB5-4D57-ABF8-A56B263B1969}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "iface", "iface", "{B91C6DF9-BACC-4390-9F5D-1BA096C21BD8}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ilseq", "ilseq", "{EFCFDA86-EF6B-45F7-B60E-76EADC0D6F19}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SEH", "SEH", "{C0480CB6-6FDB-4774-86DD-F89C68953609}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "simple", "simple", "{CB40D510-46A7-4F3E-AB50-F26A188C2769}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "div", "div", "{C4CD3E50-94D4-4DA8-A179-64FDB2BC0F4C}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "rem", "rem", "{71CB9568-8258-4956-AC04-70E33685CDB7}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "interactions", "interactions", "{19D2A4A1-1B5F-47E8-B934-7BD4C84282B6}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "basic", "basic", "{C44A8329-CADE-4D49-8F1D-67231AD5A261}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "misc", "misc", "{64E97869-7EA2-4D45-AFCB-C68CF459B0FC}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "rotate", "rotate", "{60F16A78-C5C2-441E-8668-AF3BC948E6C7}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "bug614098", "bug614098", "{0FF879E2-EE68-4495-9F8C-71B2FDED84E2}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "bug619534", "bug619534", "{6657C2C0-9EAA-463B-BE2A-805D63A5936F}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "bug621705", "bug621705", "{04D60397-9677-4C12-8FE1-F2BEE0749DE6}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "bug647189", "bug647189", "{D9E9FA5A-00E6-430C-A282-087D2D7008BF}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dev10_bug675304", "dev10_bug675304", "{5014EC7E-490B-4C0D-B2BA-FEF6AD765CFB}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dev10_bug679008", "dev10_bug679008", "{27155AE7-2C96-438C-AA17-A320A25E65F7}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dev10_bug723489", "dev10_bug723489", "{4E4A534B-041E-46A3-936E-CCFD25068EEC}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "bug505642", "bug505642", "{9D74FE6C-2DAF-4FA5-B7E3-A5852B0B6E1E}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "arrays", "arrays", "{140C0ED9-B807-4C21-BA72-56BD4C9EA53A}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "misc", "misc", "{63A0A384-5075-495E-B557-74BF80415AA5}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "signed", "signed", "{562F5F7F-D16D-41B2-BB1D-8D2A1E3CA052}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "superlong", "superlong", "{A27D3C65-7C05-4E4D-8D7C-C89FEDCB8407}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "unsigned", "unsigned", "{17690878-911B-41F7-8DF7-06D0AB912E3F}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "25params", "25params", "{F953CF08-2EBF-4C39-8177-7C55E9F94814}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "callvirt", "callvirt", "{F959397A-029F-40D6-80BA-6823B0A442EF}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ctor", "ctor", "{32E42BF5-9B1C-4F3D-AD93-55213959CA23}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "deep", "deep", "{E17AC1A8-79BE-498B-97F4-AD9977EF4B48}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "fptr", "fptr", "{BE600698-0EF7-45DB-A29E-568A7B8247EC}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "implicit", "implicit", "{B138D3EF-6688-41A4-957A-AEC8FF1DD7D5}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SEH", "SEH", "{B5B034D7-B2E9-43AD-AF63-33BA574AFB27}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "basics", "basics", "{405AD66C-7F7E-4A37-8608-94D4DD8E78C3}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GaussJordan", "GaussJordan", "{99577DA8-D1BD-4DA3-8407-364A0F342995}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "InnerProd", "InnerProd", "{3F665918-782B-48FD-AA8F-A18DFA8E2130}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "callconv", "callconv", "{066A5DED-8645-4513-B51C-F0913642F8E4}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "etc", "etc", "{20496BB0-E5B7-4B4A-BA85-D94CD9C8573C}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "identity", "identity", "{7FFFD08B-7383-4044-A374-93481B99B739}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "port", "port", "{B4D6E449-1486-44E4-8418-B506CC6D9311}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "operand", "operand", "{C4AA63BE-DA35-4F59-BE00-03712AE0310C}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "cg", "cg", "{8747766E-1DC6-4F08-AF1C-FEA0765EE710}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "inl", "inl", "{17861AB2-2764-431B-8B19-2DEB80FCCBCF}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "lim", "lim", "{4823D059-3BBD-427B-AE1D-299E64AD4739}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "lur", "lur", "{2C25EDAF-1363-4284-826E-FFE68274C8BF}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "osr", "osr", "{234F3731-4822-4916-A289-9B47ECB44F6E}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "rngchk", "rngchk", "{E67CF206-FE40-40EF-A046-ECDE06DD330E}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CGRecurse", "CGRecurse", "{5D0703FB-77F1-4D82-9D9A-3C03FB1105C5}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "cgstress", "cgstress", "{8956C0E9-C87D-4F92-ACD6-3B636F42931B}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "regress", "regress", "{58A8F376-9CE9-4578-981E-C1B1B9C939B5}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "asurt", "asurt", "{6FE08E56-2A5C-4688-B196-D2C3C0FD2846}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ddb", "ddb", "{0970B2B3-ACC0-41EC-98EF-53E4B42E45AD}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ndpw", "ndpw", "{1DA8D272-0036-4786-89DA-7EA08A56249C}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "vsw", "vsw", "{0BB261E1-C2A5-4E7B-B9B3-51BC9C1D9592}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "143616", "143616", "{A0F153D9-27D7-445B-BE21-3EBC051A0C45}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "103087", "103087", "{14A61134-1093-4649-B0C1-47ACAB3B8F5C}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "113574", "113574", "{DE4DBB61-E880-473A-BB8D-CE2EC1DBD44E}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "132977", "132977", "{4C40B746-F462-4FC2-9ABB-0BE10C48E6D5}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "160545", "160545", "{41DBCDAA-6A4C-4BCE-82A6-37791239781E}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "21015", "21015", "{10EF13B6-39DB-4D65-9DFA-BBBF99E67435}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "102964", "102964", "{3A6242CE-DABB-4851-9E48-C8C7718CA050}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "329169", "329169", "{63ADD1EA-5046-4472-80F3-3DFC5D655CAC}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "373472", "373472", "{71D98F4F-2FCD-4572-9A5C-11A9BA353EFB}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "471729", "471729", "{AB0EDE24-E57A-431A-9DDB-8BBB75616021}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "517867", "517867", "{E0F1EC7B-3E37-4413-B072-13B132B270B4}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "524070", "524070", "{0FF7F7E0-4179-468B-AF49-97C499ADF461}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "528315", "528315", "{E8001485-C4DA-4078-B443-8EACB0B91CBE}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "538615", "538615", "{AB69E438-C7F5-4F4E-9652-C5422DDA8F22}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "539509", "539509", "{74175266-F1D6-417B-A28D-3E139C93628D}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "541067", "541067", "{79F4F38B-1E4F-4751-B615-2C4A6197FBC6}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "543229", "543229", "{7450D670-B846-46BD-9801-A96B9AF3514B}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "549880", "549880", "{0898B7E9-0A64-4C13-B219-49048FEFF87A}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "601425", "601425", "{D378BAE3-A84A-4296-ACD4-AA4FDB436D58}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "610378", "610378", "{DAFA51F9-324D-4FB3-B2A3-0BEB9CFB1677}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "103087", "JIT\jit64\regress\ddb\103087\103087.csproj", "{7E5E70EB-0719-4741-99CC-095D09B90C31}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "113574", "JIT\jit64\regress\ddb\113574\113574.csproj", "{B0CF4140-812F-4877-BD71-257231472300}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "132977", "JIT\jit64\regress\ddb\132977\132977.csproj", "{3E71C420-F21A-439A-8618-B7002F0CAB6A}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Regression", "Regression", "{04DB82B5-A0C8-4A5D-9A30-4455129C792E}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "VS-ia64-JIT", "VS-ia64-JIT", "{27CAC648-F9B6-470D-AE63-6D3422966569}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "M00", "M00", "{C67F2FEE-E14D-4745-8694-B14F17D6AB90}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "V1.2-Beta1", "V1.2-Beta1", "{236411FD-D2B4-4255-84A8-424D42DB2823}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "V1.2-M01", "V1.2-M01", "{D4C66D43-7B2B-44C7-8B34-7DF4CB6A9BD3}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "V1.2-M02", "V1.2-M02", "{B76B1F21-A998-4BD2-8B6A-478909D632D7}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "V2.0-Beta2", "V2.0-Beta2", "{349090CB-FE00-43DE-8F08-A60850EC0A36}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "V2.0-RTM", "V2.0-RTM", "{7746DD43-2D50-4D1C-9CF1-0F45DF0C08E7}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b99219", "b99219", "{21B22563-7B4A-4FC0-BF69-DA6E6BA73A33}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b100336", "b100336", "{40694A9E-AF13-4BF2-8B0D-432BD95AB809}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b103846", "b103846", "{EB21CA58-BA9D-4FF0-95EE-BF36A83449FB}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b111130", "b111130", "{46ADB6DB-26C6-4FA9-9ACD-F0C2859F3025}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b115253", "b115253", "{BA162EE8-0097-4492-9462-4EEA7EEE0915}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b119026", "b119026", "{42D90E4A-FF58-47F6-87AB-56F1C983BC9E}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b140298", "b140298", "{39E3F1B0-5420-4126-A842-277552942650}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b141358", "b141358", "{B6F8D100-AEA6-410A-BFD9-E0E10A317171}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b91074", "b91074", "{90B98572-9631-41B2-BF8E-FE345012E5AF}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b102615", "b102615", "{83401B41-B59D-4014-A21F-CB77FD28140F}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b102860", "b102860", "{F9531BBB-1334-47E3-9BBF-EA9FC6BD44B5}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b102887", "b102887", "{6EB604BB-2371-4E3E-94FD-BDB5385FFCF0}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b124409", "b124409", "{217671D7-62CB-4236-A02A-6060AE50014C}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b10789", "b10789", "{82C2C400-833B-4BFE-B784-DDC511E06913}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b10790", "b10790", "{309BEA58-0C9F-4019-B4FB-5F49B24A2DEC}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b10827", "b10827", "{76DD40A0-7561-4120-BB54-76D3DDF8B420}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b19112", "b19112", "{23449423-430A-4EFB-B398-546EF0888461}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b10828", "b10828", "{FDFB153C-D8FE-4E1C-9BF5-A4F81A858F40}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b19394", "b19394", "{CC8911EE-15C1-483C-96F1-94303D3B406A}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b21015", "b21015", "{5BEECACB-1943-4F5D-AF74-84EBC0CE4EFB}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b26496", "b26496", "{65C3C40D-7C6F-43E4-BB05-1A72ADEE4F9D}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b27978", "b27978", "{740D48A7-8F3B-4ED7-81AC-BE3B4D3D7F93}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b27980", "b27980", "{8847B0AB-B4E6-4DEF-9D72-8F758A99B035}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b28077", "b28077", "{92DFA343-EAD0-4273-A6C0-0AB50AE2EE80}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b28141", "b28141", "{C169E5C4-72C9-4648-86A5-EBD62EFC5989}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b29343", "b29343", "{887CC6FC-3851-40FA-8A7B-C1C11EFA9CE2}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b102729", "b102729", "{23DE66D2-78D1-4C61-835A-AB42B9E245EE}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b102763", "b102763", "{825E7D5B-C665-4C6B-840F-E7E69122E4A9}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b102886", "b102886", "{6CD726D3-0BBE-4F92-B2A8-31FF3A25B7C7}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b184799", "b184799", "{7A948358-2E2C-4503-910A-4E2711ADD77E}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b302558", "b302558", "{800DEA66-72BC-4D61-A581-5501B04CD020}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b309548", "b309548", "{E940D9F6-23E2-446A-9DC7-66AFAFEA2148}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b311420", "b311420", "{91CE4843-8DA7-42C5-AB12-87E1E0D88297}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b309539", "b309539", "{A77C2465-7E3F-4CBA-83FD-86E83DCB770E}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b360587", "b360587", "{317A2EB9-83A6-459F-9CFC-39F273B7C74A}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b539509", "b539509", "{13C8C030-312C-4727-A073-301383B0E6C4}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b99219", "JIT\Regression\VS-ia64-JIT\M00\b99219\b99219.csproj", "{AFE05673-42FD-4147-8EBF-8960BBCEEC61}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b100336", "JIT\Regression\VS-ia64-JIT\M00\b100336\b100336.csproj", "{539E643E-9E77-4B38-891A-E870982ECFE6}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b103846", "JIT\Regression\VS-ia64-JIT\M00\b103846\b103846.csproj", "{082E8D5A-19E7-4970-96EA-FD665F9AEB66}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b111130", "JIT\Regression\VS-ia64-JIT\M00\b111130\b111130.csproj", "{014F3DD9-D5D7-414E-B9DC-271D6753D522}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b115253", "JIT\Regression\VS-ia64-JIT\M00\b115253\b115253.csproj", "{3FDCB42D-4F77-4B3B-8C30-4D082987E9BC}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b140298", "JIT\Regression\VS-ia64-JIT\M00\b140298\b140298.csproj", "{90F16A8A-0DCF-4467-A649-F69810780CCF}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b141358", "JIT\Regression\VS-ia64-JIT\M00\b141358\b141358.csproj", "{76D4B472-7CD9-49E7-AC09-5C2E6D0D0B17}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b91074", "JIT\Regression\VS-ia64-JIT\V1.2-Beta1\b91074\b91074.csproj", "{710F9A16-180B-47B3-A591-BB8E6F247073}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b102615", "JIT\Regression\VS-ia64-JIT\V1.2-Beta1\b102615\b102615.csproj", "{A1A01B48-FAB5-4D02-B54E-A953FD2A35FF}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b102860", "JIT\Regression\VS-ia64-JIT\V1.2-Beta1\b102860\b102860.csproj", "{4094DF83-0626-4DE0-9983-5897B13606DF}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b102887", "JIT\Regression\VS-ia64-JIT\V1.2-Beta1\b102887\b102887.csproj", "{BD7C8B42-E5DC-4E42-A511-2D5AA4D6EC74}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b124409", "JIT\Regression\VS-ia64-JIT\V1.2-Beta1\b124409\b124409.csproj", "{467E97CC-BA9A-40B3-9AD5-317C68D81EF1}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b10789", "JIT\Regression\VS-ia64-JIT\V1.2-M01\b10789\b10789.csproj", "{D688AD66-F57F-49F1-8E43-B2338721FBBE}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b10790", "JIT\Regression\VS-ia64-JIT\V1.2-M01\b10790\b10790.csproj", "{F17002F9-D680-4162-9CE3-EF470EE9081B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b10827", "JIT\Regression\VS-ia64-JIT\V1.2-M01\b10827\b10827.csproj", "{5BFB4DA5-A817-44A9-8255-DF05136261DC}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b102729", "JIT\Regression\VS-ia64-JIT\V1.2-M02\b102729\b102729.csproj", "{11F40955-B8B9-4F00-8829-DD5E7F05A90E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b102763", "JIT\Regression\VS-ia64-JIT\V1.2-M02\b102763\b102763.csproj", "{331715DB-DCAB-4F21-827A-47768BF3B800}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b102886", "JIT\Regression\VS-ia64-JIT\V1.2-M02\b102886\b102886.csproj", "{F71DBAB0-1882-4B67-AC27-16D2345D068F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b10828", "JIT\Regression\VS-ia64-JIT\V1.2-M02\b10828\b10828.csproj", "{68D03805-999C-43C6-B3A4-9BE79A1A98F0}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b19394", "JIT\Regression\VS-ia64-JIT\V1.2-M02\b19394\b19394.csproj", "{9DA5356F-AB1F-4921-974D-2634E644C5F1}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b21015", "JIT\Regression\VS-ia64-JIT\V1.2-M02\b21015\b21015.csproj", "{BEFEF9A2-1BC3-4691-A8F3-A5F02B1F037D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b26496", "JIT\Regression\VS-ia64-JIT\V1.2-M02\b26496\b26496.csproj", "{D5529457-208A-4D5A-AF63-091B26F6FF3C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b27978", "JIT\Regression\VS-ia64-JIT\V1.2-M02\b27978\b27978.csproj", "{3E2780A5-4DE6-4CF0-B0C0-9F1186BE5BB1}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b27980", "JIT\Regression\VS-ia64-JIT\V1.2-M02\b27980\b27980.csproj", "{A57C2AC7-6CE3-4107-AE80-65BC226D532A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b28077", "JIT\Regression\VS-ia64-JIT\V1.2-M02\b28077\b28077.csproj", "{55FB5BA9-22A4-4980-BC3C-904316B542E7}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b28141", "JIT\Regression\VS-ia64-JIT\V1.2-M02\b28141\b28141.csproj", "{55BFFDD7-A4D4-4276-BDBA-6EFE8FD89FEC}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b29343", "JIT\Regression\VS-ia64-JIT\V1.2-M02\b29343\b29343.csproj", "{3090D664-9838-405C-8CD6-379E494AB157}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b184799", "JIT\Regression\VS-ia64-JIT\V2.0-Beta2\b184799\b184799.csproj", "{0B8165E9-E035-439D-B548-9B8BB461299D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b302558", "JIT\Regression\VS-ia64-JIT\V2.0-Beta2\b302558\b302558.csproj", "{DF55C7B1-1DD7-4B41-9AA5-AE23D6EA43F0}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b309539", "JIT\Regression\VS-ia64-JIT\V2.0-Beta2\b309539\b309539.csproj", "{5A0215DA-950B-460B-AF53-FFAED6DB2AC9}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b309548", "JIT\Regression\VS-ia64-JIT\V2.0-Beta2\b309548\b309548.csproj", "{6BE60C2B-4C48-46FA-A8F2-BF749204EFB8}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b311420", "JIT\Regression\VS-ia64-JIT\V2.0-Beta2\b311420\b311420.csproj", "{173CA099-7538-44C5-A3B7-4D2F8664D7E3}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b360587", "JIT\Regression\VS-ia64-JIT\V2.0-Beta2\b360587\b360587.csproj", "{07895B46-3625-4E18-81BA-9C991A7E4A9E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b539509", "JIT\Regression\VS-ia64-JIT\V2.0-RTM\b539509\b539509.csproj", "{4161D387-F20B-4288-81EA-F13C2D384DD8}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "clr-x64-JIT", "clr-x64-JIT", "{90C2BB90-87AE-4883-955A-8D1353C940E4}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "v4.0", "v4.0", "{015D1E7C-29FD-4DAF-8202-CA6FEB9B7263}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DevDiv34372", "DevDiv34372", "{C8CD43B6-E37B-4EB0-BD65-0EB52DC6568F}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "CLR-x86-EJIT", "CLR-x86-EJIT", "{1198DC44-486D-457B-B490-5CB0B1BE3525}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "V1-M09.5-PDC", "V1-M09.5-PDC", "{0DAD8937-8E7F-4944-B0D4-189C49F4A188}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b12008", "b12008", "{007EB358-C8BB-4449-8907-3E83CC7F908A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b12008", "JIT\Regression\CLR-x86-EJIT\V1-M09.5-PDC\b12008\b12008.csproj", "{2E7AFA2D-C20E-42E1-B4C8-9C8C30A09F47}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "V1-M11-Beta1", "V1-M11-Beta1", "{4521C60C-6F3A-4D87-975B-524236351FEB}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b40089", "b40089", "{DB9E6FF2-A4D8-4136-BD5B-AFE3313B6C7B}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b40138", "b40138", "{1856E17E-F1E6-4F0F-8FC0-FD79CD8B6F9C}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b45679", "b45679", "{7040B3FB-B7A2-4002-A74C-89EC1CEBF53B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b40089", "JIT\Regression\CLR-x86-EJIT\V1-M11-Beta1\b40089\b40089.csproj", "{54DFD24C-F147-4825-9E8E-A0ABD4FCC762}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b40138", "JIT\Regression\CLR-x86-EJIT\V1-M11-Beta1\b40138\b40138.csproj", "{F524F545-6D93-4212-B51D-5D5F26897EFC}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b45679", "JIT\Regression\CLR-x86-EJIT\V1-M11-Beta1\b45679\b45679.csproj", "{E83A9A3C-3336-44A7-A167-07983121C529}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "V1-M12-Beta2", "V1-M12-Beta2", "{792E063E-8986-499B-8B35-96DB021F695F}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "b46847", "b46847", "{4454307F-156B-48E4-9FA5-1DA74FCF2B0F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "b46847", "JIT\Regression\CLR-x86-EJIT\V1-M12-Beta2\b46847\b46847.csproj", "{B7E09C27-56AB-4A8B-8AA7-C66F7D09349C}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dev11", "Dev11", "{65963900-C735-4E9A-88B9-1A890C0009D3}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dev10_94677", "dev10_94677", "{95C574AD-7602-41CF-981D-E19ADB8ECF36}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dev11_5437", "Dev11_5437", "{78EFE089-7045-456F-B8AD-BA1B1C165F4D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dev11_5437", "JIT\Regression\Dev11\Dev11_5437\Dev11_5437.csproj", "{D3D5B4F2-7924-4185-85A8-C908D9A67A0C}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dev11_13912", "dev11_13912", "{6FCA25C2-4930-49A2-AC65-BAE2E1DB7836}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dev11_13912", "JIT\Regression\Dev11\dev11_13912\dev11_13912.csproj", "{3E06549B-CCE6-4D5F-BCCB-C6E6B63CD59D}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dev11_165544", "dev11_165544", "{CCCCFA62-D0BE-48FF-82B2-3A1C136D02C9}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dev11_457559", "Dev11_457559", "{3F4B2800-9C79-4EC4-97F2-0041C95C93AB}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dev11_457559", "JIT\Regression\Dev11\Dev11_457559\Dev11_457559.csproj", "{3859861E-6A53-4035-8A98-AD77F6510A6E}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dev11_617302", "Dev11_617302", "{87B9D5F7-F627-4310-B719-BD072BD981E2}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dev11_617302", "JIT\Regression\Dev11\Dev11_617302\Dev11_617302.csproj", "{6F0362F9-F1B0-4B95-A920-52C29062C546}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dev11_646049", "Dev11_646049", "{1C346E99-9E88-438F-BA14-3F38133E7A95}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dev11_646049", "JIT\Regression\Dev11\Dev11_646049\Dev11_646049.csproj", "{DC3BD7FA-ED25-46BF-B14C-1F6516B4AECD}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DevDiv2_8863", "DevDiv2_8863", "{3A0787B8-2790-4401-8C48-419E3682A113}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DevDiv2_8863", "JIT\Regression\Dev11\DevDiv2_8863\DevDiv2_8863.csproj", "{C52624DA-3555-49A1-BEB7-3462A37EFBA9}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DevDiv2_10623", "DevDiv2_10623", "{6924E822-B7EA-457F-A0FE-29350DCEF203}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DevDiv2_10623", "JIT\Regression\Dev11\DevDiv2_10623\DevDiv2_10623.csproj", "{0E2A5683-562D-486C-AA48-B1CD596B13DC}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dev14", "Dev14", "{11A0D018-9FF1-4AC4-8C56-1239B8A3BFA7}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DevDiv_876169", "DevDiv_876169", "{4EE03CDD-80D0-4055-AB0B-6B0DC53C6C57}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JitBlue", "JitBlue", "{E0D92963-85FA-45EA-9016-F0B79A906BFE}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DevDiv_794115", "DevDiv_794115", "{ECD6EDC6-F816-488B-9FCE-C06DF6AA399E}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DevDiv_794631", "DevDiv_794631", "{134F5A87-6533-4DEB-A96F-BAEA49B53890}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DevDiv_815940", "DevDiv_815940", "{4EB529BC-777D-43E9-A8DA-42758585328F}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DevDiv_816617", "DevDiv_816617", "{28FCAFC6-B68B-4A34-BC66-FB3B4149B89D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Add1", "JIT\CodeGenBringUpTests\Add1.csproj", "{0B8F1AF4-9355-4307-BC68-08A2947AD3B9}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "addref", "JIT\CodeGenBringUpTests\addref.csproj", "{C1518A76-6C68-48EF-94E0-BE79A4514530}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "And1", "JIT\CodeGenBringUpTests\And1.csproj", "{EC2FB8A8-7EE7-4E70-875B-E4FAC488B4DF}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AndRef", "JIT\CodeGenBringUpTests\AndRef.csproj", "{48FBF3A6-B6AF-4FEF-84D1-1706206A94F1}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Args4", "JIT\CodeGenBringUpTests\Args4.csproj", "{F26CBB40-4DFB-42C0-BEBB-26F5BC7B36B5}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Args5", "JIT\CodeGenBringUpTests\Args5.csproj", "{30993D25-1F0D-4CF4-98C0-5F6470B87382}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Array1", "JIT\CodeGenBringUpTests\Array1.csproj", "{7E3680E3-36FC-4B6B-841A-80B8D0C4394C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Array2", "JIT\CodeGenBringUpTests\Array2.csproj", "{4689170F-4BC1-4592-9753-CD4209D950D7}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Array3", "JIT\CodeGenBringUpTests\Array3.csproj", "{B4FE2E03-298E-41B8-A32C-8FD0F1BF7E8C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Array4", "JIT\CodeGenBringUpTests\Array4.csproj", "{11F01248-05A0-4FA0-9345-75273E7276C9}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArrayExc", "JIT\CodeGenBringUpTests\ArrayExc.csproj", "{DBC775DF-5D8A-42A5-87A5-CC51AAAABE3C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArrayJagged", "JIT\CodeGenBringUpTests\ArrayJagged.csproj", "{0E6C1DC4-EFF7-45CC-8A27-37BA07AC30EE}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArrayMD1", "JIT\CodeGenBringUpTests\ArrayMD1.csproj", "{30A8AD2E-3B3B-4813-88E1-9EF2E75BB685}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArrayMD2", "JIT\CodeGenBringUpTests\ArrayMD2.csproj", "{C46B2CCD-C66B-40C8-A031-67FED61AFEDB}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArrayObj", "JIT\CodeGenBringUpTests\ArrayObj.csproj", "{AA342BCA-74DE-41AC-88E9-5608E2DCFFAB}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AsgAdd1", "JIT\CodeGenBringUpTests\AsgAdd1.csproj", "{2DBCC16D-CB12-43D1-A4B8-9E82BE1DB891}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AsgAnd1", "JIT\CodeGenBringUpTests\AsgAnd1.csproj", "{18FD8738-0685-482B-9D97-CEB598AAAC5A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AsgOr1", "JIT\CodeGenBringUpTests\AsgOr1.csproj", "{DD8C7C31-7DB5-4933-97B0-06D168BC0AAC}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AsgSub1", "JIT\CodeGenBringUpTests\AsgSub1.csproj", "{DF621757-F7D5-463A-A05A-83E95C1C6A43}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AsgXor1", "JIT\CodeGenBringUpTests\AsgXor1.csproj", "{6E410935-3438-46EC-A9EC-7065F924EFF9}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BinaryRMW", "JIT\CodeGenBringUpTests\BinaryRMW.csproj", "{33381DC7-E1DD-4BD8-AD2A-E7A80FF04E69}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Call1", "JIT\CodeGenBringUpTests\Call1.csproj", "{00D2D1B1-A33B-4829-AD48-50A92EA5DEBD}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CnsBool", "JIT\CodeGenBringUpTests\CnsBool.csproj", "{2AE191D9-FD91-4142-81CE-18D80591912F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CnsLng1", "JIT\CodeGenBringUpTests\CnsLng1.csproj", "{1B74852B-B366-4360-9A7D-EDD6B9B57E9F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DblAdd", "JIT\CodeGenBringUpTests\DblAdd.csproj", "{49521A1C-DBFB-43B1-8DA5-7DC4F8C4014D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DblAddConst", "JIT\CodeGenBringUpTests\DblAddConst.csproj", "{3E4DB71E-E26A-4341-95D8-E4E3809FCE51}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DblArea", "JIT\CodeGenBringUpTests\DblArea.csproj", "{B5AE199C-B9D1-40C3-97B7-C6BC0442EC58}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DblArray", "JIT\CodeGenBringUpTests\DblArray.csproj", "{807D6049-D7FA-4853-AEF9-CD0F35EBAC04}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DblAvg2", "JIT\CodeGenBringUpTests\DblAvg2.csproj", "{D02780E7-82B2-4635-9801-3E1AC43CF81E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DblAvg6", "JIT\CodeGenBringUpTests\DblAvg6.csproj", "{53D84277-AB6B-4A8D-AF43-1E74CF0C9F9E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DblCall1", "JIT\CodeGenBringUpTests\DblCall1.csproj", "{0594F687-7354-477F-B288-8C641A4504D9}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DblCall2", "JIT\CodeGenBringUpTests\DblCall2.csproj", "{AE134EB2-06E1-4561-8148-7347F0D012B0}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DblDist", "JIT\CodeGenBringUpTests\DblDist.csproj", "{5C28FFAA-5D37-4C77-82B2-EFB0898FDDA5}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DblDiv", "JIT\CodeGenBringUpTests\DblDiv.csproj", "{6495306C-4297-411A-8241-DDD40D48B417}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DblDivConst", "JIT\CodeGenBringUpTests\DblDivConst.csproj", "{F73DF77B-3C94-4516-B306-1C2E289E27A7}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DblFillArray", "JIT\CodeGenBringUpTests\DblFillArray.csproj", "{0D34AE89-A07E-4941-BE41-7922EC86AA8B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DblMul", "JIT\CodeGenBringUpTests\DblMul.csproj", "{A4839CEC-6C25-4A8E-A4A8-5FB0C9768A9B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DblMulConst", "JIT\CodeGenBringUpTests\DblMulConst.csproj", "{C06A0898-7C4E-4925-91C4-2979C4F85BC2}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DblNeg", "JIT\CodeGenBringUpTests\DblNeg.csproj", "{E865D57F-CCEC-4E7F-9F0F-2E2F0D127036}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DblRem", "JIT\CodeGenBringUpTests\DblRem.csproj", "{4638A427-7835-4808-9F14-29CCBC365B75}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DblRoots", "JIT\CodeGenBringUpTests\DblRoots.csproj", "{31ED8057-A96E-42B4-8102-EE3078061981}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DblSub", "JIT\CodeGenBringUpTests\DblSub.csproj", "{067E8F6D-F184-4E15-93A7-A0C7FC200F7F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DblSubConst", "JIT\CodeGenBringUpTests\DblSubConst.csproj", "{F5F8FF1D-D925-42D4-B868-FA1BA4462C04}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DblVar", "JIT\CodeGenBringUpTests\DblVar.csproj", "{5D2FC578-A17E-4B33-8DDA-B8E972D42C41}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "div1", "JIT\CodeGenBringUpTests\div1.csproj", "{037FCF39-2055-43DA-9C66-972DDBEB15AC}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "div2", "JIT\CodeGenBringUpTests\div2.csproj", "{A5293BBE-2081-4701-9F04-3A5D756325A1}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DivConst", "JIT\CodeGenBringUpTests\DivConst.csproj", "{EC6FD253-5247-4D8C-887E-453B5647A0A7}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "divref", "JIT\CodeGenBringUpTests\divref.csproj", "{BFA9B638-76C9-4709-B18B-225B3F74B0E7}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Eq1", "JIT\CodeGenBringUpTests\Eq1.csproj", "{601DE23D-7202-4226-8E50-554C33D770B3}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FactorialRec", "JIT\CodeGenBringUpTests\FactorialRec.csproj", "{83E74202-B9F5-4D34-9D6E-D973704945DC}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FibLoop", "JIT\CodeGenBringUpTests\FibLoop.csproj", "{1DEFC2A4-774B-4F2E-B54A-E25B5D8350ED}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FiboRec", "JIT\CodeGenBringUpTests\FiboRec.csproj", "{770811BC-832C-498F-881C-F545A1884BCD}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FPAdd", "JIT\CodeGenBringUpTests\FPAdd.csproj", "{E15C9AD4-4D8B-43F2-AAFD-ED827609BB6F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FPAddConst", "JIT\CodeGenBringUpTests\FPAddConst.csproj", "{16E9D09B-7144-4E01-90C8-A3DB37EF6597}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FPArea", "JIT\CodeGenBringUpTests\FPArea.csproj", "{B8479512-8916-4897-9E68-426F4A6D0F01}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FPArray", "JIT\CodeGenBringUpTests\FPArray.csproj", "{9760C40A-013F-47FB-861C-6BBF2D66ECB9}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FPAvg2", "JIT\CodeGenBringUpTests\FPAvg2.csproj", "{DBD3DBBD-FD2A-48DF-B8F6-E80B4B75CCFD}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FPAvg6", "JIT\CodeGenBringUpTests\FPAvg6.csproj", "{BA4A14E7-0679-4E85-9B24-6452FB89C775}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FPCall1", "JIT\CodeGenBringUpTests\FPCall1.csproj", "{00123B77-935C-4C54-9F54-A7D78398FD9C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FPCall2", "JIT\CodeGenBringUpTests\FPCall2.csproj", "{39E0910F-28E2-4192-BCF5-5537C53821F8}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FPConvDbl2Lng", "JIT\CodeGenBringUpTests\FPConvDbl2Lng.csproj", "{0DB625F4-2A3D-41EF-B6DC-DA83A931B927}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FPConvF2F", "JIT\CodeGenBringUpTests\FPConvF2F.csproj", "{85DD13D6-24C0-40F1-AE6C-A37B75326B00}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FPConvF2I", "JIT\CodeGenBringUpTests\FPConvF2I.csproj", "{F62205FB-539C-4A6D-9092-F0DD246272DE}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FPConvF2Lng", "JIT\CodeGenBringUpTests\FPConvF2Lng.csproj", "{5108EA79-1A39-4902-ADB1-AE38EEBA5B37}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FPConvI2F", "JIT\CodeGenBringUpTests\FPConvI2F.csproj", "{5E0A08A8-D02D-4036-8A2E-41BDFF64CB55}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FPDist", "JIT\CodeGenBringUpTests\FPDist.csproj", "{5976F27D-32E2-451E-9F8F-3C1C5E7F156F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FPDiv", "JIT\CodeGenBringUpTests\FPDiv.csproj", "{23AF0DA5-1A8B-4D1F-91DB-E18684070F7D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FPDivConst", "JIT\CodeGenBringUpTests\FPDivConst.csproj", "{1DA6A5C9-51BB-44D3-84BF-873C6C092C81}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FPError", "JIT\CodeGenBringUpTests\FPError.csproj", "{AD783D08-47A8-4E7F-A3B6-7B63249807F1}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FPFillArray", "JIT\CodeGenBringUpTests\FPFillArray.csproj", "{DBCD155F-1BD2-4091-BEC7-0A9A15809BDC}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FPMath", "JIT\CodeGenBringUpTests\FPMath.csproj", "{2E1104E1-ED87-4A8C-8486-5D6BB480EED4}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FPMul", "JIT\CodeGenBringUpTests\FPMul.csproj", "{A33856BD-BD42-47BF-A187-0077FF8C2098}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FPMulConst", "JIT\CodeGenBringUpTests\FPMulConst.csproj", "{43EA703F-C5E5-4680-B8FB-B2F46CA52FC6}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FPNeg", "JIT\CodeGenBringUpTests\FPNeg.csproj", "{458ADB44-4020-4022-9C25-A439D1BCC464}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FPRem", "JIT\CodeGenBringUpTests\FPRem.csproj", "{113FDD73-F8D5-44AF-9FB6-A7802A8C854D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FPRoots", "JIT\CodeGenBringUpTests\FPRoots.csproj", "{F27C3C89-5B9D-465F-AE6B-05F2468B2CEF}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FPSmall", "JIT\CodeGenBringUpTests\FPSmall.csproj", "{0A27F4DF-A230-4627-873B-1D876608FA22}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FPSub", "JIT\CodeGenBringUpTests\FPSub.csproj", "{702DAA7C-306F-4A97-895B-963B1028D213}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FPSubConst", "JIT\CodeGenBringUpTests\FPSubConst.csproj", "{C5B2EBAF-D3EA-4721-88F5-FB384F5F7CCE}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FPVar", "JIT\CodeGenBringUpTests\FPVar.csproj", "{D4BEBCBF-BE59-481E-BD88-ABED5B835EF3}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gcd", "JIT\CodeGenBringUpTests\Gcd.csproj", "{5CAE1B00-512F-400D-B309-A288BF958E7E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ge1", "JIT\CodeGenBringUpTests\Ge1.csproj", "{E424FF93-E659-4516-97CC-AFC137659014}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Gt1", "JIT\CodeGenBringUpTests\Gt1.csproj", "{9823F80E-FE94-44AC-893F-2313ACF001D4}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ind1", "JIT\CodeGenBringUpTests\Ind1.csproj", "{42A00689-632D-4DDC-AFAD-EDD86049802E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InitObj", "JIT\CodeGenBringUpTests\InitObj.csproj", "{B6669424-4F8E-4154-BF4D-B74694CF722E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InstanceCalls", "JIT\CodeGenBringUpTests\InstanceCalls.csproj", "{9CF5C43B-8490-4FB3-8F07-663467331AD6}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IntArraySum", "JIT\CodeGenBringUpTests\IntArraySum.csproj", "{6B30834D-CDDE-4A1D-A318-9753ADB594A6}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IntConv", "JIT\CodeGenBringUpTests\IntConv.csproj", "{078DBDAF-A26F-4FEB-90B1-E0A008CD577A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Jmp1", "JIT\CodeGenBringUpTests\Jmp1.csproj", "{E46BA38F-3EA5-4A56-B0EF-A6F646073C76}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JTrue1", "JIT\CodeGenBringUpTests\JTrue1.csproj", "{D17EE755-3FDC-410E-B07E-3E37B5789A7C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JTrueEqDbl", "JIT\CodeGenBringUpTests\JTrueEqDbl.csproj", "{70A42499-9E99-48D7-A74A-F5531CC17251}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JTrueEqFP", "JIT\CodeGenBringUpTests\JTrueEqFP.csproj", "{07AD9B89-51A7-4138-A6F9-37F439AC85CF}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JTrueEqInt1", "JIT\CodeGenBringUpTests\JTrueEqInt1.csproj", "{4EAE9BB8-3DF7-4384-902B-3412CB887E01}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JTrueGeDbl", "JIT\CodeGenBringUpTests\JTrueGeDbl.csproj", "{5928DD1E-853B-4858-834B-0DFC7C6E26EB}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JTrueGeFP", "JIT\CodeGenBringUpTests\JTrueGeFP.csproj", "{20D9F28D-DD1D-4777-9CE2-5D5E208EF3E5}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JTrueGeInt1", "JIT\CodeGenBringUpTests\JTrueGeInt1.csproj", "{1C0ADAC5-E54D-4AC1-8251-1F8D0D26CDA6}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JTrueGtDbl", "JIT\CodeGenBringUpTests\JTrueGtDbl.csproj", "{2EF18A15-DC9E-4D76-91DC-F73D31E03FFB}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JTrueGtFP", "JIT\CodeGenBringUpTests\JTrueGtFP.csproj", "{4E456F57-82E0-43FD-B947-DE3C65E8F1C4}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JTrueGtInt1", "JIT\CodeGenBringUpTests\JTrueGtInt1.csproj", "{B4A2FF5F-9801-48CB-A00E-591860F7714E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JTrueLeDbl", "JIT\CodeGenBringUpTests\JTrueLeDbl.csproj", "{3FE7D8DF-9246-49C4-9D6A-BC796006F78C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JTrueLeFP", "JIT\CodeGenBringUpTests\JTrueLeFP.csproj", "{ACE1DAA5-86B8-4C29-90E4-F8D32E8658A5}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JTrueLeInt1", "JIT\CodeGenBringUpTests\JTrueLeInt1.csproj", "{87187E04-7D15-494A-BFD5-A07D2BBB4686}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JTrueLtDbl", "JIT\CodeGenBringUpTests\JTrueLtDbl.csproj", "{5A6D6A91-B009-46C9-9A18-4866F846241F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JTrueLtFP", "JIT\CodeGenBringUpTests\JTrueLtFP.csproj", "{D1AC9448-46B7-4B29-9A85-8F0372E5C228}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JTrueLtInt1", "JIT\CodeGenBringUpTests\JTrueLtInt1.csproj", "{564359DF-BE79-42F2-AB6E-8518217527E7}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JTrueNeDbl", "JIT\CodeGenBringUpTests\JTrueNeDbl.csproj", "{48C6ABBC-8D33-4FD8-B6A8-A60FEE178245}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JTrueNeFP", "JIT\CodeGenBringUpTests\JTrueNeFP.csproj", "{C7D855D1-A996-4112-A7E9-AD1E4E07B186}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JTrueNeInt1", "JIT\CodeGenBringUpTests\JTrueNeInt1.csproj", "{20AE49CC-1ADA-4B14-B7EB-C961B4C0FC16}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Le1", "JIT\CodeGenBringUpTests\Le1.csproj", "{369A6DB8-B0C9-41E5-84DB-C0CA2FCF92CB}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LeftShift", "JIT\CodeGenBringUpTests\LeftShift.csproj", "{C6DC8E85-DCD2-49A0-977D-CE9795552632}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LngConv", "JIT\CodeGenBringUpTests\LngConv.csproj", "{8BA7A4A1-EBB6-44CD-828B-F2BA5523691A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Localloc", "JIT\CodeGenBringUpTests\Localloc.csproj", "{650B07D3-9BC0-4EF8-8557-44200EC13261}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocallocLarge", "JIT\CodeGenBringUpTests\LocallocLarge.csproj", "{C5578A39-72FF-4D25-99DA-96A8A99C6740}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocallocB_N", "JIT\CodeGenBringUpTests\LocallocB_N.csproj", "{38302715-A140-493E-AEF4-3E8F9EE99195}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocallocB_N_PSP", "JIT\CodeGenBringUpTests\LocallocB_N_PSP.csproj", "{6222AF08-F765-44C2-B48C-3C040D62303F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocallocCnstB117", "JIT\CodeGenBringUpTests\LocallocCnstB117.csproj", "{5A0F2889-91F1-4670-A4AF-9AF0598E22B7}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocallocCnstB117_PSP", "JIT\CodeGenBringUpTests\LocallocCnstB117_PSP.csproj", "{C82D33B6-5779-4E19-8220-1DEA587203B1}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocallocCnstB1", "JIT\CodeGenBringUpTests\LocallocCnstB1.csproj", "{4240086D-0722-4E93-A6DD-BF779715CE73}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocallocCnstB1_PSP", "JIT\CodeGenBringUpTests\LocallocCnstB1_PSP.csproj", "{18F8266B-2F59-4058-8FE6-6B8368CD0D0F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocallocCnstB5001", "JIT\CodeGenBringUpTests\LocallocCnstB5001.csproj", "{E7B36F3A-CD18-4F21-8898-CA43C5FDEA1E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocallocCnstB5001_PSP", "JIT\CodeGenBringUpTests\LocallocCnstB5001_PSP.csproj", "{1EB5785A-2050-4AD1-820B-F46CCCC3C65A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocallocCnstB5", "JIT\CodeGenBringUpTests\LocallocCnstB5.csproj", "{061E4E38-14A9-4305-AD27-5A01A95E9FCE}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocallocCnstB5_PSP", "JIT\CodeGenBringUpTests\LocallocCnstB5_PSP.csproj", "{5F015026-51D0-4EF7-B538-24E8864F31D6}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LongArgsAndReturn", "JIT\CodeGenBringUpTests\LongArgsAndReturn.csproj", "{FC3E9CEC-7659-471A-8B2E-8CFB3FBFDB4E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lt1", "JIT\CodeGenBringUpTests\Lt1.csproj", "{A7850EBD-6701-473E-8686-99535F0794A6}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ModConst", "JIT\CodeGenBringUpTests\ModConst.csproj", "{314823E3-7BB2-4C19-BA04-5AC565215BA3}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mul1", "JIT\CodeGenBringUpTests\mul1.csproj", "{7ACF6404-4F4D-4D63-8E5F-A41DCC72B6C3}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mul2", "JIT\CodeGenBringUpTests\mul2.csproj", "{72FF9A1A-6612-41FD-86D2-C069608C2799}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mul3", "JIT\CodeGenBringUpTests\mul3.csproj", "{9EE64E0C-595B-47BF-B8C0-96BDDA260461}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mul4", "JIT\CodeGenBringUpTests\mul4.csproj", "{271C8E26-550D-4506-9BF8-D87805D5FEF6}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Ne1", "JIT\CodeGenBringUpTests\Ne1.csproj", "{5CE4D180-D559-4EA1-8A81-22FC79E4D255}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NegRMW", "JIT\CodeGenBringUpTests\NegRMW.csproj", "{EBB57E43-0868-4482-86EF-8E330A10BB54}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NestedCall", "JIT\CodeGenBringUpTests\NestedCall.csproj", "{6D20F54D-C743-4459-A7BD-A8C631CC648A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NotAndNeg", "JIT\CodeGenBringUpTests\NotAndNeg.csproj", "{17BA157B-5321-4381-94E3-BBC37B314FAF}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NotRMW", "JIT\CodeGenBringUpTests\NotRMW.csproj", "{DC4B97D9-D69D-4A34-899A-57AE1C949841}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ObjAlloc", "JIT\CodeGenBringUpTests\ObjAlloc.csproj", "{06705BB1-9365-4916-A426-7534584A1B5D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpMembersOfStructLocal", "JIT\CodeGenBringUpTests\OpMembersOfStructLocal.csproj", "{BF639075-28D1-4E40-808F-A181F76B7005}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Or1", "JIT\CodeGenBringUpTests\Or1.csproj", "{BADC0930-22AC-4F76-B3ED-6C0F78D1549E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OrRef", "JIT\CodeGenBringUpTests\OrRef.csproj", "{B793D123-1F28-452A-8528-2CF812B8EEBB}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RecursiveTailCall", "JIT\CodeGenBringUpTests\RecursiveTailCall.csproj", "{0E11223F-B3A0-46A3-BA5D-A7B5F9D56996}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "rem1", "JIT\CodeGenBringUpTests\rem1.csproj", "{D45A5B16-BE6F-45E4-A88D-39DDD6DD2157}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RightShiftRef", "JIT\CodeGenBringUpTests\RightShiftRef.csproj", "{14A2768C-E5E0-4156-B05C-229600CC539B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rotate", "JIT\CodeGenBringUpTests\Rotate.csproj", "{AF7F2478-9B49-4776-BEAF-0BF8916E2D79}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StaticCalls", "JIT\CodeGenBringUpTests\StaticCalls.csproj", "{136C849D-3517-40D8-BA2A-1F903377762D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StaticValueField", "JIT\CodeGenBringUpTests\StaticValueField.csproj", "{A60BCC3F-1672-4EC4-A4D5-30A7AE8AC437}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct16args", "JIT\CodeGenBringUpTests\struct16args.csproj", "{FE68C94B-7263-4C2B-B8DC-BD8ACA669B07}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StructFldAddr", "JIT\CodeGenBringUpTests\StructFldAddr.csproj", "{B9F2D613-B3BF-46D1-A762-ADE0656DF394}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StructInstMethod", "JIT\CodeGenBringUpTests\StructInstMethod.csproj", "{3A283369-FD98-4661-9B73-17BDAC3C2A70}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sub1", "JIT\CodeGenBringUpTests\Sub1.csproj", "{F94C1DAC-C9C6-4BE3-80BF-C4B21F273764}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SubRef", "JIT\CodeGenBringUpTests\SubRef.csproj", "{B0409C23-6BC6-40F5-9386-36A69B746C65}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Swap", "JIT\CodeGenBringUpTests\Swap.csproj", "{E56C9935-95B9-498A-B221-DF044409D530}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Switch", "JIT\CodeGenBringUpTests\Switch.csproj", "{9A3ADDB6-4396-46CF-B079-FC16DFFABE93}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UDivConst", "JIT\CodeGenBringUpTests\UDivConst.csproj", "{53C70B64-C175-43BF-A98A-719868D6D695}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UModConst", "JIT\CodeGenBringUpTests\UModConst.csproj", "{D7512FD8-08E1-4BB6-8701-E3FEEAE4FF66}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Unbox", "JIT\CodeGenBringUpTests\Unbox.csproj", "{3C4D424C-B4CE-4C7F-B780-9330CBFED274}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Xor1", "JIT\CodeGenBringUpTests\Xor1.csproj", "{05C1DF3A-D956-412E-B80C-C3FFC3317D7F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XorRef", "JIT\CodeGenBringUpTests\XorRef.csproj", "{60284420-DDEE-40F0-AB57-A2C4011D07C2}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Complex1", "JIT\Directed\Arrays\Complex1.csproj", "{C340AEBB-36A4-40E8-A453-F9D2B48F608A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Complex2", "JIT\Directed\Arrays\Complex2.csproj", "{D463FFF1-0A34-407F-88C4-4723901908DF}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple1", "JIT\Directed\Arrays\Simple1.csproj", "{21D66817-79E2-4E66-8839-EBC4B4BAD6C1}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Simple2", "JIT\Directed\Arrays\Simple2.csproj", "{F45F852A-B9E9-4597-B399-ABBC969EAC91}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Generic_Test_CSharp_Base_1", "JIT\Directed\CheckedCtor\Generic_Test_CSharp_Base_1.csproj", "{06FF6E07-2815-4FEA-AA0B-C0E1BB05C639}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Generic_Test_CSharp_Base_2", "JIT\Directed\CheckedCtor\Generic_Test_CSharp_Base_2.csproj", "{3E071870-A2AA-4839-8DDF-5F3EF4133D3E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Generic_Test_CSharp_Base_3", "JIT\Directed\CheckedCtor\Generic_Test_CSharp_Base_3.csproj", "{A5CE024A-361E-410B-B204-98FDF9C81FA8}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Generic_Test_CSharp_Base_4", "JIT\Directed\CheckedCtor\Generic_Test_CSharp_Base_4.csproj", "{33E41A22-DC44-48D9-8EE2-C2902F1564EE}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Generic_Test_CSharp_Base_6", "JIT\Directed\CheckedCtor\Generic_Test_CSharp_Base_6.csproj", "{B85EBA3F-2BD0-481B-8D1D-A0901EA5B2D0}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Generic_Test_CSharp_Peer_1", "JIT\Directed\CheckedCtor\Generic_Test_CSharp_Peer_1.csproj", "{580234A2-D854-4FD7-B11D-4C39794E1F55}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Generic_Test_CSharp_Peer_2", "JIT\Directed\CheckedCtor\Generic_Test_CSharp_Peer_2.csproj", "{BFEB52A3-D9BC-4E2C-8BA1-63C1B21C2997}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Generic_Test_CSharp_Peer_3", "JIT\Directed\CheckedCtor\Generic_Test_CSharp_Peer_3.csproj", "{5C1E8BD3-C9F1-4012-9B93-34EE5455A917}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Generic_Test_CSharp_Peer_4", "JIT\Directed\CheckedCtor\Generic_Test_CSharp_Peer_4.csproj", "{54DE4A9A-0626-41A5-A7EC-BFA52D1A304C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Generic_Test_CSharp_Peer_6", "JIT\Directed\CheckedCtor\Generic_Test_CSharp_Peer_6.csproj", "{28415558-9857-4A66-B920-5A25CF2E31FF}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test_CSharp_Base_1", "JIT\Directed\CheckedCtor\Test_CSharp_Base_1.csproj", "{EF8FB27D-5647-414A-8338-DC7EA477A1A4}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test_CSharp_Base_2", "JIT\Directed\CheckedCtor\Test_CSharp_Base_2.csproj", "{FE6CDFB3-27C3-4C8D-906C-0776A7EDE97E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test_CSharp_Base_3", "JIT\Directed\CheckedCtor\Test_CSharp_Base_3.csproj", "{4B6D76B8-71D7-43DF-8DE3-DC1360344968}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test_CSharp_Base_4", "JIT\Directed\CheckedCtor\Test_CSharp_Base_4.csproj", "{9F2D4F98-AFAA-401A-9221-46823FF7F7F5}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test_CSharp_Peer_1", "JIT\Directed\CheckedCtor\Test_CSharp_Peer_1.csproj", "{CFB3552B-D349-4AA8-BBE3-47ED82315402}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test_CSharp_Peer_2", "JIT\Directed\CheckedCtor\Test_CSharp_Peer_2.csproj", "{F0FCA1DB-0D7C-4ECD-8DC5-B00EAAB13D7D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test_CSharp_Peer_3", "JIT\Directed\CheckedCtor\Test_CSharp_Peer_3.csproj", "{CC8CCFBD-780E-471B-B7B3-82C7E89A8A80}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test_CSharp_Peer_4", "JIT\Directed\CheckedCtor\Test_CSharp_Peer_4.csproj", "{040A8014-313A-4277-AB3D-5D6C9928AC7B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bool_And_Op_cs_d", "JIT\Directed\cmov\Bool_And_Op_cs_d.csproj", "{0CB92C28-D5CF-4A9B-A81C-F10D64AC6CF6}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bool_And_Op_cs_do", "JIT\Directed\cmov\Bool_And_Op_cs_do.csproj", "{0C9B9A3F-D3C7-428F-A506-DF7E3181DB71}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bool_And_Op_cs_r", "JIT\Directed\cmov\Bool_And_Op_cs_r.csproj", "{15117C50-064B-4992-BC03-B906D93F047F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bool_And_Op_cs_ro", "JIT\Directed\cmov\Bool_And_Op_cs_ro.csproj", "{0D23EE48-E442-4EE5-B127-3DC280B2B889}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bool_No_Op_cs_d", "JIT\Directed\cmov\Bool_No_Op_cs_d.csproj", "{E5D8C71F-1106-4C4E-A8D6-EA07D7BF539A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bool_No_Op_cs_do", "JIT\Directed\cmov\Bool_No_Op_cs_do.csproj", "{79877703-8483-436B-ACFA-BF2B50481554}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bool_No_Op_cs_r", "JIT\Directed\cmov\Bool_No_Op_cs_r.csproj", "{536E8197-14E4-4CA4-B1FC-9D27262872B1}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bool_No_Op_cs_ro", "JIT\Directed\cmov\Bool_No_Op_cs_ro.csproj", "{A94D7295-DA3D-4786-9DEF-98DDB6D79EC2}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bool_Or_Op_cs_d", "JIT\Directed\cmov\Bool_Or_Op_cs_d.csproj", "{E042222A-C186-4FD5-BB45-E56FFAF991AA}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bool_Or_Op_cs_do", "JIT\Directed\cmov\Bool_Or_Op_cs_do.csproj", "{E7423379-89CE-47F0-B061-4815CA6FC255}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bool_Or_Op_cs_r", "JIT\Directed\cmov\Bool_Or_Op_cs_r.csproj", "{BBFF3FF7-F0FD-450C-B9FB-FBA92A277DBF}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bool_Or_Op_cs_ro", "JIT\Directed\cmov\Bool_Or_Op_cs_ro.csproj", "{54477C8E-60C4-48D4-8429-4B1428E42367}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bool_Xor_Op_cs_d", "JIT\Directed\cmov\Bool_Xor_Op_cs_d.csproj", "{1490A130-4F0A-48E4-A1C4-CAC746323EA1}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bool_Xor_Op_cs_do", "JIT\Directed\cmov\Bool_Xor_Op_cs_do.csproj", "{A8195820-0DEC-4D0A-A888-436B1A7EA86F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bool_Xor_Op_cs_r", "JIT\Directed\cmov\Bool_Xor_Op_cs_r.csproj", "{664785E7-9173-4339-A392-29FC0C81056F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bool_Xor_Op_cs_ro", "JIT\Directed\cmov\Bool_Xor_Op_cs_ro.csproj", "{EC9581B4-923D-4636-804D-3BA5F08BED1E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Double_And_Op_cs_d", "JIT\Directed\cmov\Double_And_Op_cs_d.csproj", "{3FE2BCF6-9DF5-4E3C-835A-864F0DD91039}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Double_And_Op_cs_do", "JIT\Directed\cmov\Double_And_Op_cs_do.csproj", "{DAF9B805-0C25-4FF0-AA69-C38B16ED4E97}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Double_And_Op_cs_r", "JIT\Directed\cmov\Double_And_Op_cs_r.csproj", "{AF73E1CF-2E8B-484E-B329-763BB8B3DDDA}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Double_And_Op_cs_ro", "JIT\Directed\cmov\Double_And_Op_cs_ro.csproj", "{B4142D79-8996-44CE-825A-0304C3689970}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Double_No_Op_cs_d", "JIT\Directed\cmov\Double_No_Op_cs_d.csproj", "{3CA70F86-9BB1-4B6A-B5AC-5C207ADB4BE9}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Double_No_Op_cs_do", "JIT\Directed\cmov\Double_No_Op_cs_do.csproj", "{ED3654C6-EE52-4A83-961F-C1D5E5DE1217}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Double_No_Op_cs_r", "JIT\Directed\cmov\Double_No_Op_cs_r.csproj", "{B7449C08-3EB0-4595-BB7F-309CEFE7C470}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Double_No_Op_cs_ro", "JIT\Directed\cmov\Double_No_Op_cs_ro.csproj", "{EF7BE6ED-DED6-46CE-9819-F3F8493C5044}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Double_Or_Op_cs_d", "JIT\Directed\cmov\Double_Or_Op_cs_d.csproj", "{04B7DA69-8E80-41E2-9848-4B7CFAA910FF}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Double_Or_Op_cs_do", "JIT\Directed\cmov\Double_Or_Op_cs_do.csproj", "{E5322C32-4281-4593-B946-5DCD14477CF1}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Double_Or_Op_cs_r", "JIT\Directed\cmov\Double_Or_Op_cs_r.csproj", "{C0EA83A7-EE72-4F9F-BC23-7D821507D4B2}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Double_Or_Op_cs_ro", "JIT\Directed\cmov\Double_Or_Op_cs_ro.csproj", "{3D50935B-1230-47C1-8C70-377AC2E8C542}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Double_Xor_Op_cs_d", "JIT\Directed\cmov\Double_Xor_Op_cs_d.csproj", "{CC4CA6EE-5174-4CFA-93A9-88AD042AE43F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Double_Xor_Op_cs_do", "JIT\Directed\cmov\Double_Xor_Op_cs_do.csproj", "{F5C7053B-BD47-46DE-8246-F81941FA537D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Double_Xor_Op_cs_r", "JIT\Directed\cmov\Double_Xor_Op_cs_r.csproj", "{340B2533-5C07-4261-ABE8-0C39C62A8F2B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Double_Xor_Op_cs_ro", "JIT\Directed\cmov\Double_Xor_Op_cs_ro.csproj", "{F4E4BCA0-1BCF-4351-A95A-C59D35DE24BE}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Float_And_Op_cs_d", "JIT\Directed\cmov\Float_And_Op_cs_d.csproj", "{80D23E5D-DB08-4B4F-913F-ED296B0500EC}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Float_And_Op_cs_do", "JIT\Directed\cmov\Float_And_Op_cs_do.csproj", "{6BD00E0F-28A3-4308-9E6B-1DDCC0BA7B0B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Float_And_Op_cs_r", "JIT\Directed\cmov\Float_And_Op_cs_r.csproj", "{3AF47F6E-E823-4D10-91D2-D1D2291D860D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Float_And_Op_cs_ro", "JIT\Directed\cmov\Float_And_Op_cs_ro.csproj", "{5729818E-5D7B-45A0-A79F-F6F9AA782223}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Float_No_Op_cs_d", "JIT\Directed\cmov\Float_No_Op_cs_d.csproj", "{234F2BCE-6D53-4033-8D90-D7A2C3262397}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Float_No_Op_cs_do", "JIT\Directed\cmov\Float_No_Op_cs_do.csproj", "{C62E1AAB-2705-440F-A499-43CA515CBE64}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Float_No_Op_cs_r", "JIT\Directed\cmov\Float_No_Op_cs_r.csproj", "{D51AD44D-4256-45A6-BDDB-3CE41038CB4F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Float_No_Op_cs_ro", "JIT\Directed\cmov\Float_No_Op_cs_ro.csproj", "{3295C952-BD8B-41B7-A94A-3B80A88832ED}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Float_Or_Op_cs_d", "JIT\Directed\cmov\Float_Or_Op_cs_d.csproj", "{56E43EC3-FB57-4C31-AA48-EF6DFE5F7DAF}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Float_Or_Op_cs_do", "JIT\Directed\cmov\Float_Or_Op_cs_do.csproj", "{2A0DB37C-22D9-405A-9EB5-74B5EA151067}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Float_Or_Op_cs_r", "JIT\Directed\cmov\Float_Or_Op_cs_r.csproj", "{EE0062CC-6F5F-4235-B6EF-4D3B18BFB776}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Float_Or_Op_cs_ro", "JIT\Directed\cmov\Float_Or_Op_cs_ro.csproj", "{77488FE6-99C2-478A-BF45-76B7192B05F3}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Float_Xor_Op_cs_d", "JIT\Directed\cmov\Float_Xor_Op_cs_d.csproj", "{9AB352DA-BC41-4FD6-9974-571B2894D873}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Float_Xor_Op_cs_do", "JIT\Directed\cmov\Float_Xor_Op_cs_do.csproj", "{3683291A-FC9F-459E-87CC-25F401C2DEAA}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Float_Xor_Op_cs_r", "JIT\Directed\cmov\Float_Xor_Op_cs_r.csproj", "{5206C50D-0D7C-4593-A659-3D51FFA19454}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Float_Xor_Op_cs_ro", "JIT\Directed\cmov\Float_Xor_Op_cs_ro.csproj", "{B608C48E-89BD-4D20-8DA5-B1DBA234D893}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Int_And_Op_cs_d", "JIT\Directed\cmov\Int_And_Op_cs_d.csproj", "{083D1F5E-6CF7-4B78-B940-439A8CCA0157}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Int_And_Op_cs_do", "JIT\Directed\cmov\Int_And_Op_cs_do.csproj", "{4B961CFE-BB95-4937-9882-E0656590CB30}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Int_And_Op_cs_r", "JIT\Directed\cmov\Int_And_Op_cs_r.csproj", "{F7C875D0-CC56-4BA0-ABEC-A1DB51C9BEB9}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Int_And_Op_cs_ro", "JIT\Directed\cmov\Int_And_Op_cs_ro.csproj", "{4646A951-3BC6-4ECA-8884-A26246FA86B6}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Int_No_Op_cs_d", "JIT\Directed\cmov\Int_No_Op_cs_d.csproj", "{787F11B6-3900-430B-A6FC-9FE7157625EE}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Int_No_Op_cs_do", "JIT\Directed\cmov\Int_No_Op_cs_do.csproj", "{074BA388-8FD2-4B1E-B762-6A31236813C6}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Int_No_Op_cs_r", "JIT\Directed\cmov\Int_No_Op_cs_r.csproj", "{E4FC4ED5-8385-4667-9C1C-1AAAB167E2C5}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Int_No_Op_cs_ro", "JIT\Directed\cmov\Int_No_Op_cs_ro.csproj", "{D0FE1238-7277-4663-B545-63D2A8B30F97}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Int_Or_Op_cs_d", "JIT\Directed\cmov\Int_Or_Op_cs_d.csproj", "{5E015DDE-3EC4-43FB-A2BE-C07446B944E8}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Int_Or_Op_cs_do", "JIT\Directed\cmov\Int_Or_Op_cs_do.csproj", "{D2E40B34-682E-4615-A404-DB62775DD4D0}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Int_Or_Op_cs_r", "JIT\Directed\cmov\Int_Or_Op_cs_r.csproj", "{7EED0C6A-CE76-4E71-AF16-806C00CEA1D4}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Int_Or_Op_cs_ro", "JIT\Directed\cmov\Int_Or_Op_cs_ro.csproj", "{3AEBCD23-397B-4952-815A-BA1F23DDF951}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Int_Xor_Op_cs_d", "JIT\Directed\cmov\Int_Xor_Op_cs_d.csproj", "{139F6A41-C301-4740-A7E7-F4491588F8CF}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Int_Xor_Op_cs_do", "JIT\Directed\cmov\Int_Xor_Op_cs_do.csproj", "{5E41B7A6-61CC-4AF4-9A41-50662EE3AF9C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Int_Xor_Op_cs_r", "JIT\Directed\cmov\Int_Xor_Op_cs_r.csproj", "{EAC06643-6BE2-42A5-85C3-C5D5BD463067}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Int_Xor_Op_cs_ro", "JIT\Directed\cmov\Int_Xor_Op_cs_ro.csproj", "{A62D095E-4206-4D11-8762-11DDD63E931E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SP1", "JIT\Directed\StructPromote\SP1.csproj", "{B94CE6E4-D2CB-4E77-9E66-BAF7399256FC}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SP1a", "JIT\Directed\StructPromote\SP1a.csproj", "{AFBEE14D-A543-4A38-B88F-D5917D534798}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SP1a2", "JIT\Directed\StructPromote\SP1a2.csproj", "{679BD4B8-7FB3-4760-A68E-5E0C6B73FE8F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SP1b", "JIT\Directed\StructPromote\SP1b.csproj", "{DF40DD16-C1FE-4FE9-BB21-3FDAE7676EF0}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SP1c", "JIT\Directed\StructPromote\SP1c.csproj", "{26BA48DF-909E-4139-8CDB-33B774A96D36}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SP1d", "JIT\Directed\StructPromote\SP1d.csproj", "{BFBD12A9-470A-436D-889B-A094C4B56B5E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SP2", "JIT\Directed\StructPromote\SP2.csproj", "{A3AD0A96-D8B7-4756-87A4-BD0322816E36}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SP2a", "JIT\Directed\StructPromote\SP2a.csproj", "{A503DC41-F9A6-4CB8-9069-3866B40DF3E1}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SP2b", "JIT\Directed\StructPromote\SP2b.csproj", "{49F28797-569B-46CE-BE57-F303CB612942}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SP2c", "JIT\Directed\StructPromote\SP2c.csproj", "{C263A317-B5CA-40F1-A159-0662059DDA12}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SpAddr", "JIT\Directed\StructPromote\SpAddr.csproj", "{CBD9D3F5-8F73-460F-8801-D684254D45EA}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SpAddrAT", "JIT\Directed\StructPromote\SpAddrAT.csproj", "{9B2CCDC2-D6CE-4568-A419-AC79613BC235}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "xaddmuly_cs_d", "JIT\Directed\coverage\flowgraph\xaddmuly_cs_d.csproj", "{E6D99C96-0E6F-49BB-A9E7-898345BB88EB}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "xaddmuly_cs_do", "JIT\Directed\coverage\flowgraph\xaddmuly_cs_do.csproj", "{5B790B31-497A-486B-A30C-67F013E370CA}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "xaddmuly_cs_r", "JIT\Directed\coverage\flowgraph\xaddmuly_cs_r.csproj", "{66CF5824-3763-47A8-ABEA-E8C583DB765F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "xaddmuly_cs_ro", "JIT\Directed\coverage\flowgraph\xaddmuly_cs_ro.csproj", "{2BDC4E05-9BC3-46E0-B75C-A69451E3DD5E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "33objref_cs_d", "JIT\Directed\coverage\oldtests\33objref_cs_d.csproj", "{C17DAACE-3DBA-4199-90E2-96F991712114}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "33objref_cs_do", "JIT\Directed\coverage\oldtests\33objref_cs_do.csproj", "{5540B7B2-2011-400F-9DF6-3A35CF7C4004}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "33objref_cs_r", "JIT\Directed\coverage\oldtests\33objref_cs_r.csproj", "{5536EDEC-592C-4855-8560-839687B39DEF}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "33objref_cs_ro", "JIT\Directed\coverage\oldtests\33objref_cs_ro.csproj", "{F99AADDF-CFF0-43F7-9AC9-D19E5A72DBBE}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cse1_cs_d", "JIT\Directed\coverage\oldtests\cse1_cs_d.csproj", "{0F8D7570-F2F9-48EC-8337-D30A7E3E804E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cse1_cs_do", "JIT\Directed\coverage\oldtests\cse1_cs_do.csproj", "{74D4B57D-1DCD-4AA9-B60E-76892E52EA3A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cse1_cs_r", "JIT\Directed\coverage\oldtests\cse1_cs_r.csproj", "{692088EB-4644-4378-B391-3C06C532281C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cse1_cs_ro", "JIT\Directed\coverage\oldtests\cse1_cs_ro.csproj", "{670924CC-25CB-4669-9106-89971679F2C7}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cse2_cs_d", "JIT\Directed\coverage\oldtests\cse2_cs_d.csproj", "{FFFA3954-E59A-4071-86EC-06DA7A87B349}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cse2_cs_do", "JIT\Directed\coverage\oldtests\cse2_cs_do.csproj", "{86DB00A7-72CA-4FCC-9A62-9AF981C699FD}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cse2_cs_r", "JIT\Directed\coverage\oldtests\cse2_cs_r.csproj", "{EBF6CE8E-B096-4B19-A8FB-08AF2C2E34A6}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cse2_cs_ro", "JIT\Directed\coverage\oldtests\cse2_cs_ro.csproj", "{01804A6B-5548-41C8-BE15-95585B0375EC}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "lclfldadd_cs_d", "JIT\Directed\coverage\oldtests\lclfldadd_cs_d.csproj", "{526DCCAB-BFA3-423A-AE11-A23C49639EF4}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "lclfldadd_cs_do", "JIT\Directed\coverage\oldtests\lclfldadd_cs_do.csproj", "{17AEDCD1-89CD-4206-B76C-0161143AC72F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "lclfldadd_cs_r", "JIT\Directed\coverage\oldtests\lclfldadd_cs_r.csproj", "{836AD7B3-35E6-49F0-AA37-AB051B84E559}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "lclfldadd_cs_ro", "JIT\Directed\coverage\oldtests\lclfldadd_cs_ro.csproj", "{B5EFBD85-B7E4-4521-8614-AD95F48DFAA3}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "lclflddiv_cs_d", "JIT\Directed\coverage\oldtests\lclflddiv_cs_d.csproj", "{635215B3-122F-499D-8CAB-22F00651EA12}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "lclflddiv_cs_do", "JIT\Directed\coverage\oldtests\lclflddiv_cs_do.csproj", "{969159A4-B449-49AB-85BC-816C4EF69BD7}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "lclflddiv_cs_r", "JIT\Directed\coverage\oldtests\lclflddiv_cs_r.csproj", "{252285C6-BDDB-4826-9E93-7702B02E4BF9}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "lclflddiv_cs_ro", "JIT\Directed\coverage\oldtests\lclflddiv_cs_ro.csproj", "{62C4714A-E180-41FC-B44F-9B87B2375A23}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "lclfldmul_cs_d", "JIT\Directed\coverage\oldtests\lclfldmul_cs_d.csproj", "{66387298-3248-499D-BBC1-908CABCDC93D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "lclfldmul_cs_do", "JIT\Directed\coverage\oldtests\lclfldmul_cs_do.csproj", "{682F6F7E-6292-4FEA-B9C5-B40FF34E961D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "lclfldmul_cs_r", "JIT\Directed\coverage\oldtests\lclfldmul_cs_r.csproj", "{D2BEDF6D-C783-44FA-AADD-BC6227726261}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "lclfldmul_cs_ro", "JIT\Directed\coverage\oldtests\lclfldmul_cs_ro.csproj", "{A4C13469-BE68-490F-8B97-F8F0D94D7121}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "lclfldrem_cs_d", "JIT\Directed\coverage\oldtests\lclfldrem_cs_d.csproj", "{FE50A648-7B41-4F1D-8B76-AF8691895B3F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "lclfldrem_cs_do", "JIT\Directed\coverage\oldtests\lclfldrem_cs_do.csproj", "{A2B2449A-76A8-48F4-8543-AC20026C5148}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "lclfldrem_cs_r", "JIT\Directed\coverage\oldtests\lclfldrem_cs_r.csproj", "{F3421840-6516-40F1-842E-323DF63B3329}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "lclfldrem_cs_ro", "JIT\Directed\coverage\oldtests\lclfldrem_cs_ro.csproj", "{8073C7BD-50CE-4CE1-8790-FE34E1D110E8}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "lclfldsub_cs_d", "JIT\Directed\coverage\oldtests\lclfldsub_cs_d.csproj", "{C311BEB7-F49A-400B-9FA9-D42156D8AF59}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "lclfldsub_cs_do", "JIT\Directed\coverage\oldtests\lclfldsub_cs_do.csproj", "{5DA2C5C2-46DE-43A7-8AFE-52546BD11F8F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "lclfldsub_cs_r", "JIT\Directed\coverage\oldtests\lclfldsub_cs_r.csproj", "{70A1E75C-C1E9-4FA8-982D-1EFFAE36C08B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "lclfldsub_cs_ro", "JIT\Directed\coverage\oldtests\lclfldsub_cs_ro.csproj", "{F1D591B1-0CE7-4F36-A258-F0CDE36CAC05}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pow0_cs_d", "JIT\Directed\intrinsic\pow\pow0_cs_d.csproj", "{6EAEA64D-0062-4D88-ADDE-4169E502FF59}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pow0_cs_do", "JIT\Directed\intrinsic\pow\pow0_cs_do.csproj", "{BB831C2F-A50B-4845-895F-63626C532CFA}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pow0_cs_r", "JIT\Directed\intrinsic\pow\pow0_cs_r.csproj", "{8711F254-3E93-4F1E-B2B3-DB6E34CE10B0}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pow0_cs_ro", "JIT\Directed\intrinsic\pow\pow0_cs_ro.csproj", "{1EC5A52D-60F5-4F1F-B85D-81E81F1C765A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pow1", "JIT\Directed\intrinsic\pow\pow1.csproj", "{BA376677-A1BA-430A-A03F-0348CCDED059}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pow2_cs_d", "JIT\Directed\intrinsic\pow\pow2_cs_d.csproj", "{E36836E5-9AEE-4B23-835E-1C6CDA002DBA}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pow2_cs_do", "JIT\Directed\intrinsic\pow\pow2_cs_do.csproj", "{04AF3C38-9796-4C40-B6CF-4A9F48BB5076}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pow2_cs_r", "JIT\Directed\intrinsic\pow\pow2_cs_r.csproj", "{BFB8EFE5-7236-437E-A3C2-5811D340B056}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pow2_cs_ro", "JIT\Directed\intrinsic\pow\pow2_cs_ro.csproj", "{4F00E4F2-9957-4845-91A3-D2E903014B68}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pow3_cs_d", "JIT\Directed\intrinsic\pow\pow3_cs_d.csproj", "{B310070F-A72B-49F2-B75F-09F072EE595D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pow3_cs_do", "JIT\Directed\intrinsic\pow\pow3_cs_do.csproj", "{463BD49E-2227-483E-8E08-FCB431FC9C54}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pow3_cs_r", "JIT\Directed\intrinsic\pow\pow3_cs_r.csproj", "{BA483BED-BD99-4AE0-B4DC-42BF573F054D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pow3_cs_ro", "JIT\Directed\intrinsic\pow\pow3_cs_ro.csproj", "{C3FB16BB-A1CB-4294-B154-A8704C95F0D4}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cmpxchg", "JIT\Directed\intrinsic\interlocked\cmpxchg.csproj", "{ADEEA3D1-B67B-456E-8F2B-6DCCACC2D34C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "cse_cmpxchg", "JIT\Directed\intrinsic\interlocked\cse_cmpxchg.csproj", "{85BA4D30-89D2-400E-87EE-16A73C104C11}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IntrinsicTest_Overflow", "JIT\Directed\intrinsic\interlocked\IntrinsicTest_Overflow.csproj", "{21FE6A95-5B17-4AC7-B5CB-32594DDE8172}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "nullchecksuppress", "JIT\Directed\intrinsic\interlocked\nullchecksuppress.csproj", "{73F2BEC9-2696-44E4-BBD5-51E95E3BCC99}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "regalloc1", "JIT\Directed\intrinsic\interlocked\regalloc1.csproj", "{81F3AFF3-023A-4CE5-8BAA-271BB68FB133}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "regalloc2", "JIT\Directed\intrinsic\interlocked\regalloc2.csproj", "{F0EFE7B4-4364-45C6-8491-E5F5F127CDD1}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "lifetime1", "JIT\Directed\lifetime\lifetime1.csproj", "{EF78FAFF-1A60-4ACA-B8F0-8B3C14D89C5F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "lifetime2", "JIT\Directed\lifetime\lifetime2.csproj", "{D08BDFE0-70D1-4465-9AF3-1D95BA27F8AF}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "localloc3_cs_d", "JIT\Directed\localloc\localloc3_cs_d.csproj", "{DF9F4DF1-EE55-4CF4-9362-F8AD0646EE31}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "localloc3_cs_do", "JIT\Directed\localloc\localloc3_cs_do.csproj", "{D773D72F-F59F-47FE-8BC1-5B77C374CDED}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "localloc3_cs_r", "JIT\Directed\localloc\localloc3_cs_r.csproj", "{BF7A1709-11C5-4C19-9335-946A65F7B71C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "localloc3_cs_ro", "JIT\Directed\localloc\localloc3_cs_ro.csproj", "{9AB77F8B-4584-4AE3-BD06-C538D83F72C0}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "int16_cs_d", "JIT\Directed\shift\int16_cs_d.csproj", "{6FDF315A-5225-461E-895D-301CC2050F61}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "int16_cs_do", "JIT\Directed\shift\int16_cs_do.csproj", "{709C9072-CB04-41B3-8D13-6B8FF3C2B7FA}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "int16_cs_r", "JIT\Directed\shift\int16_cs_r.csproj", "{1395D6FB-EECE-4F71-AA76-596BD19E9DFF}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "int16_cs_ro", "JIT\Directed\shift\int16_cs_ro.csproj", "{6C120650-2F5F-497F-B549-AECD705C3298}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "int16_d", "JIT\Directed\shift\int16_d.csproj", "{243A642E-779B-4660-9FAE-F40A3E117598}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "int16_do", "JIT\Directed\shift\int16_do.csproj", "{89E37000-896E-4DD5-BE59-AB3AE8E0452D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "int16_r", "JIT\Directed\shift\int16_r.csproj", "{6A409898-4C54-4952-8D10-4805CF04E3E4}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "int16_ro", "JIT\Directed\shift\int16_ro.csproj", "{60D2F293-AE51-496E-BF9D-8220AE7E3F32}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "int32_cs_d", "JIT\Directed\shift\int32_cs_d.csproj", "{6CEC3ED9-1237-45C7-9C94-4E75BCFC3C2C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "int32_cs_do", "JIT\Directed\shift\int32_cs_do.csproj", "{6CD15AD8-C9CE-4B0C-9EFA-29253F2C01F4}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "int32_cs_r", "JIT\Directed\shift\int32_cs_r.csproj", "{D962E02D-75D1-4A3A-A1A8-7AAE32E86D75}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "int32_cs_ro", "JIT\Directed\shift\int32_cs_ro.csproj", "{693C6DD6-4F3E-44A5-AE97-600BC5780DB3}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "int32_d", "JIT\Directed\shift\int32_d.csproj", "{622F3173-9D02-4B96-B9B2-0A20085CEA9F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "int32_do", "JIT\Directed\shift\int32_do.csproj", "{4151BEBB-509B-426C-8799-5831EAB1A501}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "int32_r", "JIT\Directed\shift\int32_r.csproj", "{2E5E4849-02BA-4A67-8BFC-C8234F9ED3FA}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "int32_ro", "JIT\Directed\shift\int32_ro.csproj", "{DA129426-1577-4548-AEFF-FA3E9DD4C238}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "int64_d", "JIT\Directed\shift\int64_d.csproj", "{D988E826-E0FF-473E-B16F-1D1361B77055}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "int64_do", "JIT\Directed\shift\int64_do.csproj", "{BFDC05E3-EE2D-4653-AF6B-B5427AC9C865}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "int64_r", "JIT\Directed\shift\int64_r.csproj", "{96C34EDA-804F-4071-B942-F5A7C4E22F15}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "int64_ro", "JIT\Directed\shift\int64_ro.csproj", "{EBCBCA18-E205-4D9A-9337-3663A2067DCF}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "uint16_cs_d", "JIT\Directed\shift\uint16_cs_d.csproj", "{E359F45E-5837-4D77-8A21-2ED8FDD8F894}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "uint16_cs_do", "JIT\Directed\shift\uint16_cs_do.csproj", "{561C7872-03CA-44A3-A6C1-84F6C90EE90F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "uint16_cs_r", "JIT\Directed\shift\uint16_cs_r.csproj", "{8614A72B-7562-42F2-B617-2638780BB28E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "uint16_cs_ro", "JIT\Directed\shift\uint16_cs_ro.csproj", "{8125A0B7-986E-4A6F-A86D-E6D4B46716CA}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "uint16_d", "JIT\Directed\shift\uint16_d.csproj", "{A5F2C5A6-CFED-460C-BA3C-CC12B7D65B04}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "uint16_do", "JIT\Directed\shift\uint16_do.csproj", "{F89754F7-86E1-44EE-A3EE-2256FF7CB6DA}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "uint16_r", "JIT\Directed\shift\uint16_r.csproj", "{D82E4648-8B61-4440-9A33-A1A573819CDA}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "uint16_ro", "JIT\Directed\shift\uint16_ro.csproj", "{77044369-D426-49C1-B738-4FBB1C88B20F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "uint32_cs_d", "JIT\Directed\shift\uint32_cs_d.csproj", "{D1DB2E34-A5F3-46EC-9CBA-6C952AE50EF6}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "uint32_cs_do", "JIT\Directed\shift\uint32_cs_do.csproj", "{33869AC4-FDC0-481E-BA88-DEAD9629BDF0}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "uint32_cs_r", "JIT\Directed\shift\uint32_cs_r.csproj", "{F595FF0D-D7F5-4D91-9265-0875DA1DEEDB}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "uint32_cs_ro", "JIT\Directed\shift\uint32_cs_ro.csproj", "{6B2D1E6F-69BC-43FB-9749-376324A45285}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "uint32_d", "JIT\Directed\shift\uint32_d.csproj", "{7B10C9CA-7BA5-4D17-9E04-F497B26150FB}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "uint32_do", "JIT\Directed\shift\uint32_do.csproj", "{B9C90B98-C141-43C4-B7AD-A80A11194326}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "uint32_r", "JIT\Directed\shift\uint32_r.csproj", "{FB91C947-292D-4338-89C4-CE25442BC21A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "uint32_ro", "JIT\Directed\shift\uint32_ro.csproj", "{3DA358E2-D2B8-4160-AAE8-353C355FC767}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "uint64_d", "JIT\Directed\shift\uint64_d.csproj", "{1562736B-261A-40CC-8AFE-C0F1C2892DEB}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "uint64_do", "JIT\Directed\shift\uint64_do.csproj", "{8FB8C934-E5DA-4A20-930B-5C30BE80831A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "uint64_r", "JIT\Directed\shift\uint64_r.csproj", "{DB8A5DD9-466F-484E-AEBA-2B78F1FF3633}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "uint64_ro", "JIT\Directed\shift\uint64_ro.csproj", "{50453737-C530-4473-8D14-123A43C9DA9F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "uint8_cs_d", "JIT\Directed\shift\uint8_cs_d.csproj", "{E27869B0-3B87-4C49-816E-456917FF793B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "uint8_cs_do", "JIT\Directed\shift\uint8_cs_do.csproj", "{6843A842-DCA4-4EA5-95FB-9164F6067A34}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "uint8_cs_r", "JIT\Directed\shift\uint8_cs_r.csproj", "{0AB7BA45-9C43-4DC0-AF1E-5F51E7C5194A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "uint8_cs_ro", "JIT\Directed\shift\uint8_cs_ro.csproj", "{EB897B42-FC20-4AAA-BD9D-34FA116BF84B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "uint8_d", "JIT\Directed\shift\uint8_d.csproj", "{C640C7D2-7131-45B4-90DF-A8B02E394867}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "uint8_do", "JIT\Directed\shift\uint8_do.csproj", "{DD34B3DA-9910-497A-8475-10301F94FE15}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "uint8_r", "JIT\Directed\shift\uint8_r.csproj", "{A4D554D9-407B-4D76-AEC2-6ABCE064AA15}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "uint8_ro", "JIT\Directed\shift\uint8_ro.csproj", "{3CC950C2-CFBD-499A-8A32-AE359C46F96A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "straccess1_cs_d", "JIT\Directed\StrAccess\straccess1_cs_d.csproj", "{C2EEBDC3-4DA0-45FD-9805-FA0608F754B7}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "straccess1_cs_do", "JIT\Directed\StrAccess\straccess1_cs_do.csproj", "{435C204F-7509-4599-B6C5-2DA2D362E664}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "straccess1_cs_r", "JIT\Directed\StrAccess\straccess1_cs_r.csproj", "{A1038D6D-50D2-494B-933D-74034583F3F8}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "straccess1_cs_ro", "JIT\Directed\StrAccess\straccess1_cs_ro.csproj", "{462CD1A6-B52A-428D-91A7-026ABC26C3A9}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "straccess2_cs_d", "JIT\Directed\StrAccess\straccess2_cs_d.csproj", "{B41121E9-EC15-484E-9E96-46E89CBB1EEB}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "straccess2_cs_do", "JIT\Directed\StrAccess\straccess2_cs_do.csproj", "{B06A2649-0937-45B1-8B5E-7433847BB664}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "straccess2_cs_r", "JIT\Directed\StrAccess\straccess2_cs_r.csproj", "{582ED7B9-78A9-46E2-96AD-940C44257BD9}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "straccess2_cs_ro", "JIT\Directed\StrAccess\straccess2_cs_ro.csproj", "{041F2129-8E15-4840-8D17-08FE1B99C98A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "straccess3_cs_d", "JIT\Directed\StrAccess\straccess3_cs_d.csproj", "{81036274-5786-483C-BD52-854B882B4F21}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "straccess3_cs_do", "JIT\Directed\StrAccess\straccess3_cs_do.csproj", "{8E3058EB-0198-4796-AEAD-E09965A73E00}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "straccess3_cs_r", "JIT\Directed\StrAccess\straccess3_cs_r.csproj", "{BDA62694-2760-4AF9-BE5D-ECE6A09A210B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "straccess3_cs_ro", "JIT\Directed\StrAccess\straccess3_cs_ro.csproj", "{EDAC3DEE-ED77-4180-A1DE-FF67AC42944B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "straccess4", "JIT\Directed\StrAccess\straccess4.csproj", "{F8C60870-9D7D-4C91-BD33-1D11A4151FA7}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Dev10_846218", "JIT\Directed\UnrollLoop\Dev10_846218.csproj", "{34026C3E-193C-45CF-B55D-8FAB068D4F79}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "loop1_cs_d", "JIT\Directed\UnrollLoop\loop1_cs_d.csproj", "{ADCBCB5C-816B-4C9D-8223-2DD2B43F9135}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "loop1_cs_do", "JIT\Directed\UnrollLoop\loop1_cs_do.csproj", "{C1B8B8B2-2070-42F0-9A03-D73F1DECC019}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "loop1_cs_r", "JIT\Directed\UnrollLoop\loop1_cs_r.csproj", "{857EEB5A-1D43-4B59-871A-3B36121450C3}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "loop1_cs_ro", "JIT\Directed\UnrollLoop\loop1_cs_ro.csproj", "{5A3575BA-0E0B-4736-954D-5A8ADD77DC2B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "loop2_cs_d", "JIT\Directed\UnrollLoop\loop2_cs_d.csproj", "{2E795F75-9DA6-4D10-9C32-C1D3FB854231}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "loop2_cs_do", "JIT\Directed\UnrollLoop\loop2_cs_do.csproj", "{1FB4BDC4-7EDD-4EF9-8F2F-363F7E83F31B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "loop2_cs_r", "JIT\Directed\UnrollLoop\loop2_cs_r.csproj", "{FDFA7555-C1FF-400D-8DBC-5672E2E76494}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "loop2_cs_ro", "JIT\Directed\UnrollLoop\loop2_cs_ro.csproj", "{4499F174-5CA5-4447-81A0-A8E3BA1908D7}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "loop4_cs_d", "JIT\Directed\UnrollLoop\loop4_cs_d.csproj", "{96C8C125-C97D-43D0-AA6F-817C6792C359}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "loop4_cs_do", "JIT\Directed\UnrollLoop\loop4_cs_do.csproj", "{D4CAEC15-F75F-419B-80E9-6FA9E89AFE48}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "loop4_cs_r", "JIT\Directed\UnrollLoop\loop4_cs_r.csproj", "{5627E983-E7DD-482C-A316-F84B97EDBB81}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "loop4_cs_ro", "JIT\Directed\UnrollLoop\loop4_cs_ro.csproj", "{6659CA3F-F648-4C54-8911-FA18239A2434}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "loop6_cs_d", "JIT\Directed\UnrollLoop\loop6_cs_d.csproj", "{79804B5E-FE7E-4A45-88B5-D06A4B3707EC}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "loop6_cs_do", "JIT\Directed\UnrollLoop\loop6_cs_do.csproj", "{61A46528-0278-4494-8866-2B7E3D492CCB}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "loop6_cs_r", "JIT\Directed\UnrollLoop\loop6_cs_r.csproj", "{95390053-5AC5-4774-A8D5-76F4C8DBC526}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "loop6_cs_ro", "JIT\Directed\UnrollLoop\loop6_cs_ro.csproj", "{F388A679-EDA8-4E0F-A785-267276D0AD3F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "148343", "JIT\jit64\gc\misc\148343.csproj", "{FDB5082B-284C-47B5-BA9E-D3BA3827E77E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "9param", "JIT\jit64\gc\misc\9param.csproj", "{EA83A9C9-5175-4748-A2EA-657F1062417D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "9_and_alloca2", "JIT\jit64\gc\misc\9_and_alloca2.csproj", "{E76172C3-533E-45BD-BCA3-AACDC1582253}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "alloca3", "JIT\jit64\gc\misc\alloca3.csproj", "{0D32389E-EAF9-46DF-A22A-5ED50D938CA5}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "eh1", "JIT\jit64\gc\misc\eh1.csproj", "{A99284A9-472A-4267-9703-E2022CD1BCFC}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "fgtest1", "JIT\jit64\gc\misc\fgtest1.csproj", "{10227F6C-14EE-4B2D-BCCB-51186C1FA17B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "fgtest2", "JIT\jit64\gc\misc\fgtest2.csproj", "{B91FAC94-A870-4DA5-9884-3CBE91619028}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "funclet", "JIT\jit64\gc\misc\funclet.csproj", "{A323618C-1BE2-4C13-835C-357550C2045B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gc-pinned-code-motion", "JIT\jit64\gc\misc\gc-pinned-code-motion.csproj", "{30E7FF89-D9FB-494E-B15A-D4586B0843A9}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gcparaminreg", "JIT\jit64\gc\misc\gcparaminreg.csproj", "{7E9B09A2-41D8-4D4C-B0AA-D11DE27F915D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ret_struct_test1", "JIT\jit64\gc\misc\ret_struct_test1.csproj", "{EF719996-B2BD-4E12-A8F5-119DD1172311}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ret_struct_test4", "JIT\jit64\gc\misc\ret_struct_test4.csproj", "{78A4C6DB-7DC3-4CF6-ABDE-9D0E902A439F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "simple1", "JIT\jit64\gc\misc\simple1.csproj", "{9341C58E-FAAC-464F-AB5D-A736111F7A98}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct1", "JIT\jit64\gc\misc\struct1.csproj", "{784679B0-F680-4223-9D03-5B091BC9F366}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct1_2", "JIT\jit64\gc\misc\struct1_2.csproj", "{DB658675-5C6C-4E6E-AA34-4C615AE3E67B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct1_4", "JIT\jit64\gc\misc\struct1_4.csproj", "{6993E572-EAC0-4871-BAD1-95761C88454A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct1_5", "JIT\jit64\gc\misc\struct1_5.csproj", "{91360442-D3C0-4D74-9118-9FF487FDE584}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct2", "JIT\jit64\gc\misc\struct2.csproj", "{947AFD46-4826-4369-AC2C-32D034C1A132}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct2_2", "JIT\jit64\gc\misc\struct2_2.csproj", "{953F0002-60DE-4DA0-B5FA-09A5CCB5A84A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct2_4", "JIT\jit64\gc\misc\struct2_4.csproj", "{69B7D820-0D96-4E27-B1D3-D24BCE90D971}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct2_5", "JIT\jit64\gc\misc\struct2_5.csproj", "{C9FC348E-6C32-4EE4-88CA-CBA4B07E03A8}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct2_5_2", "JIT\jit64\gc\misc\struct2_5_2.csproj", "{E99CF244-F83B-4ABF-9E34-3B0AD4952FD7}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct3", "JIT\jit64\gc\misc\struct3.csproj", "{CFD6FBC3-0829-4816-A109-DF17642EC807}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct3_2", "JIT\jit64\gc\misc\struct3_2.csproj", "{7168FCA0-FB92-4DFF-B707-D3AAA31A3C1D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct3_4", "JIT\jit64\gc\misc\struct3_4.csproj", "{5F47EAB6-5AE5-4984-8952-1469F57C1DB2}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct3_5", "JIT\jit64\gc\misc\struct3_5.csproj", "{A7A97E1B-E121-4C7A-B036-F4FE64DE19D5}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct4", "JIT\jit64\gc\misc\struct4.csproj", "{59D2FB73-8919-47E8-8D2F-39FC895542A1}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct4_2", "JIT\jit64\gc\misc\struct4_2.csproj", "{D9C051F7-4FBB-4190-9757-5C01ABF0B689}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct4_4", "JIT\jit64\gc\misc\struct4_4.csproj", "{83F3CA73-8D90-46CB-BFCC-8EBF03D05E7D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct4_5", "JIT\jit64\gc\misc\struct4_5.csproj", "{183E5583-F710-4471-8D5F-82E8870070B7}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct5", "JIT\jit64\gc\misc\struct5.csproj", "{C2F9938D-F3B4-4876-B2B4-17A1D2979776}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct5_2", "JIT\jit64\gc\misc\struct5_2.csproj", "{3B98CEA1-5C18-4D5E-AB3D-E8016AA09FEF}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct5_4", "JIT\jit64\gc\misc\struct5_4.csproj", "{E27E6C51-D863-4A37-B4B5-1FA702801182}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct5_5", "JIT\jit64\gc\misc\struct5_5.csproj", "{687B9C6A-54F5-4F7E-9377-E112DB221FD4}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct6", "JIT\jit64\gc\misc\struct6.csproj", "{70C9B60F-3625-4FFA-BF45-3A09FE44E07C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct6_2", "JIT\jit64\gc\misc\struct6_2.csproj", "{D560DC48-96BE-44B4-9888-B4E03E1B3765}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct6_4", "JIT\jit64\gc\misc\struct6_4.csproj", "{0E65AFBB-462D-439C-963E-2C2956FA144D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct6_5", "JIT\jit64\gc\misc\struct6_5.csproj", "{E7DBA180-50EE-4C35-993D-EE1F99A699B3}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct7_1", "JIT\jit64\gc\misc\struct7_1.csproj", "{8125B28C-071B-4CD2-A50D-DA215AA389F3}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct8", "JIT\jit64\gc\misc\struct8.csproj", "{08D9EA87-1D05-44C7-8C0A-8FBB46BCF36D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct9", "JIT\jit64\gc\misc\struct9.csproj", "{7BBC4D50-60B0-428F-83E1-AC59E40B69A9}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct9_2", "JIT\jit64\gc\misc\struct9_2.csproj", "{E565FDC8-B44F-428F-BA6D-CDBC0D4F97B7}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structfp1_1", "JIT\jit64\gc\misc\structfp1_1.csproj", "{7228D6BE-7DCC-4835-9440-06B60BAF11D4}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structfp1_2", "JIT\jit64\gc\misc\structfp1_2.csproj", "{4B6F9370-A846-4AC7-87DD-B063026CFE18}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structfp1_3", "JIT\jit64\gc\misc\structfp1_3.csproj", "{8846FE32-F9C4-422A-9CB3-5182BD5D499B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structfp1_4", "JIT\jit64\gc\misc\structfp1_4.csproj", "{1BFFB516-D072-4CB5-BDB0-6C9F119F35E4}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structfp1_5", "JIT\jit64\gc\misc\structfp1_5.csproj", "{0979655B-4819-4FE5-8EAD-FF13BE1B1F3A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structfp1_6", "JIT\jit64\gc\misc\structfp1_6.csproj", "{5D602420-536C-4E83-8BA8-1AC79C8D8F57}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structfp2_1", "JIT\jit64\gc\misc\structfp2_1.csproj", "{ADD31611-45AF-4C2C-B6A7-6CEEC385ECF4}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structfp2_2", "JIT\jit64\gc\misc\structfp2_2.csproj", "{553D2B2B-5049-4023-91AD-3CDC21ABFD1C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structfp2_3", "JIT\jit64\gc\misc\structfp2_3.csproj", "{8D3B11D0-8C4F-4447-96E6-F22C0494CF15}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structfp2_4", "JIT\jit64\gc\misc\structfp2_4.csproj", "{3BFD0851-EA70-4828-BBA2-0468285214E3}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structfp3_1", "JIT\jit64\gc\misc\structfp3_1.csproj", "{E91063A5-23D5-4C45-A7F8-89C3407973AD}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structfp4_1", "JIT\jit64\gc\misc\structfp4_1.csproj", "{5A19ECD1-B77D-4FEA-BDD9-4BA3B7CA409D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structfp5_1", "JIT\jit64\gc\misc\structfp5_1.csproj", "{4E02BA7E-68FE-4E39-998B-27AE540E3702}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structfp6_1", "JIT\jit64\gc\misc\structfp6_1.csproj", "{99EFDA6E-620E-42D7-8AA9-E9A892391F71}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structfpseh5_1", "JIT\jit64\gc\misc\structfpseh5_1.csproj", "{A3C88E81-EA3B-4A65-80F6-C0C3C9B1A2A6}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structfpseh6_1", "JIT\jit64\gc\misc\structfpseh6_1.csproj", "{917074AE-08B3-47F1-BC55-B1AB689F63F6}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structref1_1", "JIT\jit64\gc\misc\structref1_1.csproj", "{588350A8-F5D4-4ECE-8EB7-C3B0854D8284}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structret1_1", "JIT\jit64\gc\misc\structret1_1.csproj", "{8D34364F-BED7-4826-A45A-36E02B779647}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structret1_2", "JIT\jit64\gc\misc\structret1_2.csproj", "{079BF300-6D67-4B3F-8415-112D4A8A6DE1}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structret1_3", "JIT\jit64\gc\misc\structret1_3.csproj", "{D4A066AF-0A8C-4659-8964-361D312DD81F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structret2_1", "JIT\jit64\gc\misc\structret2_1.csproj", "{26E230D2-968F-4D0B-BF5D-0A6E6FE8A2E9}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structret2_2", "JIT\jit64\gc\misc\structret2_2.csproj", "{5C18C7D3-B459-4E6B-AD0A-87AF8D68F497}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structret2_3", "JIT\jit64\gc\misc\structret2_3.csproj", "{642CDD80-28F0-409A-84E0-0DDF40EFF966}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structret3_1", "JIT\jit64\gc\misc\structret3_1.csproj", "{31C5A706-165F-4028-A12B-24C81E821447}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structret3_2", "JIT\jit64\gc\misc\structret3_2.csproj", "{84B4AD9B-F3F3-4769-99BE-96BFCCEA447F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structret3_3", "JIT\jit64\gc\misc\structret3_3.csproj", "{8CE12894-BD33-4011-81E5-7986AC1B7AE4}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structret4_1", "JIT\jit64\gc\misc\structret4_1.csproj", "{B96F0BAB-7B39-4757-8775-E04452A4C740}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structret4_2", "JIT\jit64\gc\misc\structret4_2.csproj", "{CD9BF7A2-8952-486E-A014-9C0F848E8306}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structret4_3", "JIT\jit64\gc\misc\structret4_3.csproj", "{D8EAF760-1723-4827-A05A-D25452438C4D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structret5_1", "JIT\jit64\gc\misc\structret5_1.csproj", "{5C18D93E-1A66-46E0-959B-DB56F0F58C5B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structret5_2", "JIT\jit64\gc\misc\structret5_2.csproj", "{C5B880B8-5F56-4167-B4F3-6D8242E32C34}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structret5_3", "JIT\jit64\gc\misc\structret5_3.csproj", "{EA520D46-7FC9-4657-AAA3-8C0EAE99E365}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structret6_1", "JIT\jit64\gc\misc\structret6_1.csproj", "{235A4D64-B91A-4DC7-B6B8-3BE1E07E230F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structret6_2", "JIT\jit64\gc\misc\structret6_2.csproj", "{6351A54D-4AF0-4FEF-82BC-39A1B91860EE}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structret6_3", "JIT\jit64\gc\misc\structret6_3.csproj", "{EBB87DB8-2F0C-4EC1-8ADB-FDC030F01BB7}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "structva1_1", "JIT\jit64\gc\misc\structva1_1.csproj", "{789D91DC-38AC-4293-8FF3-A351CBEEA98B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test1", "JIT\jit64\gc\misc\test1.csproj", "{FBEFF26E-E543-44EB-97DB-A35D529AF001}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test2", "JIT\jit64\gc\misc\test2.csproj", "{3DEC45F3-89A5-4F8B-9013-01A5E65B6F2B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test3", "JIT\jit64\gc\misc\test3.csproj", "{F4446508-D1BB-49B2-AA86-DEAD87A7D00C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test_noalloca", "JIT\jit64\gc\misc\test_noalloca.csproj", "{596F4D3B-4673-481F-9B3B-63AD94467F0E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "vbil", "JIT\jit64\gc\misc\vbil.csproj", "{668CC077-E27C-4BCA-BFDC-7665BDF3A414}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "143837", "JIT\jit64\gc\regress\vswhidbey\143837.csproj", "{E0742648-250D-44E9-9240-315BF341E2E2}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "339415", "JIT\jit64\gc\regress\vswhidbey\339415.csproj", "{CED9FC4A-BD8C-4EF2-8A64-4BCAC3ABF4CB}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "arrayexpr1", "JIT\jit64\opt\cse\arrayexpr1.csproj", "{184EB631-F61D-410D-8AF1-B8AE431A5AB1}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "arrayexpr2_d_loop_try", "JIT\jit64\opt\cse\arrayexpr2_d_loop_try.csproj", "{74AE0CEB-D09C-470C-899D-7A4D9FF3B323}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "arrayexpr2_r", "JIT\jit64\opt\cse\arrayexpr2_r.csproj", "{2683C3CA-8B4D-4302-AF5A-D5E474F9C29B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "arrayexpr2_ro_loop", "JIT\jit64\opt\cse\arrayexpr2_ro_loop.csproj", "{EC6E2B2D-93BE-47A4-92A6-47158993402D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "arrayexpr2_r_loop", "JIT\jit64\opt\cse\arrayexpr2_r_loop.csproj", "{1BE2429D-2C90-427D-9FA9-1102B41603BB}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "arrayexpr2_r_loop_try", "JIT\jit64\opt\cse\arrayexpr2_r_loop_try.csproj", "{9FAE0763-0333-461C-A412-4F19A04F3D02}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "arrayexpr2_r_try", "JIT\jit64\opt\cse\arrayexpr2_r_try.csproj", "{C4242908-520F-4448-B010-67B9A70FECC1}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "fieldexpr1", "JIT\jit64\opt\cse\fieldexpr1.csproj", "{F0311035-7E69-4386-8D0B-66884FAFA924}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "fieldexpr1_1", "JIT\jit64\opt\cse\fieldexpr1_1.csproj", "{2431682E-15D7-475D-AB18-45D7CC316A22}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "fieldexpr2", "JIT\jit64\opt\cse\fieldexpr2.csproj", "{1D2795A7-3FED-4199-91D7-4EBBC9A8773D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "fieldExprUnchecked1", "JIT\jit64\opt\cse\fieldExprUnchecked1.csproj", "{ED46394E-7DE4-49B7-A92B-B9BA54132245}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HugeArray", "JIT\jit64\opt\cse\HugeArray.csproj", "{BEA92187-D3E8-48FC-B4A7-D0FEF7E2C1E8}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HugeArray1", "JIT\jit64\opt\cse\HugeArray1.csproj", "{2D062909-B106-4120-9C31-8D32F2394798}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "hugeexpr1", "JIT\jit64\opt\cse\hugeexpr1.csproj", "{58D9A09C-9D65-48D0-A13F-7FA0BB22838E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HugeField1", "JIT\jit64\opt\cse\HugeField1.csproj", "{B21C4E34-7743-4381-9B4C-99627BA8F9C6}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HugeField2", "JIT\jit64\opt\cse\HugeField2.csproj", "{0212B91B-4135-400F-BF6D-93809909496A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "hugeSimpleExpr1", "JIT\jit64\opt\cse\hugeSimpleExpr1.csproj", "{53D80023-9448-44F4-875D-575C04FF8404}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mixedexpr1_d_loop_try", "JIT\jit64\opt\cse\mixedexpr1_d_loop_try.csproj", "{EAE31C83-CDA9-492C-BA36-157FEF6FA0F9}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mixedexpr1_r", "JIT\jit64\opt\cse\mixedexpr1_r.csproj", "{5A2A29BF-A5C2-4DB1-B905-234047CC0F62}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mixedexpr1_ro_loop", "JIT\jit64\opt\cse\mixedexpr1_ro_loop.csproj", "{E1771D57-4628-444F-B838-8F12E6012BA5}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mixedexpr1_r_loop", "JIT\jit64\opt\cse\mixedexpr1_r_loop.csproj", "{089FC866-7DF2-41A0-8094-8A524C4FC713}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mixedexpr1_r_loop_try", "JIT\jit64\opt\cse\mixedexpr1_r_loop_try.csproj", "{30A68F83-6397-4D9E-A9AC-04F9F0C7B6CE}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mixedexpr1_r_try", "JIT\jit64\opt\cse\mixedexpr1_r_try.csproj", "{6E0F6229-1D3B-4719-B782-3DB5C0C792B8}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pointerexpr1", "JIT\jit64\opt\cse\pointerexpr1.csproj", "{CB1DD25E-6C1B-4BAF-966B-8DD21EA72E74}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "pointerexpr1_1", "JIT\jit64\opt\cse\pointerexpr1_1.csproj", "{B5EB8015-3E35-434C-8ACB-0DC8948A3187}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "simpleexpr1", "JIT\jit64\opt\cse\simpleexpr1.csproj", "{CF2715F0-25EC-4F5B-AE4B-1F9DA314D880}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "simpleexpr1_1", "JIT\jit64\opt\cse\simpleexpr1_1.csproj", "{6C323F5A-B563-4F00-8311-1F3A3989CC4D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "simpleexpr2", "JIT\jit64\opt\cse\simpleexpr2.csproj", "{95327237-D435-434B-AE93-5C30115C7663}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "simpleexpr3", "JIT\jit64\opt\cse\simpleexpr3.csproj", "{4996DF71-4E47-49C5-9857-F0942487F4B3}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "simpleexpr4_d_loop_try", "JIT\jit64\opt\cse\simpleexpr4_d_loop_try.csproj", "{E0C3F30B-3B05-4390-A7CE-C70432E26861}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "simpleexpr4_r", "JIT\jit64\opt\cse\simpleexpr4_r.csproj", "{1CE03C7A-601A-4AD8-B1DC-37F6AD36B861}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "simpleexpr4_ro_loop", "JIT\jit64\opt\cse\simpleexpr4_ro_loop.csproj", "{9F603CE5-AED2-40FD-8034-D7FF005DA40E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "simpleexpr4_r_loop", "JIT\jit64\opt\cse\simpleexpr4_r_loop.csproj", "{B71D58CC-93B5-471A-8F74-0E30F6DCE3D1}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "simpleexpr4_r_loop_try", "JIT\jit64\opt\cse\simpleexpr4_r_loop_try.csproj", "{10E406E9-75CF-4A3D-B448-ED9E02EBA7D3}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "simpleexpr4_r_try", "JIT\jit64\opt\cse\simpleexpr4_r_try.csproj", "{6FE98154-4239-4D39-A665-9D7EFD4961BB}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "staticFieldExpr1_1", "JIT\jit64\opt\cse\staticFieldExpr1_1.csproj", "{934DF959-89A7-4AD1-B2E7-68DE53A3305F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "staticFieldExpr1_d_loop_try", "JIT\jit64\opt\cse\staticFieldExpr1_d_loop_try.csproj", "{5DF9C78F-2147-439B-A9A1-485662343D02}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "staticFieldExpr1_r", "JIT\jit64\opt\cse\staticFieldExpr1_r.csproj", "{DCFBA03F-4498-4E6E-B389-820E87341927}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "staticFieldExpr1_ro_loop", "JIT\jit64\opt\cse\staticFieldExpr1_ro_loop.csproj", "{5DA3DA67-3157-46FB-82FA-74DCC51C298E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "staticFieldExpr1_r_loop", "JIT\jit64\opt\cse\staticFieldExpr1_r_loop.csproj", "{E6003279-D6B5-4E63-9237-244D96C5E1D1}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "staticFieldExpr1_r_loop_try", "JIT\jit64\opt\cse\staticFieldExpr1_r_loop_try.csproj", "{AF2C7178-EB18-4F5F-9C03-CBCF931C32C5}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "staticFieldExpr1_r_try", "JIT\jit64\opt\cse\staticFieldExpr1_r_try.csproj", "{415582ED-14CB-41F9-891B-07F0E1AFE02A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "staticFieldExprUnchecked1_d_loop_try", "JIT\jit64\opt\cse\staticFieldExprUnchecked1_d_loop_try.csproj", "{70617D82-107B-4AB4-A336-3B729B9B62B4}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "staticFieldExprUnchecked1_r", "JIT\jit64\opt\cse\staticFieldExprUnchecked1_r.csproj", "{13792ECB-CE27-4C83-8DEC-92D5EFB11A2D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "staticFieldExprUnchecked1_ro_loop", "JIT\jit64\opt\cse\staticFieldExprUnchecked1_ro_loop.csproj", "{73AA459B-430A-4296-9AAA-62E62615F28D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "staticFieldExprUnchecked1_r_loop", "JIT\jit64\opt\cse\staticFieldExprUnchecked1_r_loop.csproj", "{F3F1AA7A-CBBB-4293-9F03-E047A2CB1439}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "staticFieldExprUnchecked1_r_loop_try", "JIT\jit64\opt\cse\staticFieldExprUnchecked1_r_loop_try.csproj", "{E136E2BC-AD99-48C2-801C-0396F29391CC}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "staticFieldExprUnchecked1_r_try", "JIT\jit64\opt\cse\staticFieldExprUnchecked1_r_try.csproj", "{29C0EC2A-D599-43CA-84D9-C8C95C72136D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "volatilefield", "JIT\jit64\opt\cse\volatilefield.csproj", "{92127EE1-C096-4417-9A2E-94C34053A379}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "volatilestaticfield", "JIT\jit64\opt\cse\volatilestaticfield.csproj", "{3A0259CC-C707-4A88-802C-36AB169E56FD}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VolatileTest_op_add", "JIT\jit64\opt\cse\VolatileTest_op_add.csproj", "{BF5C70EC-5E7E-443F-BB66-2DA2BC7FAAB2}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VolatileTest_op_and", "JIT\jit64\opt\cse\VolatileTest_op_and.csproj", "{CCD0AB75-D346-403E-A6B2-3679C980B66A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VolatileTest_op_div", "JIT\jit64\opt\cse\VolatileTest_op_div.csproj", "{3F72CAA0-BFC4-432F-9882-0E7B9A8899F3}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VolatileTest_op_mod", "JIT\jit64\opt\cse\VolatileTest_op_mod.csproj", "{83011DC7-382E-4573-BA09-10DFC377BA80}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VolatileTest_op_mul", "JIT\jit64\opt\cse\VolatileTest_op_mul.csproj", "{4A9D343C-6CD5-428E-BE71-F6532244A629}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VolatileTest_op_or", "JIT\jit64\opt\cse\VolatileTest_op_or.csproj", "{511EDC7B-13C5-40AD-AD87-A99272CAE138}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VolatileTest_op_shr", "JIT\jit64\opt\cse\VolatileTest_op_shr.csproj", "{08FBD8EC-642B-4283-987D-3544FFF55A65}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VolatileTest_op_sub", "JIT\jit64\opt\cse\VolatileTest_op_sub.csproj", "{3D4497F0-44E9-4DD3-9ED4-BF81FA76142F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VolatileTest_op_xor", "JIT\jit64\opt\cse\VolatileTest_op_xor.csproj", "{C87C2962-EA62-4535-9DB2-77420B6D3BE7}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CGRecurseAAA_d", "JIT\jit64\opt\cg\CGRecurse\CGRecurseAAA_d.csproj", "{3ED661B5-319B-48F4-9967-0CBABE8EBE73}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CGRecurseAAA_do", "JIT\jit64\opt\cg\CGRecurse\CGRecurseAAA_do.csproj", "{865955A1-6602-4193-8987-345C4EF8356A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CGRecurseAAA_r", "JIT\jit64\opt\cg\CGRecurse\CGRecurseAAA_r.csproj", "{B228E862-A53D-4F11-BCD6-D8D272F0C66C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CGRecurseAAA_ro", "JIT\jit64\opt\cg\CGRecurse\CGRecurseAAA_ro.csproj", "{6B7E70E6-EF12-44B8-B9A4-6BED566A2F8D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CGRecurseAAC_d", "JIT\jit64\opt\cg\CGRecurse\CGRecurseAAC_d.csproj", "{63E99969-750E-464D-899E-6EEE9EA67F9A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CGRecurseAAC_do", "JIT\jit64\opt\cg\CGRecurse\CGRecurseAAC_do.csproj", "{BE135661-BB2B-45D4-824E-29C5F824C046}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CGRecurseAAC_r", "JIT\jit64\opt\cg\CGRecurse\CGRecurseAAC_r.csproj", "{A4D62CDE-4698-44AD-AD64-3DBF9332C254}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CGRecurseAAC_ro", "JIT\jit64\opt\cg\CGRecurse\CGRecurseAAC_ro.csproj", "{EA7AD6C6-064B-4DB3-9F90-109ACFAF4C84}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CGRecurseACA_d", "JIT\jit64\opt\cg\CGRecurse\CGRecurseACA_d.csproj", "{ED45850C-314D-4C54-AEDE-BAF0BAB35C11}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CGRecurseACA_do", "JIT\jit64\opt\cg\CGRecurse\CGRecurseACA_do.csproj", "{25259293-8AB2-41F9-A85A-287B67A92F47}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CGRecurseACA_r", "JIT\jit64\opt\cg\CGRecurse\CGRecurseACA_r.csproj", "{80432680-467C-44B5-B7F1-93AC39D576E5}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CGRecurseACA_ro", "JIT\jit64\opt\cg\CGRecurse\CGRecurseACA_ro.csproj", "{32092B1E-6593-44B9-97E6-5EAED24DA728}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CGRecurseACC_d", "JIT\jit64\opt\cg\CGRecurse\CGRecurseACC_d.csproj", "{243B71CD-1777-47D9-9FBA-1600979C9CAD}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CGRecurseACC_do", "JIT\jit64\opt\cg\CGRecurse\CGRecurseACC_do.csproj", "{377E5E65-3EBB-40BE-9AF2-1EFABF501F77}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CGRecurseACC_r", "JIT\jit64\opt\cg\CGRecurse\CGRecurseACC_r.csproj", "{DB27E434-7BF3-40DC-8EE8-45E221D021B6}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CGRecurseACC_ro", "JIT\jit64\opt\cg\CGRecurse\CGRecurseACC_ro.csproj", "{518679EE-E7BD-4C43-A1AA-49EC99884AB5}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CgStress1_d", "JIT\jit64\opt\cg\cgstress\CgStress1_d.csproj", "{577F22AF-E8A2-4F30-B334-52C472E00218}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CgStress1_do", "JIT\jit64\opt\cg\cgstress\CgStress1_do.csproj", "{7B9B9A61-B8D4-40BE-B129-CAE29DA7DBE9}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CgStress1_r", "JIT\jit64\opt\cg\cgstress\CgStress1_r.csproj", "{AE1875D5-E1FF-4B62-AC11-6D240E08EF4F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CgStress1_ro", "JIT\jit64\opt\cg\cgstress\CgStress1_ro.csproj", "{574638AF-F419-4A9C-AB48-C2E4E4FA871E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CgStress2_d", "JIT\jit64\opt\cg\cgstress\CgStress2_d.csproj", "{7D460199-5067-44D8-AF25-63FC56C328CD}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CgStress2_do", "JIT\jit64\opt\cg\cgstress\CgStress2_do.csproj", "{EC1E4B63-F569-4AED-951E-6AD70E068837}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CgStress2_r", "JIT\jit64\opt\cg\cgstress\CgStress2_r.csproj", "{7819D99D-5521-41F5-B6E0-002C176B64D1}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CgStress2_ro", "JIT\jit64\opt\cg\cgstress\CgStress2_ro.csproj", "{2109EB2F-0679-47CB-90DC-4C1D3DB4D4FE}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CgStress3_d", "JIT\jit64\opt\cg\cgstress\CgStress3_d.csproj", "{8B7C722A-3E7E-476A-A6EB-3A33E0D7B8F5}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CgStress3_do", "JIT\jit64\opt\cg\cgstress\CgStress3_do.csproj", "{1B939809-FCC2-45FE-A420-F39FA207713C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CgStress3_r", "JIT\jit64\opt\cg\cgstress\CgStress3_r.csproj", "{D3EF87D0-AA9F-4E5B-AAF3-EEE3E920E25B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CgStress3_ro", "JIT\jit64\opt\cg\cgstress\CgStress3_ro.csproj", "{415E8598-01F0-484D-9B87-A9DB65DFACF8}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "caninline_d", "JIT\jit64\opt\inl\caninline_d.csproj", "{4D4D9073-CC9D-49E2-90C5-B3F8E0EFA7E7}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "caninline_do", "JIT\jit64\opt\inl\caninline_do.csproj", "{3AB2ED60-231C-4C23-820F-43B89362AB37}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "caninline_r", "JIT\jit64\opt\inl\caninline_r.csproj", "{835C8533-31E5-46BD-9328-7C13BCBDFA3B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "caninline_ro", "JIT\jit64\opt\inl\caninline_ro.csproj", "{5FABFBE1-CB4F-4347-9869-E8F831DD5BD6}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "lim_002", "JIT\jit64\opt\lim\lim_002.csproj", "{D57D7CFC-1AD8-44FB-A234-78C6126C5894}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "lur_02", "JIT\jit64\opt\lur\lur_02.csproj", "{2A843792-C6EE-41E9-8A85-0EDA1052287A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "osr001", "JIT\jit64\opt\osr\osr001.csproj", "{3B636BB6-F327-4E8B-9100-C7A9238E0FAD}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArrayBound_o", "JIT\jit64\opt\rngchk\ArrayBound_o.csproj", "{79040C68-CDB1-4FD0-BD86-3CC5CAAC76BC}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArrayWith2Loops_o", "JIT\jit64\opt\rngchk\ArrayWith2Loops_o.csproj", "{11AC9F3D-88EA-4F10-9D3B-A88E06F71933}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArrayWithFunc_o", "JIT\jit64\opt\rngchk\ArrayWithFunc_o.csproj", "{5E785831-90A1-467A-BC23-5A20376C53CA}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ArrayWithThread_o", "JIT\jit64\opt\rngchk\ArrayWithThread_o.csproj", "{93A9E752-E897-4AC3-9300-1D13448718F5}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BadMatrixMul_o", "JIT\jit64\opt\rngchk\BadMatrixMul_o.csproj", "{2D8E4374-328F-4F65-A292-FD15174C849C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "JaggedArray_o", "JIT\jit64\opt\rngchk\JaggedArray_o.csproj", "{D530EB76-9464-46BE-9361-70D8ADF04C1C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MatrixMul_o", "JIT\jit64\opt\rngchk\MatrixMul_o.csproj", "{9EC006C2-A636-4C39-9908-54E1CB3E6DD2}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RngchkStress1_o", "JIT\jit64\opt\rngchk\RngchkStress1_o.csproj", "{1B1D2B4C-323A-4ACE-BF39-C5624E90B405}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RngchkStress2_o", "JIT\jit64\opt\rngchk\RngchkStress2_o.csproj", "{06A7C6C6-9B9B-4299-9D67-575E496D832A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RngchkStress3", "JIT\jit64\opt\rngchk\RngchkStress3.csproj", "{CADE5351-B017-4FEE-BE92-EFD112DC2603}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimpleArray_01_o", "JIT\jit64\opt\rngchk\SimpleArray_01_o.csproj", "{5E1E3008-E73A-4E97-A3F1-37DC2EEB295A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "foo", "JIT\jit64\regress\asurt\143616\foo.csproj", "{A4F38D33-E204-4736-A17A-A2EE4A595365}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "simple", "JIT\jit64\regress\ndpw\160545\simple.csproj", "{8A9206C6-2B99-4B43-BB80-F6D05D66CC0A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "interior_pointer", "JIT\jit64\regress\ndpw\21015\interior_pointer.csproj", "{02955291-75B3-40FF-8F78-B2CC05C6F9BA}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test", "JIT\jit64\regress\vsw\102964\test.csproj", "{CB4C76B4-98B5-4D6B-92E9-9500C6EE4D6B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test", "JIT\jit64\regress\vsw\329169\test.csproj", "{5D5E8CBE-803F-42E5-A2AC-B94CAFBAAF3C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test", "JIT\jit64\regress\vsw\373472\test.csproj", "{301BDE42-EF25-40DD-82EC-3D599E309CA2}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test", "JIT\jit64\regress\vsw\471729\test.csproj", "{252FAB4F-DA96-4FBD-AFEB-B06F31B4927F}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test", "JIT\jit64\regress\vsw\517867\test.csproj", "{C67C7372-EE6C-48C7-B98C-0EC5222B7C29}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test1", "JIT\jit64\regress\vsw\524070\test1.csproj", "{E1F35D93-E1D2-4CC3-887F-D9E83D765588}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test2", "JIT\jit64\regress\vsw\524070\test2.csproj", "{82C15ECD-27A9-4029-8097-3E15DD3FD949}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "simple-repro", "JIT\jit64\regress\vsw\528315\simple-repro.csproj", "{90D0B14A-1B35-4F5F-AE27-1B447DC0BAC2}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test1", "JIT\jit64\regress\vsw\538615\test1.csproj", "{DFF216BA-CE50-45EA-9C53-96A57D23240C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test1", "JIT\jit64\regress\vsw\539509\test1.csproj", "{BAF4C82D-B91F-4469-9483-FBC7950B825E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test1", "JIT\jit64\regress\vsw\541067\test1.csproj", "{15603803-65FD-42A5-BDA8-AD25FEDDDAB5}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test", "JIT\jit64\regress\vsw\543229\test.csproj", "{49EFDAE0-AE6B-49BA-B96E-866A7FDF6E25}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "test", "JIT\jit64\regress\vsw\549880\test.csproj", "{EBF67994-3AE2-4EBA-BC2A-C11907A62F30}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "stret", "JIT\jit64\regress\vsw\601425\stret.csproj", "{E0F6F130-5083-4088-B095-8E33BE269C85}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "vsw610378", "JIT\jit64\regress\vsw\610378\vsw610378.csproj", "{43F24741-6FD9-4593-92FA-D3252B540A92}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "class01", "JIT\Generics\Arrays\ConstructedTypes\Jagged\class01.csproj", "{A8BFCD41-6773-4700-8092-70369FDE6125}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "class01_instance", "JIT\Generics\Arrays\ConstructedTypes\Jagged\class01_instance.csproj", "{1CF36D39-C343-4842-BBD6-8A170BBEABAC}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "class01_static", "JIT\Generics\Arrays\ConstructedTypes\Jagged\class01_static.csproj", "{7FDE4C23-E5E9-4891-9B21-4E3C94206E61}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "class02", "JIT\Generics\Arrays\ConstructedTypes\Jagged\class02.csproj", "{568DC68E-8321-4B98-AE6C-F4877B2C6E21}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "class03", "JIT\Generics\Arrays\ConstructedTypes\Jagged\class03.csproj", "{6531BCBB-6286-4989-ADF0-8C24C6D3490C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "class04", "JIT\Generics\Arrays\ConstructedTypes\Jagged\class04.csproj", "{BB6F5D3B-AAD3-45CD-B2E8-DA9B64BB40EA}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "class05", "JIT\Generics\Arrays\ConstructedTypes\Jagged\class05.csproj", "{84AC84B6-357C-4D39-8C62-E9B78C3D8198}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "class06", "JIT\Generics\Arrays\ConstructedTypes\Jagged\class06.csproj", "{EB58BEAA-3872-4F62-A0BF-596B18C4B4C7}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "class07", "JIT\Generics\Arrays\ConstructedTypes\Jagged\class07.csproj", "{BE711884-16DD-41D3-8EE8-07DE371D3DD2}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struc01", "JIT\Generics\Arrays\ConstructedTypes\Jagged\struc01.csproj", "{BF20FD4B-45EE-4614-B121-9B8A1D856D0A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Struct01", "JIT\Generics\Arrays\ConstructedTypes\Jagged\Struct01.csproj", "{205D9EA5-99D9-42A3-8670-C2F4E8E95DB4}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Struct01_instance", "JIT\Generics\Arrays\ConstructedTypes\Jagged\Struct01_instance.csproj", "{9F7BB3E7-27FD-44EB-B8C9-5E4B8596146A}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct01_static", "JIT\Generics\Arrays\ConstructedTypes\Jagged\struct01_static.csproj", "{A6EE6750-296C-4545-8484-7BE877285357}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct02", "JIT\Generics\Arrays\ConstructedTypes\Jagged\struct02.csproj", "{1041EDB6-3F75-4892-9306-C0BF9C9D0584}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct03", "JIT\Generics\Arrays\ConstructedTypes\Jagged\struct03.csproj", "{ED1E29DC-FD20-4457-AC2B-4DF94248D0B6}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct04", "JIT\Generics\Arrays\ConstructedTypes\Jagged\struct04.csproj", "{C10068FD-69FE-4DC7-B9EF-8973C193B354}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct05", "JIT\Generics\Arrays\ConstructedTypes\Jagged\struct05.csproj", "{900795A5-A96E-4E6B-9C09-87617F444F05}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct06", "JIT\Generics\Arrays\ConstructedTypes\Jagged\struct06.csproj", "{630CD41D-B922-4064-B5CD-B77FF2C09B4C}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct07", "JIT\Generics\Arrays\ConstructedTypes\Jagged\struct07.csproj", "{98EDD8DC-A478-49A5-89A5-78ADDBF4BD07}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "class01", "JIT\Generics\Arrays\ConstructedTypes\MultiDim\class01.csproj", "{B2C7B915-DC44-4C68-AD3D-E94061A3CE79}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "class01_instance", "JIT\Generics\Arrays\ConstructedTypes\MultiDim\class01_instance.csproj", "{2646F7D3-291C-4892-AEF1-6B14840F0E05}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "class01_static", "JIT\Generics\Arrays\ConstructedTypes\MultiDim\class01_static.csproj", "{88289879-FE00-45B2-A561-783022B8BDEA}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct01", "JIT\Generics\Arrays\ConstructedTypes\MultiDim\struct01.csproj", "{80F8F357-E85D-49BA-9065-AE13D7A79839}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct01_instance", "JIT\Generics\Arrays\ConstructedTypes\MultiDim\struct01_instance.csproj", "{551CDF76-46AD-435B-851E-12C74ACC72A6}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "struct01_static", "JIT\Generics\Arrays\ConstructedTypes\MultiDim\struct01_static.csproj", "{15426961-0948-487F-ABE5-08BE8E6C7607}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "class01", "JIT\Generics\Arrays\TypeParameters\Jagged\class01.csproj", "{B9C2A1E8-B95E-4765-B27D-F127A8E9D6C6}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFB