summaryrefslogtreecommitdiff
path: root/polly
diff options
context:
space:
mode:
authorMichael Kruse <llvm@meinersbur.de>2018-08-01 22:28:32 +0000
committerMichael Kruse <llvm@meinersbur.de>2018-08-01 22:28:32 +0000
commit5d1aad06a0e188ef253b8082ad3158f6583451da (patch)
treea59cdf81bd3a864440f78b8deb31ed22bd627651 /polly
parent28a5b700422ff564a78e5ef79e020a36450a82e4 (diff)
[ScopBuilder] Set domain to empty instead of NULL.
The domain generation used nullptr to mark the domain of an error block as never-executed. Later, nullptr domains are recreated with a zero-tuple domain that then mismatches with the expected domain the error block within the loop. Instead of using nullptr, assign an empty domain which preserves the expected space. Remove empty domains during SCoP simplification. Fixes llvm.org/PR38218.
Diffstat (limited to 'polly')
-rw-r--r--polly/include/polly/ScopInfo.h2
-rw-r--r--polly/lib/Analysis/ScopInfo.cpp7
-rw-r--r--polly/test/ScopInfo/pr38218.ll36
3 files changed, 42 insertions, 3 deletions
diff --git a/polly/include/polly/ScopInfo.h b/polly/include/polly/ScopInfo.h
index 1f56c94bebc..c6bf0e5e52e 100644
--- a/polly/include/polly/ScopInfo.h
+++ b/polly/include/polly/ScopInfo.h
@@ -2295,7 +2295,7 @@ private:
void removeFromStmtMap(ScopStmt &Stmt);
/// Removes all statements where the entry block of the statement does not
- /// have a corresponding domain in the domain map.
+ /// have a corresponding domain in the domain map (or it is empty).
void removeStmtNotInDomainMap();
/// Mark arrays that have memory accesses with FortranArrayDescriptor.
diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp
index 489a60b6754..9e8ee9116a9 100644
--- a/polly/lib/Analysis/ScopInfo.cpp
+++ b/polly/lib/Analysis/ScopInfo.cpp
@@ -2615,7 +2615,7 @@ bool Scop::propagateInvalidStmtDomains(
isl::set DomPar = Domain.params();
recordAssumption(ERRORBLOCK, DomPar, BB->getTerminator()->getDebugLoc(),
AS_RESTRICTION);
- Domain = nullptr;
+ Domain = isl::set::empty(Domain.get_space());
}
if (InvalidDomain.is_empty()) {
@@ -3523,7 +3523,10 @@ void Scop::removeStmts(std::function<bool(ScopStmt &)> ShouldDelete,
void Scop::removeStmtNotInDomainMap() {
auto ShouldDelete = [this](ScopStmt &Stmt) -> bool {
- return !this->DomainMap.lookup(Stmt.getEntryBlock());
+ isl::set Domain = DomainMap.lookup(Stmt.getEntryBlock());
+ if (!Domain)
+ return true;
+ return Domain.is_empty();
};
removeStmts(ShouldDelete, false);
}
diff --git a/polly/test/ScopInfo/pr38218.ll b/polly/test/ScopInfo/pr38218.ll
new file mode 100644
index 00000000000..e0506453206
--- /dev/null
+++ b/polly/test/ScopInfo/pr38218.ll
@@ -0,0 +1,36 @@
+; RUN: opt %loadPolly -polly-scops -analyze < %s | FileCheck %s
+;
+; This code causes the SCoP to be rejected because of an ERRORBLOCK
+; assumption and made Polly crash (llvm.org/PR38219).
+;
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+
+define dso_local void @pr38219() {
+start:
+ %tmp1.i.i.i = icmp ne i64** null, null
+ call void @llvm.assume(i1 %tmp1.i.i.i)
+ %tmp1 = extractvalue { [0 x i64*]*, i64 } undef, 0
+ %tmp.i1 = getelementptr inbounds [0 x i64*], [0 x i64*]* %tmp1, i64 0, i64 0
+ br label %bb10.i
+
+bb10.i:
+ %_10.12.i = phi i64** [ %tmp.i1, %start ], [ undef, %_ZN4core3ptr13drop_in_place17hd1d510ec1955c343E.exit.i ]
+ %tmp1.i.i2.i.i.i.i = load i64*, i64** %_10.12.i, align 8
+ store i64 undef, i64* %tmp1.i.i2.i.i.i.i, align 1
+ br label %bb3.i.i.i
+
+bb3.i.i.i:
+ store i64 0, i64* inttoptr (i64 8 to i64*), align 8
+ br label %_ZN4core3ptr13drop_in_place17hd1d510ec1955c343E.exit.i
+
+_ZN4core3ptr13drop_in_place17hd1d510ec1955c343E.exit.i:
+ br i1 false, label %_ZN4core3ptr13drop_in_place17h76d4fbbcbbbe0ba5E.exit, label %bb10.i
+
+_ZN4core3ptr13drop_in_place17h76d4fbbcbbbe0ba5E.exit:
+ ret void
+}
+
+declare void @llvm.assume(i1)
+
+
+; CHECK: Invalid Scop!