[llvm] r333072 - [LoopUnswitch] Fix SCEV invalidation in unswitching

Max Kazantsev via llvm-commits llvm-commits at lists.llvm.org
Wed May 23 03:09:53 PDT 2018


Author: mkazantsev
Date: Wed May 23 03:09:53 2018
New Revision: 333072

URL: http://llvm.org/viewvc/llvm-project?rev=333072&view=rev
Log:
[LoopUnswitch] Fix SCEV invalidation in unswitching

Loop unswitching makes substantial changes to a loop that can also affect cached
SCEV info in its outer loops as well, but it only cares to invalidate SCEV cache for the
innermost loop in case of full unswitching and does not invalidate anything at all in
case of trivial unswitching. As result, we may end up with incorrect data in cache.

Differential Revision: https://reviews.llvm.org/D46045
Reviewed By: mzolotukhin

Added:
    llvm/trunk/test/Transforms/LoopUnswitch/invalidate-scev.ll
Modified:
    llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp?rev=333072&r1=333071&r2=333072&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/LoopUnswitch.cpp Wed May 23 03:09:53 2018
@@ -975,6 +975,10 @@ void LoopUnswitch::UnswitchTrivialCondit
                     << " blocks] in Function "
                     << L->getHeader()->getParent()->getName()
                     << " on cond: " << *Val << " == " << *Cond << "\n");
+  // We are going to make essential changes to CFG. This may invalidate cached
+  // information for L or one of its parent loops in SCEV.
+  if (auto *SEWP = getAnalysisIfAvailable<ScalarEvolutionWrapperPass>())
+    SEWP->getSE().forgetTopmostLoop(L);
 
   // First step, split the preheader, so that we know that there is a safe place
   // to insert the conditional branch.  We will change loopPreheader to have a
@@ -1201,8 +1205,10 @@ void LoopUnswitch::UnswitchNontrivialCon
                     << " blocks] in Function " << F->getName() << " when '"
                     << *Val << "' == " << *LIC << "\n");
 
+  // We are going to make essential changes to CFG. This may invalidate cached
+  // information for L or one of its parent loops in SCEV.
   if (auto *SEWP = getAnalysisIfAvailable<ScalarEvolutionWrapperPass>())
-    SEWP->getSE().forgetLoop(L);
+    SEWP->getSE().forgetTopmostLoop(L);
 
   LoopBlocks.clear();
   NewBlocks.clear();

Added: llvm/trunk/test/Transforms/LoopUnswitch/invalidate-scev.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/LoopUnswitch/invalidate-scev.ll?rev=333072&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/LoopUnswitch/invalidate-scev.ll (added)
+++ llvm/trunk/test/Transforms/LoopUnswitch/invalidate-scev.ll Wed May 23 03:09:53 2018
@@ -0,0 +1,33 @@
+; RUN: opt -S -indvars -loop-unswitch < %s | FileCheck %s
+
+target triple = "x86_64-unknown-linux-gnu"
+
+define void @test_01() {
+
+; Make sure we don't fail by SCEV's assertion due to incorrect invalidation.
+; CHECK-LABEL: @test_01
+
+entry:
+  br label %loop
+
+loop:                           ; preds = %backedge, %entry
+  %p_50.addr.0 = phi i16 [ undef, %entry ], [ %add2699, %backedge ]
+  %idxprom2690 = sext i16 %p_50.addr.0 to i32
+  %arrayidx2691 = getelementptr inbounds [5 x i32], [5 x i32]* undef, i32 0, i32 %idxprom2690
+  %0 = load i32, i32* %arrayidx2691, align 1
+  %tobool2692 = icmp ne i32 %0, 0
+  br label %inner_loop
+
+inner_loop:                                     ; preds = %inner_backedge, %loop
+  br i1 %tobool2692, label %backedge, label %inner_backedge
+
+inner_backedge:                                       ; preds = %inner_loop
+  br label %inner_loop
+
+backedge:                                      ; preds = %inner_loop
+  %add2699 = add nsw i16 %p_50.addr.0, 1
+  br i1 false, label %loop, label %exit
+
+exit:               ; preds = %backedge
+  unreachable
+}




More information about the llvm-commits mailing list