[polly] r338646 - [ScopBuilder] Set domain to empty instead of NULL.

Michael Kruse via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 1 15:28:32 PDT 2018


Author: meinersbur
Date: Wed Aug  1 15:28:32 2018
New Revision: 338646

URL: http://llvm.org/viewvc/llvm-project?rev=338646&view=rev
Log:
[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.

Added:
    polly/trunk/test/ScopInfo/pr38218.ll
Modified:
    polly/trunk/include/polly/ScopInfo.h
    polly/trunk/lib/Analysis/ScopInfo.cpp

Modified: polly/trunk/include/polly/ScopInfo.h
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/ScopInfo.h?rev=338646&r1=338645&r2=338646&view=diff
==============================================================================
--- polly/trunk/include/polly/ScopInfo.h (original)
+++ polly/trunk/include/polly/ScopInfo.h Wed Aug  1 15:28:32 2018
@@ -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.

Modified: polly/trunk/lib/Analysis/ScopInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopInfo.cpp?rev=338646&r1=338645&r2=338646&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopInfo.cpp (original)
+++ polly/trunk/lib/Analysis/ScopInfo.cpp Wed Aug  1 15:28:32 2018
@@ -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<boo
 
 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);
 }

Added: polly/trunk/test/ScopInfo/pr38218.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/pr38218.ll?rev=338646&view=auto
==============================================================================
--- polly/trunk/test/ScopInfo/pr38218.ll (added)
+++ polly/trunk/test/ScopInfo/pr38218.ll Wed Aug  1 15:28:32 2018
@@ -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!




More information about the llvm-commits mailing list