[polly] r264142 - Codegen:Do not invalidate dominator tree when bailing out during code generation
Tobias Grosser via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 22 23:57:51 PDT 2016
Author: grosser
Date: Wed Mar 23 01:57:51 2016
New Revision: 264142
URL: http://llvm.org/viewvc/llvm-project?rev=264142&view=rev
Log:
Codegen:Do not invalidate dominator tree when bailing out during code generation
When codegenerating invariant loads in some rare cases we cannot generate code
and bail out. This change ensures that we maintain a valid dominator tree
in these situations. This fixes llvm.org/PR26736
Contributed-by: Matthias Reisinger <d412vv1n at gmail.com>
Modified:
polly/trunk/lib/CodeGen/CodeGeneration.cpp
polly/trunk/test/Isl/CodeGen/stack-overflow-in-load-hoisting.ll
Modified: polly/trunk/lib/CodeGen/CodeGeneration.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/CodeGen/CodeGeneration.cpp?rev=264142&r1=264141&r2=264142&view=diff
==============================================================================
--- polly/trunk/lib/CodeGen/CodeGeneration.cpp (original)
+++ polly/trunk/lib/CodeGen/CodeGeneration.cpp Wed Mar 23 01:57:51 2016
@@ -110,6 +110,17 @@ public:
}
}
+ /// @brief Mark a basic block unreachable.
+ ///
+ /// Marks the basic block @p Block unreachable by equipping it with an
+ /// UnreachableInst.
+ void markBlockUnreachable(BasicBlock &Block, PollyIRBuilder &Builder) {
+ auto *OrigTerminator = Block.getTerminator();
+ Builder.SetInsertPoint(OrigTerminator);
+ Builder.CreateUnreachable();
+ OrigTerminator->eraseFromParent();
+ }
+
/// @brief Generate LLVM-IR for the SCoP @p S.
bool runOnScop(Scop &S) override {
AI = &getAnalysis<IslAstInfo>();
@@ -146,7 +157,7 @@ public:
// code generating this scop.
BasicBlock *StartBlock =
executeScopConditionally(S, this, Builder.getTrue());
- auto SplitBlock = StartBlock->getSinglePredecessor();
+ auto *SplitBlock = StartBlock->getSinglePredecessor();
// First generate code for the hoisted invariant loads and transitively the
// parameters they reference. Afterwards, for the remaining parameters that
@@ -156,15 +167,26 @@ public:
Builder.SetInsertPoint(SplitBlock->getTerminator());
if (!NodeBuilder.preloadInvariantLoads()) {
+ // Patch the introduced branch condition to ensure that we always execute
+ // the original SCoP.
auto *FalseI1 = Builder.getFalse();
auto *SplitBBTerm = Builder.GetInsertBlock()->getTerminator();
SplitBBTerm->setOperand(0, FalseI1);
- auto *StartBBTerm = StartBlock->getTerminator();
- Builder.SetInsertPoint(StartBBTerm);
- Builder.CreateUnreachable();
- StartBBTerm->eraseFromParent();
- isl_ast_node_free(AstRoot);
+ // Since the other branch is hence ignored we mark it as unreachable and
+ // adjust the dominator tree accordingly.
+ auto *ExitingBlock = StartBlock->getUniqueSuccessor();
+ assert(ExitingBlock);
+ auto *MergeBlock = ExitingBlock->getUniqueSuccessor();
+ assert(MergeBlock);
+ markBlockUnreachable(*StartBlock, Builder);
+ markBlockUnreachable(*ExitingBlock, Builder);
+ auto *ExitingBB = R->getExitingBlock();
+ assert(ExitingBB);
+ DT->changeImmediateDominator(MergeBlock, ExitingBB);
+ DT->eraseNode(ExitingBlock);
+
+ isl_ast_node_free(AstRoot);
} else {
NodeBuilder.addParameters(S.getContext());
Modified: polly/trunk/test/Isl/CodeGen/stack-overflow-in-load-hoisting.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/Isl/CodeGen/stack-overflow-in-load-hoisting.ll?rev=264142&r1=264141&r2=264142&view=diff
==============================================================================
--- polly/trunk/test/Isl/CodeGen/stack-overflow-in-load-hoisting.ll (original)
+++ polly/trunk/test/Isl/CodeGen/stack-overflow-in-load-hoisting.ll Wed Mar 23 01:57:51 2016
@@ -1,4 +1,4 @@
-; RUN: opt %loadPolly -polly-codegen -S < %s | FileCheck %s
+; RUN: opt %loadPolly -verify-dom-info -polly-codegen -S < %s | FileCheck %s
;
; This caused an infinite recursion during invariant load hoisting at some
; point. Check it does not and we add a "false" runtime check.
More information about the llvm-commits
mailing list