diff options
author | Sergey Andreenko <seandree@microsoft.com> | 2019-03-26 17:16:07 -0700 |
---|---|---|
committer | Sergey Andreenko <seandree@microsoft.com> | 2019-04-09 16:42:11 -0700 |
commit | c6dbbf050b2a532bfc3e1b0a228da4d42f5e79e9 (patch) | |
tree | 9e5dd155df02689b99a1c32188622786122ea4f2 /src/jit | |
parent | 04c7fa63a52d4405298fd4053e7be137eac6a042 (diff) | |
download | coreclr-c6dbbf050b2a532bfc3e1b0a228da4d42f5e79e9.tar.gz coreclr-c6dbbf050b2a532bfc3e1b0a228da4d42f5e79e9.tar.bz2 coreclr-c6dbbf050b2a532bfc3e1b0a228da4d42f5e79e9.zip |
Clean optVNConstantPropOnTree.
Create a new tree with const val and attach side-effects to it.
Extract common code and delete returns in the of the switch.
Diffstat (limited to 'src/jit')
-rw-r--r-- | src/jit/assertionprop.cpp | 106 |
1 files changed, 41 insertions, 65 deletions
diff --git a/src/jit/assertionprop.cpp b/src/jit/assertionprop.cpp index 7c4a0c36cc..7b11b017f5 100644 --- a/src/jit/assertionprop.cpp +++ b/src/jit/assertionprop.cpp @@ -2388,8 +2388,8 @@ GenTree* Compiler::optVNConstantPropOnTree(BasicBlock* block, GenTree* tree) } // We want to use the Normal ValueNumber when checking for constants. - ValueNum vnCns = vnStore->VNConservativeNormalValue(tree->gtVNPair); - ValueNum vnLib = vnStore->VNLiberalNormalValue(tree->gtVNPair); + ValueNumPair vnPair = tree->gtVNPair; + ValueNum vnCns = vnStore->VNConservativeNormalValue(vnPair); // Check if node evaluates to a constant. if (!vnStore->IsVNConstant(vnCns)) @@ -2397,7 +2397,7 @@ GenTree* Compiler::optVNConstantPropOnTree(BasicBlock* block, GenTree* tree) return nullptr; } - GenTree* newTree = tree; + GenTree* conValTree = nullptr; switch (vnStore->TypeOfVN(vnCns)) { case TYP_FLOAT: @@ -2407,20 +2407,13 @@ GenTree* Compiler::optVNConstantPropOnTree(BasicBlock* block, GenTree* tree) if (tree->TypeGet() == TYP_INT) { // Same sized reinterpretation of bits to integer - newTree = optPrepareTreeForReplacement(tree, tree); - tree->ChangeOperConst(GT_CNS_INT); - tree->gtIntCon.gtIconVal = *(reinterpret_cast<int*>(&value)); - tree->gtVNPair = ValueNumPair(vnLib, vnCns); + conValTree = gtNewIconNode(*(reinterpret_cast<int*>(&value))); } else { // Implicit assignment conversion to float or double assert(varTypeIsFloating(tree->TypeGet())); - - newTree = optPrepareTreeForReplacement(tree, tree); - tree->ChangeOperConst(GT_CNS_DBL); - tree->gtDblCon.gtDconVal = value; - tree->gtVNPair = ValueNumPair(vnLib, vnCns); + conValTree = gtNewDconNode(value, tree->TypeGet()); } break; } @@ -2431,21 +2424,13 @@ GenTree* Compiler::optVNConstantPropOnTree(BasicBlock* block, GenTree* tree) if (tree->TypeGet() == TYP_LONG) { - // Same sized reinterpretation of bits to long - newTree = optPrepareTreeForReplacement(tree, tree); - tree->ChangeOperConst(GT_CNS_NATIVELONG); - tree->gtIntConCommon.SetLngValue(*(reinterpret_cast<INT64*>(&value))); - tree->gtVNPair = ValueNumPair(vnLib, vnCns); + conValTree = gtNewLconNode(*(reinterpret_cast<INT64*>(&value))); } else { // Implicit assignment conversion to float or double assert(varTypeIsFloating(tree->TypeGet())); - - newTree = optPrepareTreeForReplacement(tree, tree); - tree->ChangeOperConst(GT_CNS_DBL); - tree->gtDblCon.gtDconVal = value; - tree->gtVNPair = ValueNumPair(vnLib, vnCns); + conValTree = gtNewDconNode(value, tree->TypeGet()); } break; } @@ -2460,9 +2445,7 @@ GenTree* Compiler::optVNConstantPropOnTree(BasicBlock* block, GenTree* tree) // to be recorded as a relocation with the VM. if (!opts.compReloc) { - newTree = gtNewIconHandleNode(value, vnStore->GetHandleFlags(vnCns)); - newTree->gtVNPair = ValueNumPair(vnLib, vnCns); - newTree = optPrepareTreeForReplacement(tree, newTree); + conValTree = gtNewIconHandleNode(value, vnStore->GetHandleFlags(vnCns)); } } else @@ -2472,18 +2455,12 @@ GenTree* Compiler::optVNConstantPropOnTree(BasicBlock* block, GenTree* tree) { case TYP_INT: // Implicit assignment conversion to smaller integer - newTree = optPrepareTreeForReplacement(tree, tree); - tree->ChangeOperConst(GT_CNS_INT); - tree->gtIntCon.gtIconVal = (int)value; - tree->gtVNPair = ValueNumPair(vnLib, vnCns); + conValTree = gtNewIconNode(static_cast<int>(value)); break; case TYP_LONG: // Same type no conversion required - newTree = optPrepareTreeForReplacement(tree, tree); - tree->ChangeOperConst(GT_CNS_NATIVELONG); - tree->gtIntConCommon.SetLngValue(value); - tree->gtVNPair = ValueNumPair(vnLib, vnCns); + conValTree = gtNewLconNode(value); break; case TYP_FLOAT: @@ -2494,32 +2471,30 @@ GenTree* Compiler::optVNConstantPropOnTree(BasicBlock* block, GenTree* tree) case TYP_DOUBLE: // Same sized reinterpretation of bits to double - newTree = optPrepareTreeForReplacement(tree, tree); - tree->ChangeOperConst(GT_CNS_DBL); - tree->gtDblCon.gtDconVal = *(reinterpret_cast<double*>(&value)); - tree->gtVNPair = ValueNumPair(vnLib, vnCns); + conValTree = gtNewDconNode(*(reinterpret_cast<double*>(&value))); break; default: - return nullptr; + // Can't optimize. + break; } } } break; case TYP_REF: - if (tree->TypeGet() != TYP_REF) + { + if (tree->TypeGet() != TYP_REF) // TODO seandree: what are other cases here? { - return nullptr; + // Can't optimize. + break; } assert(vnStore->ConstantValue<size_t>(vnCns) == 0); - newTree = optPrepareTreeForReplacement(tree, tree); - tree->ChangeOperConst(GT_CNS_INT); - tree->gtIntCon.gtIconVal = 0; - tree->ClearIconHandleMask(); - tree->gtVNPair = ValueNumPair(vnLib, vnCns); - break; + + conValTree = gtNewIconNode(0, TYP_REF); + } + break; case TYP_INT: { @@ -2531,9 +2506,7 @@ GenTree* Compiler::optVNConstantPropOnTree(BasicBlock* block, GenTree* tree) // to be recorded as a relocation with the VM. if (!opts.compReloc) { - newTree = gtNewIconHandleNode(value, vnStore->GetHandleFlags(vnCns)); - newTree->gtVNPair = ValueNumPair(vnLib, vnCns); - newTree = optPrepareTreeForReplacement(tree, newTree); + conValTree = gtNewIconHandleNode(value, vnStore->GetHandleFlags(vnCns)); } } else @@ -2544,27 +2517,17 @@ GenTree* Compiler::optVNConstantPropOnTree(BasicBlock* block, GenTree* tree) case TYP_REF: case TYP_INT: // Same type no conversion required - newTree = optPrepareTreeForReplacement(tree, tree); - tree->ChangeOperConst(GT_CNS_INT); - tree->gtIntCon.gtIconVal = value; - tree->ClearIconHandleMask(); - tree->gtVNPair = ValueNumPair(vnLib, vnCns); + conValTree = gtNewIconNode(static_cast<int>(value)); break; case TYP_LONG: // Implicit assignment conversion to larger integer - newTree = optPrepareTreeForReplacement(tree, tree); - tree->ChangeOperConst(GT_CNS_NATIVELONG); - tree->gtIntConCommon.SetLngValue(value); - tree->gtVNPair = ValueNumPair(vnLib, vnCns); + conValTree = gtNewLconNode(static_cast<int>(value)); break; case TYP_FLOAT: // Same sized reinterpretation of bits to float - newTree = optPrepareTreeForReplacement(tree, tree); - tree->ChangeOperConst(GT_CNS_DBL); - tree->gtDblCon.gtDconVal = *(reinterpret_cast<float*>(&value)); - tree->gtVNPair = ValueNumPair(vnLib, vnCns); + conValTree = gtNewDconNode(*(reinterpret_cast<float*>(&value)), TYP_FLOAT); break; case TYP_DOUBLE: @@ -2574,16 +2537,29 @@ GenTree* Compiler::optVNConstantPropOnTree(BasicBlock* block, GenTree* tree) break; default: - return nullptr; + // Can't optimize. + break; } } } break; default: - return nullptr; + // Can't optimize. + break; + } + + if (conValTree != nullptr) + { + // Were able to optimize, replace as COMMA(side_effects, const value tree); + conValTree->gtVNPair = vnPair; + return optPrepareTreeForReplacement(tree, conValTree); + } + else + { + // Was not able to optimize. + return nullptr; } - return newTree; } /******************************************************************************************************* |