From c0aa74fe584a04f8c7c8e81882793a136ee074d9 Mon Sep 17 00:00:00 2001 From: Andy Ayers Date: Mon, 22 Oct 2018 13:14:57 -0700 Subject: JIT: improve simplification of IND(ADDR(x)) (#20508) Some `IND(ADDR(x))` trees were not being optimized to `x` by morph, particularly when `x` was the promoted pointer field of a `Span`. Instead they were creating local fields that blocked enregistration and lead to store-load pairs like: ```asm mov bword ptr [rsp+20H], rax mov rax, bword ptr [rsp+20H] ``` Add logic to `fgMorphSmpOp`'s `GT_IND` clause to recognize and simplify these cases. --- src/jit/morph.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src/jit') diff --git a/src/jit/morph.cpp b/src/jit/morph.cpp index 022bf35152..1f6de01574 100644 --- a/src/jit/morph.cpp +++ b/src/jit/morph.cpp @@ -13066,6 +13066,12 @@ DONE_MORPHING_CHILDREN: tree->gtType = typ = temp->TypeGet(); foldAndReturnTemp = true; } + else if (!varTypeIsStruct(typ) && (lvaTable[lclNum].lvType == typ) && + !lvaTable[lclNum].lvNormalizeOnLoad()) + { + tree->gtType = typ = temp->TypeGet(); + foldAndReturnTemp = true; + } else { // Assumes that when Lookup returns "false" it will leave "fieldSeq" unmodified (i.e. -- cgit v1.2.3