[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