[Polly] Switch DT/LI in RegionGenerator for parallel subfn (#120413)
The patch #102460 already implements separate DT/LI/SE for parallel sub
function. Crashes have been reported while region generator tries using
oringinal function's DT while creating new parallel sub function due to
checks in #101198. This patch aims at fixing those cases by switching
the DT/LI while generating parallel function using Region Generator.
Fixes #117877
GitOrigin-RevId: 49668d5efef19402effdad4d4d1d17732a1c6fdb
diff --git a/include/polly/CodeGen/BlockGenerators.h b/include/polly/CodeGen/BlockGenerators.h
index 4e26454..401e80e 100644
--- a/include/polly/CodeGen/BlockGenerators.h
+++ b/include/polly/CodeGen/BlockGenerators.h
@@ -632,7 +632,7 @@
};
/// Generator for new versions of polyhedral region statements.
-class RegionGenerator final : BlockGenerator {
+class RegionGenerator final : public BlockGenerator {
public:
/// Create a generator for regions.
///
diff --git a/lib/CodeGen/BlockGenerators.cpp b/lib/CodeGen/BlockGenerators.cpp
index b76d8f4..6d723d6 100644
--- a/lib/CodeGen/BlockGenerators.cpp
+++ b/lib/CodeGen/BlockGenerators.cpp
@@ -1000,7 +1000,7 @@
BasicBlock *BBCopyIDom = EndBlockMap.lookup(BBIDom);
if (BBCopyIDom)
- DT.changeImmediateDominator(BBCopy, BBCopyIDom);
+ GenDT->changeImmediateDominator(BBCopy, BBCopyIDom);
return StartBlockMap.lookup(BBIDom);
}
@@ -1069,8 +1069,8 @@
// Create a dedicated entry for the region where we can reload all demoted
// inputs.
BasicBlock *EntryBB = R->getEntry();
- BasicBlock *EntryBBCopy = SplitBlock(Builder.GetInsertBlock(),
- &*Builder.GetInsertPoint(), &DT, &LI);
+ BasicBlock *EntryBBCopy = SplitBlock(
+ Builder.GetInsertBlock(), &*Builder.GetInsertPoint(), GenDT, GenLI);
EntryBBCopy->setName("polly.stmt." + EntryBB->getName() + ".entry");
Builder.SetInsertPoint(&EntryBBCopy->front());
@@ -1136,7 +1136,7 @@
// Now create a new dedicated region exit block and add it to the region map.
BasicBlock *ExitBBCopy = SplitBlock(Builder.GetInsertBlock(),
- &*Builder.GetInsertPoint(), &DT, &LI);
+ &*Builder.GetInsertPoint(), GenDT, GenLI);
ExitBBCopy->setName("polly.stmt." + R->getExit()->getName() + ".exit");
StartBlockMap[R->getExit()] = ExitBBCopy;
EndBlockMap[R->getExit()] = ExitBBCopy;
@@ -1145,7 +1145,7 @@
assert(ExitDomBBCopy &&
"Common exit dominator must be within region; at least the entry node "
"must match");
- DT.changeImmediateDominator(ExitBBCopy, ExitDomBBCopy);
+ GenDT->changeImmediateDominator(ExitBBCopy, ExitDomBBCopy);
// As the block generator doesn't handle control flow we need to add the
// region control flow by hand after all blocks have been copied.
diff --git a/lib/CodeGen/IslNodeBuilder.cpp b/lib/CodeGen/IslNodeBuilder.cpp
index d76f625..739bd63 100644
--- a/lib/CodeGen/IslNodeBuilder.cpp
+++ b/lib/CodeGen/IslNodeBuilder.cpp
@@ -612,6 +612,7 @@
GenLI = SubLI;
GenSE = SubSE.get();
BlockGen.switchGeneratedFunc(SubFn, GenDT, GenLI, GenSE);
+ RegionGen.switchGeneratedFunc(SubFn, GenDT, GenLI, GenSE);
ExprBuilder.switchGeneratedFunc(SubFn, GenDT, GenLI, GenSE);
Builder.SetInsertPoint(&*LoopBody);
@@ -681,6 +682,7 @@
IDToValue = std::move(IDToValueCopy);
ValueMap = std::move(CallerGlobals);
ExprBuilder.switchGeneratedFunc(CallerFn, CallerDT, CallerLI, CallerSE);
+ RegionGen.switchGeneratedFunc(CallerFn, CallerDT, CallerLI, CallerSE);
BlockGen.switchGeneratedFunc(CallerFn, CallerDT, CallerLI, CallerSE);
Builder.SetInsertPoint(&*AfterLoop);
diff --git a/test/CodeGen/reggen_domtree_crash.ll b/test/CodeGen/reggen_domtree_crash.ll
new file mode 100644
index 0000000..58c2709
--- /dev/null
+++ b/test/CodeGen/reggen_domtree_crash.ll
@@ -0,0 +1,41 @@
+; RUN: opt %loadNPMPolly -passes=polly-codegen -polly-parallel -S < %s | FileCheck %s
+
+; CHECK: define ptr @ham(ptr %arg, i64 %arg1, i1 %arg2)
+
+; This test is added to verify if the following IR does not crash on using different Dominator Tree when using polly parallel flag.
+
+; ModuleID = '<stdin>'
+source_filename = "<stdin>"
+
+define ptr @ham(ptr %arg, i64 %arg1, i1 %arg2) {
+bb:
+ br label %bb3
+
+bb3: ; preds = %bb8, %bb
+ %phi = phi i64 [ 0, %bb ], [ %add9, %bb8 ]
+ %getelementptr = getelementptr [64 x i16], ptr %arg, i64 %phi
+ br label %bb4
+
+bb4: ; preds = %bb7, %bb3
+ %phi5 = phi i64 [ %add, %bb7 ], [ 0, %bb3 ]
+ %load = load i16, ptr null, align 2
+ br i1 %arg2, label %bb7, label %bb6
+
+bb6: ; preds = %bb4
+ store i16 0, ptr %getelementptr, align 2
+ br label %bb7
+
+bb7: ; preds = %bb6, %bb4
+ %add = add i64 %phi5, 1
+ %icmp = icmp ne i64 %phi5, 64
+ br i1 %icmp, label %bb4, label %bb8
+
+bb8: ; preds = %bb7
+ %add9 = add i64 %phi, 1
+ %icmp10 = icmp ult i64 %phi, %arg1
+ br i1 %icmp10, label %bb3, label %bb11
+
+bb11: ; preds = %bb8
+ ret ptr null
+}
+