[llvm] r317084 - [CodeExtractor] Fix iterator invalidation in findOrCreateBlockForHoisting.

Florian Hahn via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 1 02:48:12 PDT 2017


Author: fhahn
Date: Wed Nov  1 02:48:12 2017
New Revision: 317084

URL: http://llvm.org/viewvc/llvm-project?rev=317084&view=rev
Log:
[CodeExtractor] Fix iterator invalidation in findOrCreateBlockForHoisting.

Summary:
By replacing branches to CommonExitBlock, we remove the node from
CommonExitBlock's predecessors, invalidating the iterator. The problem
is exposed when the common exit block has multiple predecessors and
needs to sink lifetime info. The modification in the test case trigger
the issue.

Reviewers: davidxl, davide, wmi

Reviewed By: davidxl

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D39112

Modified:
    llvm/trunk/lib/Transforms/Utils/CodeExtractor.cpp
    llvm/trunk/test/Transforms/CodeExtractor/live_shrink_hoist.ll

Modified: llvm/trunk/lib/Transforms/Utils/CodeExtractor.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/CodeExtractor.cpp?rev=317084&r1=317083&r2=317084&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/CodeExtractor.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/CodeExtractor.cpp Wed Nov  1 02:48:12 2017
@@ -307,7 +307,9 @@ CodeExtractor::findOrCreateBlockForHoist
   BasicBlock *NewExitBlock = CommonExitBlock->splitBasicBlock(
       CommonExitBlock->getFirstNonPHI()->getIterator());
 
-  for (auto *Pred : predecessors(CommonExitBlock)) {
+  for (auto PI = pred_begin(CommonExitBlock), PE = pred_end(CommonExitBlock);
+       PI != PE;) {
+    BasicBlock *Pred = *PI++;
     if (Blocks.count(Pred))
       continue;
     Pred->getTerminator()->replaceUsesOfWith(CommonExitBlock, NewExitBlock);

Modified: llvm/trunk/test/Transforms/CodeExtractor/live_shrink_hoist.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/CodeExtractor/live_shrink_hoist.ll?rev=317084&r1=317083&r2=317084&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/CodeExtractor/live_shrink_hoist.ll (original)
+++ llvm/trunk/test/Transforms/CodeExtractor/live_shrink_hoist.ll Wed Nov  1 02:48:12 2017
@@ -1,4 +1,4 @@
-; RUN: opt -S -partial-inliner -max-num-inline-blocks=2 -skip-partial-inlining-cost-analysis  < %s |   FileCheck %s
+; RUN: opt -S -partial-inliner -max-num-inline-blocks=3 -skip-partial-inlining-cost-analysis  < %s |   FileCheck %s
 ; RUN: opt -S -passes=partial-inliner -max-num-inline-blocks=2  -skip-partial-inlining-cost-analysis < %s   | FileCheck %s
 
 %class.A = type { i32 }
@@ -16,6 +16,10 @@ bb:
   br i1 %tmp3, label %bb4, label %bb9
 
 bb4:                                              ; preds = %bb
+  %foo = icmp eq i32 %tmp2, 0
+  br i1 %foo, label %bb5, label %bb9
+
+bb5:                                              ; preds = %bb4
   call void @_ZN1A7memfuncEv(%class.A* nonnull %tmp)
   %tmp5 = getelementptr inbounds %class.A, %class.A* %tmp, i64 0, i32 0
   %tmp6 = load i32, i32* %tmp5, align 4, !tbaa !6




More information about the llvm-commits mailing list