From 77da47c87ef4177dcb659119ea5424dcdcb1ccf5 Mon Sep 17 00:00:00 2001 From: SingleAccretion Date: Wed, 14 Jul 2021 12:30:40 +0300 Subject: [PATCH] Use local assertion prop to omit casts on returns When inserting normalizing casts for returns in pre-order morph, "fgMorphCast" was used, which did not account for the fact that local assertion propagation could tell us that the cast is in fact unnecessary. Fix this by calling "fgMorphTree" instead. Also some miscellaneous code cleanup. --- src/coreclr/jit/morph.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/coreclr/jit/morph.cpp b/src/coreclr/jit/morph.cpp index daca2c487e2f05..0988d3911bab17 100644 --- a/src/coreclr/jit/morph.cpp +++ b/src/coreclr/jit/morph.cpp @@ -11478,7 +11478,7 @@ GenTree* Compiler::fgMorphSmpOp(GenTree* tree, MorphAddrContext* mac) case GT_RETURN: // normalize small integer return values - if (fgGlobalMorph && varTypeIsSmall(info.compRetType) && (op1 != nullptr) && (op1->TypeGet() != TYP_VOID) && + if (fgGlobalMorph && varTypeIsSmall(info.compRetType) && (op1 != nullptr) && !op1->TypeIs(TYP_VOID) && fgCastNeeded(op1, info.compRetType)) { // Small-typed return values are normalized by the callee @@ -11487,11 +11487,10 @@ GenTree* Compiler::fgMorphSmpOp(GenTree* tree, MorphAddrContext* mac) // Propagate GTF_COLON_COND op1->gtFlags |= (tree->gtFlags & GTF_COLON_COND); - tree->AsOp()->gtOp1 = fgMorphCast(op1); + tree->AsOp()->gtOp1 = fgMorphTree(op1); // Propagate side effect flags - tree->gtFlags &= ~GTF_ALL_EFFECT; - tree->gtFlags |= (tree->AsOp()->gtOp1->gtFlags & GTF_ALL_EFFECT); + tree->SetAllEffectsFlags(tree->AsOp()->gtGetOp1()); return tree; }