Skip to content

Commit ab635ee

Browse files
EgorBomikelle-rogers
authored andcommitted
Reapply "Fold "X relop 0" in assertprop" (dotnet#110129) (dotnet#110142)
1 parent aa34a0f commit ab635ee

File tree

2 files changed

+41
-3
lines changed

2 files changed

+41
-3
lines changed

src/coreclr/jit/assertionprop.cpp

+40-2
Original file line numberDiff line numberDiff line change
@@ -3957,7 +3957,8 @@ void Compiler::optAssertionProp_RangeProperties(ASSERT_VALARG_TP assertions,
39573957
}
39583958

39593959
// First, analyze possible X ==/!= CNS assertions.
3960-
if (curAssertion->IsConstantInt32Assertion() && (curAssertion->op1.vn == treeVN))
3960+
if (curAssertion->IsConstantInt32Assertion() && (curAssertion->op1.kind == O1K_LCLVAR) &&
3961+
(curAssertion->op1.vn == treeVN))
39613962
{
39623963
if ((curAssertion->assertionKind == OAK_NOT_EQUAL) && (curAssertion->op2.u1.iconVal == 0))
39633964
{
@@ -4295,6 +4296,44 @@ GenTree* Compiler::optAssertionPropGlobal_RelOp(ASSERT_VALARG_TP assertions, Gen
42954296
GenTree* op1 = tree->AsOp()->gtOp1;
42964297
GenTree* op2 = tree->AsOp()->gtOp2;
42974298

4299+
// Can we fold "X relop 0" based on assertions?
4300+
if (op2->IsIntegralConst(0) && tree->OperIsCmpCompare())
4301+
{
4302+
bool isNonZero, isNeverNegative;
4303+
optAssertionProp_RangeProperties(assertions, op1, &isNonZero, &isNeverNegative);
4304+
4305+
if (tree->OperIs(GT_GE, GT_LT) && isNeverNegative)
4306+
{
4307+
// Assertions: X >= 0
4308+
//
4309+
// X >= 0 --> true
4310+
// X < 0 --> false
4311+
newTree = tree->OperIs(GT_GE) ? gtNewTrue() : gtNewFalse();
4312+
}
4313+
else if (tree->OperIs(GT_GT, GT_LE) && isNeverNegative && isNonZero)
4314+
{
4315+
// Assertions: X > 0
4316+
//
4317+
// X > 0 --> true
4318+
// X <= 0 --> false
4319+
newTree = tree->OperIs(GT_GT) ? gtNewTrue() : gtNewFalse();
4320+
}
4321+
else if (tree->OperIs(GT_EQ, GT_NE) && isNonZero)
4322+
{
4323+
// Assertions: X != 0
4324+
//
4325+
// X != 0 --> true
4326+
// X == 0 --> false
4327+
newTree = tree->OperIs(GT_NE) ? gtNewTrue() : gtNewFalse();
4328+
}
4329+
4330+
if (newTree != tree)
4331+
{
4332+
newTree = gtWrapWithSideEffects(newTree, tree, GTF_ALL_EFFECT);
4333+
return optAssertionProp_Update(newTree, tree, stmt);
4334+
}
4335+
}
4336+
42984337
// Look for assertions of the form (tree EQ/NE 0)
42994338
AssertionIndex index = optGlobalAssertionIsEqualOrNotEqualZero(assertions, tree);
43004339

@@ -4315,7 +4354,6 @@ GenTree* Compiler::optAssertionPropGlobal_RelOp(ASSERT_VALARG_TP assertions, Gen
43154354

43164355
newTree = curAssertion->assertionKind == OAK_EQUAL ? gtNewIconNode(0) : gtNewIconNode(1);
43174356
newTree = gtWrapWithSideEffects(newTree, tree, GTF_ALL_EFFECT);
4318-
newTree = fgMorphTree(newTree);
43194357
DISPTREE(newTree);
43204358
return optAssertionProp_Update(newTree, tree, stmt);
43214359
}

src/libraries/System.Runtime.InteropServices/tests/Directory.Build.targets

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
44
<IlcExportUnmanagedEntrypoints>true</IlcExportUnmanagedEntrypoints>
55
</PropertyGroup>
6-
<!-- Expose unmanaged entry points from NativeExports -->
6+
<!-- Expose unmanaged entry points from NativeExports -->
77
<ItemGroup Condition="'$(ReferencesNativeExports)' == 'true'">
88
<UnmanagedEntryPointsAssembly Include="Microsoft.Interop.Tests.NativeExports" />
99
<DirectPInvoke Include="Microsoft.Interop.Tests.NativeExportsNE" />

0 commit comments

Comments
 (0)