JIT: update bbNums before inverting loops (#80827)
authorAndy Ayers <andya@microsoft.com>
Thu, 19 Jan 2023 15:58:17 +0000 (07:58 -0800)
committerGitHub <noreply@github.com>
Thu, 19 Jan 2023 15:58:17 +0000 (07:58 -0800)
We use the bbNum to decide how to manipulate "in loop" edges when inverting
loops, and this was sometimes misleading as the bbNums did not reflect block
order.

Per the code this is not a correctness issue, but needless redirections can
confuse loop recognition.

Fixes #80809.

src/coreclr/jit/optimizer.cpp

index acb6303..6d27c88 100644 (file)
@@ -5275,26 +5275,29 @@ PhaseStatus Compiler::optInvertLoops()
     }
 #endif // OPT_CONFIG
 
+    bool madeChanges = fgRenumberBlocks();
+
     if (compCodeOpt() == SMALL_CODE)
     {
-        return PhaseStatus::MODIFIED_NOTHING;
+        // do not invert any loops
     }
-
-    bool madeChanges = false; // Assume no changes made
-    for (BasicBlock* const block : Blocks())
+    else
     {
-        // Make sure the appropriate fields are initialized
-        //
-        if (block->bbWeight == BB_ZERO_WEIGHT)
+        for (BasicBlock* const block : Blocks())
         {
-            // Zero weighted block can't have a LOOP_HEAD flag
-            noway_assert(block->isLoopHead() == false);
-            continue;
-        }
+            // Make sure the appropriate fields are initialized
+            //
+            if (block->bbWeight == BB_ZERO_WEIGHT)
+            {
+                // Zero weighted block can't have a LOOP_HEAD flag
+                noway_assert(block->isLoopHead() == false);
+                continue;
+            }
 
-        if (optInvertWhileLoop(block))
-        {
-            madeChanges = true;
+            if (optInvertWhileLoop(block))
+            {
+                madeChanges = true;
+            }
         }
     }