Remove unnecessary bitvec allocation in assertion prop
authorMike Danes <onemihaid@hotmail.com>
Fri, 16 Jun 2017 18:50:07 +0000 (21:50 +0300)
committerMike Danes <onemihaid@hotmail.com>
Fri, 16 Jun 2017 18:50:07 +0000 (21:50 +0300)
optVnNonNullPropCurStmt is called for each node and every time it allocates an empty BitVec because optNonNullAssertionProp_Call and optAssertionProp_Ind require it, they are also used in other code paths that do provide a non-empty BitVec.

Commit migrated from https://github.com/dotnet/coreclr/commit/53cc741cb949c540834172ee0e813a01bdcfae28

src/coreclr/src/jit/assertionprop.cpp

index b3fcd2c..138d269 100644 (file)
@@ -3524,13 +3524,13 @@ AssertionIndex Compiler::optAssertionIsNonNullInternal(GenTreePtr op, ASSERT_VAL
     // If local assertion prop use lcl comparison, else use VN comparison.
     if (!optLocalAssertionProp)
     {
-        ValueNum vn = op->gtVNPair.GetConservative();
-
-        if (BitVecOps::IsEmpty(apTraits, assertions))
+        if (BitVecOps::MayBeUninit(assertions) || BitVecOps::IsEmpty(apTraits, assertions))
         {
             return NO_ASSERTION_INDEX;
         }
 
+        ValueNum vn = op->gtVNPair.GetConservative();
+
         // Check each assertion to find if we have a vn == or != null assertion.
         BitVecOps::Iter iter(apTraits, assertions);
         unsigned        index = 0;
@@ -4855,7 +4855,7 @@ Compiler::fgWalkResult Compiler::optVNConstantPropCurStmt(BasicBlock* block, Gen
 //
 void Compiler::optVnNonNullPropCurStmt(BasicBlock* block, GenTreePtr stmt, GenTreePtr tree)
 {
-    ASSERT_TP  empty   = BitVecOps::MakeEmpty(apTraits);
+    ASSERT_TP  empty   = BitVecOps::UninitVal();
     GenTreePtr newTree = nullptr;
     if (tree->OperGet() == GT_CALL)
     {