Do not align cloned loops (#48090)
authorKunal Pathak <Kunal.Pathak@microsoft.com>
Thu, 11 Feb 2021 07:43:32 +0000 (23:43 -0800)
committerGitHub <noreply@github.com>
Thu, 11 Feb 2021 07:43:32 +0000 (23:43 -0800)
* Do not align cloned loops

src/coreclr/jit/emitxarch.cpp
src/coreclr/jit/optimizer.cpp

index d09ed44..6353d06 100644 (file)
@@ -9223,6 +9223,12 @@ void emitter::emitDispIns(
             break;
 
         case IF_NONE:
+#if FEATURE_LOOP_ALIGN
+            if (ins == INS_align)
+            {
+                printf("[%d bytes]", id->idCodeSize());
+            }
+#endif
             break;
 
         default:
index 5655b60..0cf14f0 100644 (file)
@@ -5319,6 +5319,18 @@ void Compiler::optCloneLoop(unsigned loopInd, LoopCloneContext* context)
         // checked them to guarantee they are clonable.
         bool cloneOk = BasicBlock::CloneBlockState(this, newBlk, blk);
         noway_assert(cloneOk);
+
+#if FEATURE_LOOP_ALIGN
+        // If the original loop is aligned, do not align the cloned loop because cloned loop will be executed in
+        // rare scenario. Additionally, having to align cloned loop will force us to disable some VEX prefix encoding
+        // and adding compensation for over-estimated instructions.
+        if (blk->isLoopAlign())
+        {
+            newBlk->bbFlags &= ~BBF_LOOP_ALIGN;
+            JITDUMP("Removing LOOP_ALIGN flag from cloned loop in " FMT_BB "\n", newBlk->bbNum);
+        }
+#endif
+
         // TODO-Cleanup: The above clones the bbNatLoopNum, which is incorrect.  Eventually, we should probably insert
         // the cloned loop in the loop table.  For now, however, we'll just make these blocks be part of the surrounding
         // loop, if one exists -- the parent of the loop we're cloning.