summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorAndy Ayers <andya@microsoft.com>2016-05-04 17:09:12 -0700
committerAndy Ayers <andya@microsoft.com>2016-05-04 17:09:12 -0700
commit7995c7db6626d77a2deac664a1557157c89271fc (patch)
treea0c3bc1066b913b08d90af532aa10f4ff3fcca3d /tests
parenta12aed9422083394022752f282e7656d40206acd (diff)
parent2121c05ffad2a686679a3d4c685bf5ce690f3c56 (diff)
downloadcoreclr-7995c7db6626d77a2deac664a1557157c89271fc.tar.gz
coreclr-7995c7db6626d77a2deac664a1557157c89271fc.tar.bz2
coreclr-7995c7db6626d77a2deac664a1557157c89271fc.zip
Merge pull request #4763 from AndyAyersMS/InlineIntoControlExamples
Add some tests for optimization of booleans
Diffstat (limited to 'tests')
-rw-r--r--tests/src/JIT/Methodical/inlining/boolean/InlineBool.cs378
-rw-r--r--tests/src/JIT/Methodical/inlining/boolean/app.config27
-rw-r--r--tests/src/JIT/Methodical/inlining/boolean/test.csproj49
3 files changed, 454 insertions, 0 deletions
diff --git a/tests/src/JIT/Methodical/inlining/boolean/InlineBool.cs b/tests/src/JIT/Methodical/inlining/boolean/InlineBool.cs
new file mode 100644
index 0000000000..ece501c691
--- /dev/null
+++ b/tests/src/JIT/Methodical/inlining/boolean/InlineBool.cs
@@ -0,0 +1,378 @@
+// 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.
+
+// Tests for boolean expression, control flow, and inlining optimizations.
+// All 100 variants of Id should generate the same code.
+
+using System;
+using System.Runtime.CompilerServices;
+namespace InlineBool
+{
+ public class Program
+ {
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ static bool False00() { return false; }
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ static bool False01() { return !true; }
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ static bool False02() { return Id00(False00()); }
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ static bool False03() { return Not00(True00()); }
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ static bool False04() { return Id00(Id00(False00())); }
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ static bool False05() { return Not00(Not00(False00())); }
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ static bool True00() { return true; }
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ static bool True01() { return !false; }
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ static bool True02() { return Id00(True00()); }
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ static bool True03() { return Not00(False00()); }
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ static bool True04() { return Id00(Id00(True00())); }
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ static bool True05() { return Not00(Not00(True00())); }
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ static bool Not00(bool x) { return !x; }
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ static bool Not01(bool x) { return x == false; }
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ static bool Not02(bool x) { return Not00(Id00(x)); }
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ static bool Not03(bool x) { return Id00(Not00(x)); }
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ static bool Not04(bool x) { return Id00(!x); }
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ static bool Not05(bool x) { return !Id00(x); }
+
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ static bool Id00(bool x) { return x; }
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ static bool Id01(bool x) { return x == true; }
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ static bool Id02(bool x) { return Not00(Not00(x)); }
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ static bool Id03(bool x) { return Id00(Id00(x)); }
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ static bool Id04(bool x) { return Id00(x); }
+ [MethodImpl(MethodImplOptions.AggressiveInlining)]
+ static bool Id05(bool x) { return !Id00(!x); }
+ static bool Id06(bool x) { return x ? true : false; }
+ static bool Id07(bool x) { return !x ? false : true; }
+ static bool Id08(bool x) { if (x) return true; else return false; }
+ static bool Id09(bool x) { if (!x) return false; else return true; }
+ static bool Id10(bool x) { return Id00(x) ? true : false; }
+ static bool Id11(bool x) { return Not00(x) ? false : true; }
+ static bool Id12(bool x) { if (x) return x; else return x; }
+ static bool Id13(bool x) { if (!x) return x; else return x; }
+ static bool Id14(bool x) { return x ? x : x; }
+ static bool Id15(bool x) { return !x ? x : x; }
+ static bool Id16(bool x) { return x == true ? true : false; }
+ static bool Id17(bool x) { return x == false ? false : true; }
+ static bool Id18(bool x) { return x != true ? false : true; }
+ static bool Id19(bool x) { return x != false ? true : false; }
+ static bool Id20(bool x) { return !x == true ? false : true; }
+ static bool Id21(bool x) { return !x == false ? true : false; }
+ static bool Id22(bool x) { return !!x; }
+ static bool Id23(bool x) { return !!!!x; }
+ static bool Id24(bool x) { return !!!!!!x; }
+ static bool Id25(bool x) { return !!!!!!!!x; }
+ static bool Id26(bool x) { return !!x ? !!x : !!x; }
+ static bool Id27(bool x) { return !x ? !!x : !!x; }
+ static bool Id28(bool x) { return x & x; }
+ static bool Id29(bool x) { return x && x; }
+ static bool Id30(bool x) { return x | x; }
+ static bool Id31(bool x) { return x | x & x | x; }
+ static bool Id32(bool x) { return x || x; }
+ static bool Id33(bool x) { return x & x ? true : false; }
+ static bool Id34(bool x) { return x | x ? true : false; }
+ static bool Id35(bool x) { return x && x ? true : false; }
+ static bool Id36(bool x) { return x || x ? true : false; }
+ static bool Id37(bool x) { return x && x && x ? true : false; }
+ static bool Id38(bool x) { return x || x || x ? true : false; }
+ static bool Id39(bool x) { return x | x & x | x ? ! x ^ x : x ^ x; }
+ static bool Id40(bool x) { return !!Id00(x); }
+ static bool Id41(bool x) { return x == True00(); }
+ static bool Id42(bool x) { return !Not00(!Not00(x)); }
+ static bool Id43(bool x) { return !Id00(!Id00(x)); }
+ static bool Id44(bool x) { return Id00(!!x); }
+ static bool Id45(bool x) { return !!Id00(!!x); }
+ static bool Id46(bool x) { return x ? True00() : False00(); }
+ static bool Id47(bool x) { return !x ? False00() : True00(); }
+ static bool Id48(bool x) { if (x) return True00(); else return False00(); }
+ static bool Id49(bool x) { if (!x) return False00(); else return True00(); }
+ static bool Id50(bool x) { return Id00(x) ? True00() : False00(); }
+ static bool Id51(bool x) { return Not00(x) ? False00() : True00(); }
+ static bool Id52(bool x) { if (Id00(x)) return Id00(x); else return Id00(x); }
+ static bool Id53(bool x) { if (!Id00(x)) return Id00(x); else return Id00(x); }
+ static bool Id54(bool x) { return Id00(x) ? Id00(x) : Id00(x); }
+ static bool Id55(bool x) { return Not00(x) ? Id00(x) : Id00(x); }
+ static bool Id56(bool x) { return x == True00() ? true : false; }
+ static bool Id57(bool x) { return x == False00() ? false : true; }
+ static bool Id58(bool x) { return Id00(x != true) ? false : true; }
+ static bool Id59(bool x) { return Id00(x != false) ? true : false; }
+ static bool Id60(bool x) { return Id01(x) ? True01() : False01(); }
+ static bool Id61(bool x) { return Not01(x) ? False01() : True01(); }
+ static bool Id62(bool x) { if (Id01(x)) return Id01(x); else return Id01(x); }
+ static bool Id63(bool x) { if (!Id01(x)) return Id01(x); else return Id01(x); }
+ static bool Id64(bool x) { return Id01(x) ? Id01(x) : Id01(x); }
+ static bool Id65(bool x) { return Not01(x) ? Id01(x) : Id01(x); }
+ static bool Id66(bool x) { return x == True01() ? true : false; }
+ static bool Id67(bool x) { return x == False01() ? false : true; }
+ static bool Id68(bool x) { return Id01(x != true) ? false : true; }
+ static bool Id69(bool x) { return Id01(x != false) ? true : false; }
+ static bool Id70(bool x) { return Id02(x) ? True02() : False02(); }
+ static bool Id71(bool x) { return Not02(x) ? False02() : True02(); }
+ static bool Id72(bool x) { if (Id02(x)) return Id02(x); else return Id02(x); }
+ static bool Id73(bool x) { if (!Id02(x)) return Id02(x); else return Id02(x); }
+ static bool Id74(bool x) { return Id02(x) ? Id02(x) : Id02(x); }
+ static bool Id75(bool x) { return Not02(x) ? Id02(x) : Id02(x); }
+ static bool Id76(bool x) { return x == True02() ? true : false; }
+ static bool Id77(bool x) { return x == False02() ? false : true; }
+ static bool Id78(bool x) { return Id02(x != true) ? false : true; }
+ static bool Id79(bool x) { return Id02(x != false) ? true : false; }
+ static bool Id80(bool x) { return Id03(x) ? True03() : False03(); }
+ static bool Id81(bool x) { return Not03(x) ? False03() : True03(); }
+ static bool Id82(bool x) { if (Id03(x)) return Id03(x); else return Id03(x); }
+ static bool Id83(bool x) { if (!Id03(x)) return Id03(x); else return Id03(x); }
+ static bool Id84(bool x) { return Id03(x) ? Id03(x) : Id03(x); }
+ static bool Id85(bool x) { return Not03(x) ? Id03(x) : Id03(x); }
+ static bool Id86(bool x) { return x == True03() ? true : false; }
+ static bool Id87(bool x) { return x == False03() ? false : true; }
+ static bool Id88(bool x) { return Id03(x != true) ? false : true; }
+ static bool Id89(bool x) { return Id03(x != false) ? true : false; }
+ static bool Id90(bool x) { return Id04(x) ? True04() : False04(); }
+ static bool Id91(bool x) { return Not04(x) ? False04() : True04(); }
+ static bool Id92(bool x) { if (Id04(x)) return Id04(x); else return Id04(x); }
+ static bool Id93(bool x) { if (!Id04(x)) return Id04(x); else return Id04(x); }
+ static bool Id94(bool x) { return Id04(x) ? Id04(x) : Id04(x); }
+ static bool Id95(bool x) { return Not04(x) ? Id04(x) : Id04(x); }
+ static bool Id96(bool x) { return x == True04() ? true : false; }
+ static bool Id97(bool x) { return x == False04() ? false : true; }
+ static bool Id98(bool x) { return Id04(x != true) ? false : true; }
+ static bool Id99(bool x) { return Id04(x != false) ? true : false; }
+
+ [MethodImpl(MethodImplOptions.NoOptimization)]
+ public static int Main(string[] args)
+ {
+ bool result = true;
+
+ result &= Id00(true);
+ result &= ! Id00(false);
+ result &= Id01(true);
+ result &= ! Id01(false);
+ result &= Id02(true);
+ result &= ! Id02(false);
+ result &= Id03(true);
+ result &= ! Id03(false);
+ result &= Id04(true);
+ result &= ! Id04(false);
+ result &= Id05(true);
+ result &= ! Id05(false);
+ result &= Id06(true);
+ result &= ! Id06(false);
+ result &= Id07(true);
+ result &= ! Id07(false);
+ result &= Id08(true);
+ result &= ! Id08(false);
+ result &= Id09(true);
+ result &= ! Id09(false);
+
+ result &= Id10(true);
+ result &= ! Id10(false);
+ result &= Id11(true);
+ result &= ! Id11(false);
+ result &= Id12(true);
+ result &= ! Id12(false);
+ result &= Id13(true);
+ result &= ! Id13(false);
+ result &= Id14(true);
+ result &= ! Id14(false);
+ result &= Id15(true);
+ result &= ! Id15(false);
+ result &= Id16(true);
+ result &= ! Id16(false);
+ result &= Id17(true);
+ result &= ! Id17(false);
+ result &= Id18(true);
+ result &= ! Id18(false);
+ result &= Id19(true);
+ result &= ! Id19(false);
+
+ result &= Id20(true);
+ result &= ! Id20(false);
+ result &= Id21(true);
+ result &= ! Id21(false);
+ result &= Id22(true);
+ result &= ! Id22(false);
+ result &= Id23(true);
+ result &= ! Id23(false);
+ result &= Id24(true);
+ result &= ! Id24(false);
+ result &= Id25(true);
+ result &= ! Id25(false);
+ result &= Id26(true);
+ result &= ! Id26(false);
+ result &= Id27(true);
+ result &= ! Id27(false);
+ result &= Id28(true);
+ result &= ! Id28(false);
+ result &= Id29(true);
+ result &= ! Id29(false);
+
+ result &= Id30(true);
+ result &= ! Id30(false);
+ result &= Id31(true);
+ result &= ! Id31(false);
+ result &= Id32(true);
+ result &= ! Id32(false);
+ result &= Id33(true);
+ result &= ! Id33(false);
+ result &= Id34(true);
+ result &= ! Id34(false);
+ result &= Id35(true);
+ result &= ! Id35(false);
+ result &= Id36(true);
+ result &= ! Id36(false);
+ result &= Id37(true);
+ result &= ! Id37(false);
+ result &= Id38(true);
+ result &= ! Id38(false);
+ result &= Id39(true);
+ result &= ! Id39(false);
+
+ result &= Id40(true);
+ result &= ! Id40(false);
+ result &= Id41(true);
+ result &= ! Id41(false);
+ result &= Id42(true);
+ result &= ! Id42(false);
+ result &= Id43(true);
+ result &= ! Id43(false);
+ result &= Id44(true);
+ result &= ! Id44(false);
+ result &= Id45(true);
+ result &= ! Id45(false);
+ result &= Id46(true);
+ result &= ! Id46(false);
+ result &= Id47(true);
+ result &= ! Id47(false);
+ result &= Id48(true);
+ result &= ! Id48(false);
+ result &= Id49(true);
+ result &= ! Id49(false);
+
+ result &= Id50(true);
+ result &= ! Id50(false);
+ result &= Id51(true);
+ result &= ! Id51(false);
+ result &= Id52(true);
+ result &= ! Id52(false);
+ result &= Id53(true);
+ result &= ! Id53(false);
+ result &= Id54(true);
+ result &= ! Id54(false);
+ result &= Id55(true);
+ result &= ! Id55(false);
+ result &= Id56(true);
+ result &= ! Id56(false);
+ result &= Id57(true);
+ result &= ! Id57(false);
+ result &= Id58(true);
+ result &= ! Id58(false);
+ result &= Id59(true);
+ result &= ! Id59(false);
+
+ result &= Id60(true);
+ result &= ! Id60(false);
+ result &= Id61(true);
+ result &= ! Id61(false);
+ result &= Id62(true);
+ result &= ! Id62(false);
+ result &= Id63(true);
+ result &= ! Id63(false);
+ result &= Id64(true);
+ result &= ! Id64(false);
+ result &= Id65(true);
+ result &= ! Id65(false);
+ result &= Id66(true);
+ result &= ! Id66(false);
+ result &= Id67(true);
+ result &= ! Id67(false);
+ result &= Id68(true);
+ result &= ! Id68(false);
+ result &= Id69(true);
+ result &= ! Id69(false);
+
+ result &= Id70(true);
+ result &= ! Id70(false);
+ result &= Id71(true);
+ result &= ! Id71(false);
+ result &= Id72(true);
+ result &= ! Id72(false);
+ result &= Id73(true);
+ result &= ! Id73(false);
+ result &= Id74(true);
+ result &= ! Id74(false);
+ result &= Id75(true);
+ result &= ! Id75(false);
+ result &= Id76(true);
+ result &= ! Id76(false);
+ result &= Id77(true);
+ result &= ! Id77(false);
+ result &= Id78(true);
+ result &= ! Id78(false);
+ result &= Id79(true);
+ result &= ! Id79(false);
+
+ result &= Id80(true);
+ result &= ! Id80(false);
+ result &= Id81(true);
+ result &= ! Id81(false);
+ result &= Id82(true);
+ result &= ! Id82(false);
+ result &= Id83(true);
+ result &= ! Id83(false);
+ result &= Id84(true);
+ result &= ! Id84(false);
+ result &= Id85(true);
+ result &= ! Id85(false);
+ result &= Id86(true);
+ result &= ! Id86(false);
+ result &= Id87(true);
+ result &= ! Id87(false);
+ result &= Id88(true);
+ result &= ! Id88(false);
+ result &= Id89(true);
+ result &= ! Id89(false);
+
+ result &= Id90(true);
+ result &= ! Id90(false);
+ result &= Id91(true);
+ result &= ! Id91(false);
+ result &= Id92(true);
+ result &= ! Id92(false);
+ result &= Id93(true);
+ result &= ! Id93(false);
+ result &= Id94(true);
+ result &= ! Id94(false);
+ result &= Id95(true);
+ result &= ! Id95(false);
+ result &= Id96(true);
+ result &= ! Id96(false);
+ result &= Id97(true);
+ result &= ! Id97(false);
+ result &= Id98(true);
+ result &= ! Id98(false);
+ result &= Id99(true);
+ result &= ! Id99(false);
+
+ return result ? 100 : -1;
+ }
+ }
+}
diff --git a/tests/src/JIT/Methodical/inlining/boolean/app.config b/tests/src/JIT/Methodical/inlining/boolean/app.config
new file mode 100644
index 0000000000..8077c95440
--- /dev/null
+++ b/tests/src/JIT/Methodical/inlining/boolean/app.config
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<configuration>
+ <runtime>
+ <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
+ <dependentAssembly>
+ <assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.20.0" newVersion="4.0.20.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Text.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.IO" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ <dependentAssembly>
+ <assemblyIdentity name="System.Reflection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
+ <bindingRedirect oldVersion="0.0.0.0-4.0.10.0" newVersion="4.0.10.0" />
+ </dependentAssembly>
+ </assemblyBinding>
+ </runtime>
+</configuration> \ No newline at end of file
diff --git a/tests/src/JIT/Methodical/inlining/boolean/test.csproj b/tests/src/JIT/Methodical/inlining/boolean/test.csproj
new file mode 100644
index 0000000000..6a057a51af
--- /dev/null
+++ b/tests/src/JIT/Methodical/inlining/boolean/test.csproj
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.props))\dir.props" />
+ <PropertyGroup>
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+ <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+ <AssemblyName>$(MSBuildProjectName)</AssemblyName>
+ <SchemaVersion>2.0</SchemaVersion>
+ <ProjectGuid>{95DFC527-4DC1-495E-97D7-E94EE1F7140D}</ProjectGuid>
+ <OutputType>Exe</OutputType>
+ <AppDesignerFolder>Properties</AppDesignerFolder>
+ <FileAlignment>512</FileAlignment>
+ <ProjectTypeGuids>{786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
+ <ReferencePath>$(ProgramFiles)\Common Files\microsoft shared\VSTT\11.0\UITestExtensionPackages</ReferencePath>
+ <SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\..\</SolutionDir>
+
+ <NuGetPackageImportStamp>7a9bfb7d</NuGetPackageImportStamp>
+ </PropertyGroup>
+ <!-- Default configurations to help VS understand the configurations -->
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+ </PropertyGroup>
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
+ </PropertyGroup>
+ <ItemGroup>
+ <CodeAnalysisDependentAssemblyPaths Condition=" '$(VS100COMNTOOLS)' != '' " Include="$(VS100COMNTOOLS)..\IDE\PrivateAssemblies">
+ <Visible>False</Visible>
+ </CodeAnalysisDependentAssemblyPaths>
+ </ItemGroup>
+ <PropertyGroup>
+ <DebugType>PdbOnly</DebugType>
+ </PropertyGroup>
+ <ItemGroup>
+ <Compile Include="InlineBool.cs" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="$(JitPackagesConfigFileDirectory)minimal\project.json" />
+ <None Include="app.config" />
+ </ItemGroup>
+ <ItemGroup>
+ <Service Include="{82A7F48D-3B50-4B1E-B82E-3ADA8210C358}" />
+ </ItemGroup>
+ <PropertyGroup>
+ <ProjectJson>$(JitPackagesConfigFileDirectory)minimal\project.json</ProjectJson>
+ <ProjectLockJson>$(JitPackagesConfigFileDirectory)minimal\project.lock.json</ProjectLockJson>
+ </PropertyGroup>
+ <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), dir.targets))\dir.targets" />
+ <PropertyGroup Condition=" '$(MsBuildProjectDirOverride)' != '' ">
+ </PropertyGroup>
+</Project>