Skip to content

Commit

Permalink
Reapply "Fold "X relop 0" in assertprop" (dotnet#110129) (dotnet#110142)
Browse files Browse the repository at this point in the history
  • Loading branch information
EgorBo authored and mikelle-rogers committed Dec 4, 2024
1 parent aa34a0f commit ab635ee
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 3 deletions.
42 changes: 40 additions & 2 deletions src/coreclr/jit/assertionprop.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3957,7 +3957,8 @@ void Compiler::optAssertionProp_RangeProperties(ASSERT_VALARG_TP assertions,
}

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

// Can we fold "X relop 0" based on assertions?
if (op2->IsIntegralConst(0) && tree->OperIsCmpCompare())
{
bool isNonZero, isNeverNegative;
optAssertionProp_RangeProperties(assertions, op1, &isNonZero, &isNeverNegative);

if (tree->OperIs(GT_GE, GT_LT) && isNeverNegative)
{
// Assertions: X >= 0
//
// X >= 0 --> true
// X < 0 --> false
newTree = tree->OperIs(GT_GE) ? gtNewTrue() : gtNewFalse();
}
else if (tree->OperIs(GT_GT, GT_LE) && isNeverNegative && isNonZero)
{
// Assertions: X > 0
//
// X > 0 --> true
// X <= 0 --> false
newTree = tree->OperIs(GT_GT) ? gtNewTrue() : gtNewFalse();
}
else if (tree->OperIs(GT_EQ, GT_NE) && isNonZero)
{
// Assertions: X != 0
//
// X != 0 --> true
// X == 0 --> false
newTree = tree->OperIs(GT_NE) ? gtNewTrue() : gtNewFalse();
}

if (newTree != tree)
{
newTree = gtWrapWithSideEffects(newTree, tree, GTF_ALL_EFFECT);
return optAssertionProp_Update(newTree, tree, stmt);
}
}

// Look for assertions of the form (tree EQ/NE 0)
AssertionIndex index = optGlobalAssertionIsEqualOrNotEqualZero(assertions, tree);

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

newTree = curAssertion->assertionKind == OAK_EQUAL ? gtNewIconNode(0) : gtNewIconNode(1);
newTree = gtWrapWithSideEffects(newTree, tree, GTF_ALL_EFFECT);
newTree = fgMorphTree(newTree);
DISPTREE(newTree);
return optAssertionProp_Update(newTree, tree, stmt);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>None</ResolveAssemblyWarnOrErrorOnTargetArchitectureMismatch>
<IlcExportUnmanagedEntrypoints>true</IlcExportUnmanagedEntrypoints>
</PropertyGroup>
<!-- Expose unmanaged entry points from NativeExports -->
<!-- Expose unmanaged entry points from NativeExports -->
<ItemGroup Condition="'$(ReferencesNativeExports)' == 'true'">
<UnmanagedEntryPointsAssembly Include="Microsoft.Interop.Tests.NativeExports" />
<DirectPInvoke Include="Microsoft.Interop.Tests.NativeExportsNE" />
Expand Down

0 comments on commit ab635ee

Please sign in to comment.