diff --git a/polly/include/polly/ScopInfo.h b/polly/include/polly/ScopInfo.h index 1f56c94bebc1..c6bf0e5e52e2 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 489a60b6754b..9e8ee9116a93 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 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 000000000000..e0506453206e --- /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!