Check more patterns for retBuffer. (#40340)
authorSergey Andreenko <seandree@microsoft.com>
Thu, 6 Aug 2020 07:57:33 +0000 (00:57 -0700)
committerGitHub <noreply@github.com>
Thu, 6 Aug 2020 07:57:33 +0000 (00:57 -0700)
* Check more patterns for retBuffer.

We force return buffers containing GC pointers to be on the stack and before we make a copy we check if the return buffer is already on the stack. Fix the check by adding `LCL_VAR_ADDR`, `ADD(LCL_VAR_ADDR, CNST)` patterns.

* Clear `EnableExtraSuperPmiQueries` during SPMI replay.

It is set during collection for easier test of struct promotion enhancements but it could let to chk/rel diffs if used during replay.

src/coreclr/scripts/superpmi.py
src/coreclr/src/jit/morph.cpp

index 377af07..12be260 100755 (executable)
@@ -860,7 +860,8 @@ class SuperPMIReplay:
             altjit_string = "*" if self.coreclr_args.altjit else ""
             altjit_flags = [
                 "-jitoption", "force", "AltJit=" + altjit_string,
-                "-jitoption", "force", "AltJitNgen=" + altjit_string
+                "-jitoption", "force", "AltJitNgen=" + altjit_string,
+                "-jitoption", "force", "EnableExtraSuperPmiQueries=0"
             ]
             flags += altjit_flags
 
@@ -1032,8 +1033,10 @@ class SuperPMIReplayAsmDiffs:
                 altjit_flags = [
                     "-jitoption", "force", "AltJit=" + altjit_string,
                     "-jitoption", "force", "AltJitNgen=" + altjit_string,
+                    "-jitoption", "force", "EnableExtraSuperPmiQueries=0",
                     "-jit2option", "force", "AltJit=" + altjit_string,
-                    "-jit2option", "force", "AltJitNgen=" + altjit_string
+                    "-jit2option", "force", "AltJitNgen=" + altjit_string,
+                    "-jit2option", "force", "EnableExtraSuperPmiQueries=0"
                 ]
                 flags += altjit_flags
 
@@ -1208,7 +1211,8 @@ class SuperPMIReplayAsmDiffs:
                 altjit_string = "*" if self.coreclr_args.altjit else ""
                 altjit_flags = [
                     "-jitoption", "force", "AltJit=" + altjit_string,
-                    "-jitoption", "force", "AltJitNgen=" + altjit_string
+                    "-jitoption", "force", "AltJitNgen=" + altjit_string,
+                    "-jitoption", "force", "EnableExtraSuperPmiQueries=0"
                 ]
 
                 async def create_asm(print_prefix, item, self, text_differences, base_asm_location, diff_asm_location):
index d5cf8a8..61ad993 100644 (file)
@@ -8946,7 +8946,7 @@ GenTree* Compiler::fgMorphCall(GenTreeCall* call)
 
         GenTree* dest = call->gtCallArgs->GetNode();
         assert(dest->OperGet() != GT_ARGPLACE); // If it was, we'd be in a remorph, which we've already excluded above.
-        if (dest->gtType == TYP_BYREF && !(dest->OperGet() == GT_ADDR && dest->AsOp()->gtOp1->OperGet() == GT_LCL_VAR))
+        if (dest->TypeIs(TYP_BYREF) && !dest->IsLocalAddrExpr())
         {
             // We'll exempt helper calls from this, assuming that the helper implementation
             // follows the old convention, and does whatever barrier is required.