JIT: Allow forward substituting small-typed nodes (#83969)
authorJakob Botsch Nielsen <Jakob.botsch.nielsen@gmail.com>
Tue, 28 Mar 2023 07:07:52 +0000 (09:07 +0200)
committerGitHub <noreply@github.com>
Tue, 28 Mar 2023 07:07:52 +0000 (09:07 +0200)
src/coreclr/jit/forwardsub.cpp

index 5099831..bd1730b 100644 (file)
@@ -675,10 +675,7 @@ bool Compiler::fgForwardSubStatement(Statement* stmt)
     // Next statement seems suitable.
     // See if we can forward sub without changing semantics.
     //
-    // Bail if types disagree.
-    // Might be able to tolerate these by retyping.
-    //
-    if (fsv.GetNode()->TypeGet() != fwdSubNode->TypeGet())
+    if (genActualType(fsv.GetNode()) != genActualType(fwdSubNode))
     {
         JITDUMP(" mismatched types (substitution)\n");
         return false;
@@ -845,12 +842,12 @@ bool Compiler::fgForwardSubStatement(Statement* stmt)
         }
     }
 
-    // If the initial has truncate on store semantics, we need to replicate
-    // that here with a cast.
+    // If the value is being roundtripped through a small-typed local then we
+    // may need to insert an explicit cast to emulate normalize-on-load/store.
     //
-    if (varDsc->lvNormalizeOnStore() && fgCastNeeded(fwdSubNode, varDsc->TypeGet()))
+    if (varTypeIsSmall(varDsc) && fgCastNeeded(fwdSubNode, varDsc->TypeGet()))
     {
-        JITDUMP(" [adding cast for normalize on store]");
+        JITDUMP(" [adding cast for small-typed local]");
         fwdSubNode = gtNewCastNode(TYP_INT, fwdSubNode, false, varDsc->TypeGet());
     }