Revert "[Polly][Isl] Removing nullptr constructor from C++ bindings. NFC."

This reverts commit be5e2fc7bf781c7fc079943552ea1b519f45c815.

This introduced a building error for polly. https://lab.llvm.org/buildbot#builders/10/builds/4951

GitOrigin-RevId: f60ea691a94b3b4c28f2ff85a4520562f4110810
diff --git a/include/polly/ScopInfo.h b/include/polly/ScopInfo.h
index 289d1f2..559744a 100644
--- a/include/polly/ScopInfo.h
+++ b/include/polly/ScopInfo.h
@@ -1788,7 +1788,7 @@
   DenseMap<BasicBlock *, isl::set> DomainMap;
 
   /// Constraints on parameters.
-  isl::set Context;
+  isl::set Context = nullptr;
 
   /// The affinator used to translate SCEVs to isl expressions.
   SCEVAffinator Affinator;
@@ -1883,7 +1883,7 @@
   /// set of statement instances that will be scheduled in a subtree. There
   /// are also several other nodes. A full description of the different nodes
   /// in a schedule tree is given in the isl manual.
-  isl::schedule Schedule;
+  isl::schedule Schedule = nullptr;
 
   /// Is this Scop marked as not to be transformed by an optimization heuristic?
   bool HasDisableHeuristicsHint = false;
diff --git a/lib/Analysis/ScopBuilder.cpp b/lib/Analysis/ScopBuilder.cpp
index 38e257f..bf6bd19 100644
--- a/lib/Analysis/ScopBuilder.cpp
+++ b/lib/Analysis/ScopBuilder.cpp
@@ -750,7 +750,7 @@
 
     isl::set LatchBBDom = scop->getDomainConditions(LatchBB);
 
-    isl::set BackedgeCondition;
+    isl::set BackedgeCondition = nullptr;
 
     Instruction *TI = LatchBB->getTerminator();
     BranchInst *BI = dyn_cast<BranchInst>(TI);
@@ -823,7 +823,7 @@
 
     ClassRep = LInst;
     scop->addInvariantEquivClass(
-        InvariantEquivClassTy{PointerSCEV, MemoryAccessList(), {}, Ty});
+        InvariantEquivClassTy{PointerSCEV, MemoryAccessList(), nullptr, Ty});
   }
 }
 
@@ -1175,7 +1175,7 @@
 
 void ScopBuilder::buildSchedule() {
   Loop *L = getLoopSurroundingScop(*scop, LI);
-  LoopStackTy LoopStack({LoopStackElementTy(L, {}, 0)});
+  LoopStackTy LoopStack({LoopStackElementTy(L, nullptr, 0)});
   buildSchedule(scop->getRegion().getNode(), LoopStack);
   assert(LoopStack.size() == 1 && LoopStack.back().L == L);
   scop->setScheduleTree(LoopStack[0].Schedule);
@@ -1243,7 +1243,7 @@
         DelayList.push_back(RN);
         continue;
       }
-      LoopStack.push_back({L, {}, 0});
+      LoopStack.push_back({L, nullptr, 0});
     }
     buildSchedule(RN, LoopStack);
   }
@@ -2911,7 +2911,7 @@
 
   if (Access->isScalarKind() || Access->isWrite() || !Access->isAffine() ||
       Access->isMemoryIntrinsic())
-    return {};
+    return nullptr;
 
   // Skip accesses that have an invariant base pointer which is defined but
   // not loaded inside the SCoP. This can happened e.g., if a readnone call
@@ -2924,13 +2924,13 @@
   // outside the region.
   auto *LI = cast<LoadInst>(Access->getAccessInstruction());
   if (hasNonHoistableBasePtrInScop(Access, Writes))
-    return {};
+    return nullptr;
 
   isl::map AccessRelation = Access->getAccessRelation();
   assert(!AccessRelation.is_empty());
 
   if (AccessRelation.involves_dims(isl::dim::in, 0, Stmt.getNumIterators()))
-    return {};
+    return nullptr;
 
   AccessRelation = AccessRelation.intersect_domain(Stmt.getDomain());
   isl::set SafeToLoad;
@@ -2942,13 +2942,13 @@
   } else if (BB != LI->getParent()) {
     // Skip accesses in non-affine subregions as they might not be executed
     // under the same condition as the entry of the non-affine subregion.
-    return {};
+    return nullptr;
   } else {
     SafeToLoad = AccessRelation.range();
   }
 
   if (isAccessRangeTooComplex(AccessRelation.range()))
-    return {};
+    return nullptr;
 
   isl::union_map Written = Writes.intersect_range(SafeToLoad);
   isl::set WrittenCtx = Written.params();
@@ -2960,7 +2960,7 @@
   WrittenCtx = WrittenCtx.remove_divs();
   bool TooComplex = WrittenCtx.n_basic_set() >= MaxDisjunctsInDomain;
   if (TooComplex || !isRequiredInvariantLoad(LI))
-    return {};
+    return nullptr;
 
   scop->addAssumption(INVARIANTLOAD, WrittenCtx, LI->getDebugLoc(),
                       AS_RESTRICTION, LI->getParent());
diff --git a/lib/Analysis/ScopInfo.cpp b/lib/Analysis/ScopInfo.cpp
index fcc852b..ba52930 100644
--- a/lib/Analysis/ScopInfo.cpp
+++ b/lib/Analysis/ScopInfo.cpp
@@ -348,7 +348,7 @@
   DimensionSizesPw.clear();
   for (const SCEV *Expr : DimensionSizes) {
     if (!Expr) {
-      DimensionSizesPw.push_back(isl::pw_aff());
+      DimensionSizesPw.push_back(nullptr);
       continue;
     }
     isl::pw_aff Size = S.getPwAffOnly(Expr);
@@ -889,12 +889,12 @@
                            ArrayRef<const SCEV *> Subscripts,
                            ArrayRef<const SCEV *> Sizes, Value *AccessValue,
                            MemoryKind Kind)
-    : Kind(Kind), AccType(AccType), Statement(Stmt), InvalidDomain(),
+    : Kind(Kind), AccType(AccType), Statement(Stmt), InvalidDomain(nullptr),
       BaseAddr(BaseAddress), ElementType(ElementType),
       Sizes(Sizes.begin(), Sizes.end()), AccessInstruction(AccessInst),
       AccessValue(AccessValue), IsAffine(Affine),
-      Subscripts(Subscripts.begin(), Subscripts.end()), AccessRelation(),
-      NewAccessRelation(), FAD(nullptr) {
+      Subscripts(Subscripts.begin(), Subscripts.end()), AccessRelation(nullptr),
+      NewAccessRelation(nullptr), FAD(nullptr) {
   static const std::string TypeStrings[] = {"", "_Read", "_Write", "_MayWrite"};
   const std::string Access = TypeStrings[AccType] + utostr(Stmt->size());
 
@@ -904,8 +904,8 @@
 
 MemoryAccess::MemoryAccess(ScopStmt *Stmt, AccessType AccType, isl::map AccRel)
     : Kind(MemoryKind::Array), AccType(AccType), Statement(Stmt),
-      InvalidDomain(), AccessRelation(), NewAccessRelation(AccRel),
-      FAD(nullptr) {
+      InvalidDomain(nullptr), AccessRelation(nullptr),
+      NewAccessRelation(AccRel), FAD(nullptr) {
   isl::id ArrayInfoId = NewAccessRelation.get_tuple_id(isl::dim::out);
   auto *SAI = ScopArrayInfo::getFromId(ArrayInfoId);
   Sizes.push_back(nullptr);
@@ -1133,7 +1133,7 @@
     return isl::map::from_aff(isl::aff(isl::local_space(getDomainSpace())));
   auto Schedule = getParent()->getSchedule();
   if (!Schedule)
-    return {};
+    return nullptr;
   Schedule = Schedule.intersect_domain(isl::union_set(Domain));
   if (Schedule.is_empty())
     return isl::map::from_aff(isl::aff(isl::local_space(getDomainSpace())));
@@ -1203,19 +1203,21 @@
 ScopStmt::ScopStmt(Scop &parent, Region &R, StringRef Name,
                    Loop *SurroundingLoop,
                    std::vector<Instruction *> EntryBlockInstructions)
-    : Parent(parent), InvalidDomain(), Domain(), R(&R), Build(), BaseName(Name),
-      SurroundingLoop(SurroundingLoop), Instructions(EntryBlockInstructions) {}
+    : Parent(parent), InvalidDomain(nullptr), Domain(nullptr), R(&R),
+      Build(nullptr), BaseName(Name), SurroundingLoop(SurroundingLoop),
+      Instructions(EntryBlockInstructions) {}
 
 ScopStmt::ScopStmt(Scop &parent, BasicBlock &bb, StringRef Name,
                    Loop *SurroundingLoop,
                    std::vector<Instruction *> Instructions)
-    : Parent(parent), InvalidDomain(), Domain(), BB(&bb), Build(),
-      BaseName(Name), SurroundingLoop(SurroundingLoop),
+    : Parent(parent), InvalidDomain(nullptr), Domain(nullptr), BB(&bb),
+      Build(nullptr), BaseName(Name), SurroundingLoop(SurroundingLoop),
       Instructions(Instructions) {}
 
 ScopStmt::ScopStmt(Scop &parent, isl::map SourceRel, isl::map TargetRel,
                    isl::set NewDomain)
-    : Parent(parent), InvalidDomain(), Domain(NewDomain), Build() {
+    : Parent(parent), InvalidDomain(nullptr), Domain(NewDomain),
+      Build(nullptr) {
   BaseName = getIslCompatibleName("CopyStmt_", "",
                                   std::to_string(parent.getCopyStmtsNum()));
   isl::id Id = isl::id::alloc(getIslCtx(), getBaseName(), this);
@@ -2149,7 +2151,7 @@
     simplify(DefinedBehaviorContext);
     if (DefinedBehaviorContext.n_basic_set() >
         MaxDisjunktsInDefinedBehaviourContext)
-      DefinedBehaviorContext = {};
+      DefinedBehaviorContext = nullptr;
   }
 }
 
diff --git a/lib/CodeGen/IslAst.cpp b/lib/CodeGen/IslAst.cpp
index 38daa19..cf63a59 100644
--- a/lib/CodeGen/IslAst.cpp
+++ b/lib/CodeGen/IslAst.cpp
@@ -623,7 +623,7 @@
 isl::union_map IslAstInfo::getSchedule(const isl::ast_node &Node) {
   IslAstUserPayload *Payload = getNodePayload(Node);
   if (!Payload)
-    return {};
+    return nullptr;
 
   isl::ast_build Build = isl::manage_copy(Payload->Build);
   return Build.get_schedule();
@@ -632,7 +632,7 @@
 isl::pw_aff
 IslAstInfo::getMinimalDependenceDistance(const isl::ast_node &Node) {
   IslAstUserPayload *Payload = getNodePayload(Node);
-  return Payload ? Payload->MinimalDependenceDistance : isl::pw_aff();
+  return Payload ? Payload->MinimalDependenceDistance : nullptr;
 }
 
 IslAstInfo::MemoryAccessSet *
diff --git a/lib/External/isl/include/isl/isl-noexceptions.h b/lib/External/isl/include/isl/isl-noexceptions.h
index 7232d4e..9bbb464 100644
--- a/lib/External/isl/include/isl/isl-noexceptions.h
+++ b/lib/External/isl/include/isl/isl-noexceptions.h
@@ -236,6 +236,7 @@
 public:
   inline /* implicit */ aff();
   inline /* implicit */ aff(const aff &obj);
+  inline /* implicit */ aff(std::nullptr_t);
   inline explicit aff(ctx ctx, const std::string &str);
   inline explicit aff(local_space ls, val val);
   inline explicit aff(local_space ls);
@@ -342,6 +343,7 @@
 public:
   inline /* implicit */ aff_list();
   inline /* implicit */ aff_list(const aff_list &obj);
+  inline /* implicit */ aff_list(std::nullptr_t);
   inline aff_list &operator=(aff_list obj);
   inline ~aff_list();
   inline __isl_give isl_aff_list *copy() const &;
@@ -386,6 +388,7 @@
 public:
   inline /* implicit */ ast_build();
   inline /* implicit */ ast_build(const ast_build &obj);
+  inline /* implicit */ ast_build(std::nullptr_t);
   inline explicit ast_build(ctx ctx);
   inline ast_build &operator=(ast_build obj);
   inline ~ast_build();
@@ -427,6 +430,7 @@
 public:
   inline /* implicit */ ast_expr();
   inline /* implicit */ ast_expr(const ast_expr &obj);
+  inline /* implicit */ ast_expr(std::nullptr_t);
   inline ast_expr &operator=(ast_expr obj);
   inline ~ast_expr();
   inline __isl_give isl_ast_expr *copy() const &;
@@ -485,6 +489,7 @@
 public:
   inline /* implicit */ ast_expr_list();
   inline /* implicit */ ast_expr_list(const ast_expr_list &obj);
+  inline /* implicit */ ast_expr_list(std::nullptr_t);
   inline ast_expr_list &operator=(ast_expr_list obj);
   inline ~ast_expr_list();
   inline __isl_give isl_ast_expr_list *copy() const &;
@@ -529,6 +534,7 @@
 public:
   inline /* implicit */ ast_node();
   inline /* implicit */ ast_node(const ast_node &obj);
+  inline /* implicit */ ast_node(std::nullptr_t);
   inline ast_node &operator=(ast_node obj);
   inline ~ast_node();
   inline __isl_give isl_ast_node *copy() const &;
@@ -579,6 +585,7 @@
 public:
   inline /* implicit */ ast_node_list();
   inline /* implicit */ ast_node_list(const ast_node_list &obj);
+  inline /* implicit */ ast_node_list(std::nullptr_t);
   inline ast_node_list &operator=(ast_node_list obj);
   inline ~ast_node_list();
   inline __isl_give isl_ast_node_list *copy() const &;
@@ -623,6 +630,7 @@
 public:
   inline /* implicit */ basic_map();
   inline /* implicit */ basic_map(const basic_map &obj);
+  inline /* implicit */ basic_map(std::nullptr_t);
   inline explicit basic_map(ctx ctx, const std::string &str);
   inline basic_map &operator=(basic_map obj);
   inline ~basic_map();
@@ -757,6 +765,7 @@
 public:
   inline /* implicit */ basic_map_list();
   inline /* implicit */ basic_map_list(const basic_map_list &obj);
+  inline /* implicit */ basic_map_list(std::nullptr_t);
   inline basic_map_list &operator=(basic_map_list obj);
   inline ~basic_map_list();
   inline __isl_give isl_basic_map_list *copy() const &;
@@ -801,6 +810,7 @@
 public:
   inline /* implicit */ basic_set();
   inline /* implicit */ basic_set(const basic_set &obj);
+  inline /* implicit */ basic_set(std::nullptr_t);
   inline /* implicit */ basic_set(point pnt);
   inline explicit basic_set(ctx ctx, const std::string &str);
   inline basic_set &operator=(basic_set obj);
@@ -907,6 +917,7 @@
 public:
   inline /* implicit */ basic_set_list();
   inline /* implicit */ basic_set_list(const basic_set_list &obj);
+  inline /* implicit */ basic_set_list(std::nullptr_t);
   inline basic_set_list &operator=(basic_set_list obj);
   inline ~basic_set_list();
   inline __isl_give isl_basic_set_list *copy() const &;
@@ -952,6 +963,7 @@
 public:
   inline /* implicit */ constraint();
   inline /* implicit */ constraint(const constraint &obj);
+  inline /* implicit */ constraint(std::nullptr_t);
   inline constraint &operator=(constraint obj);
   inline ~constraint();
   inline __isl_give isl_constraint *copy() const &;
@@ -1000,6 +1012,7 @@
 public:
   inline /* implicit */ constraint_list();
   inline /* implicit */ constraint_list(const constraint_list &obj);
+  inline /* implicit */ constraint_list(std::nullptr_t);
   inline constraint_list &operator=(constraint_list obj);
   inline ~constraint_list();
   inline __isl_give isl_constraint_list *copy() const &;
@@ -1044,6 +1057,7 @@
 public:
   inline /* implicit */ fixed_box();
   inline /* implicit */ fixed_box(const fixed_box &obj);
+  inline /* implicit */ fixed_box(std::nullptr_t);
   inline fixed_box &operator=(fixed_box obj);
   inline ~fixed_box();
   inline __isl_give isl_fixed_box *copy() const &;
@@ -1077,6 +1091,7 @@
 public:
   inline /* implicit */ id();
   inline /* implicit */ id(const id &obj);
+  inline /* implicit */ id(std::nullptr_t);
   inline explicit id(ctx ctx, const std::string &str);
   inline id &operator=(id obj);
   inline ~id();
@@ -1111,6 +1126,7 @@
 public:
   inline /* implicit */ id_list();
   inline /* implicit */ id_list(const id_list &obj);
+  inline /* implicit */ id_list(std::nullptr_t);
   inline id_list &operator=(id_list obj);
   inline ~id_list();
   inline __isl_give isl_id_list *copy() const &;
@@ -1155,6 +1171,7 @@
 public:
   inline /* implicit */ id_to_ast_expr();
   inline /* implicit */ id_to_ast_expr(const id_to_ast_expr &obj);
+  inline /* implicit */ id_to_ast_expr(std::nullptr_t);
   inline id_to_ast_expr &operator=(id_to_ast_expr obj);
   inline ~id_to_ast_expr();
   inline __isl_give isl_id_to_ast_expr *copy() const &;
@@ -1189,6 +1206,7 @@
 public:
   inline /* implicit */ local_space();
   inline /* implicit */ local_space(const local_space &obj);
+  inline /* implicit */ local_space(std::nullptr_t);
   inline explicit local_space(space space);
   inline local_space &operator=(local_space obj);
   inline ~local_space();
@@ -1242,6 +1260,7 @@
 public:
   inline /* implicit */ map();
   inline /* implicit */ map(const map &obj);
+  inline /* implicit */ map(std::nullptr_t);
   inline /* implicit */ map(basic_map bmap);
   inline explicit map(ctx ctx, const std::string &str);
   inline map &operator=(map obj);
@@ -1458,6 +1477,7 @@
 public:
   inline /* implicit */ map_list();
   inline /* implicit */ map_list(const map_list &obj);
+  inline /* implicit */ map_list(std::nullptr_t);
   inline map_list &operator=(map_list obj);
   inline ~map_list();
   inline __isl_give isl_map_list *copy() const &;
@@ -1502,6 +1522,7 @@
 public:
   inline /* implicit */ mat();
   inline /* implicit */ mat(const mat &obj);
+  inline /* implicit */ mat(std::nullptr_t);
   inline mat &operator=(mat obj);
   inline ~mat();
   inline __isl_give isl_mat *copy() const &;
@@ -1570,6 +1591,7 @@
 public:
   inline /* implicit */ multi_aff();
   inline /* implicit */ multi_aff(const multi_aff &obj);
+  inline /* implicit */ multi_aff(std::nullptr_t);
   inline /* implicit */ multi_aff(aff aff);
   inline explicit multi_aff(space space, aff_list list);
   inline explicit multi_aff(ctx ctx, const std::string &str);
@@ -1677,6 +1699,7 @@
 public:
   inline /* implicit */ multi_id();
   inline /* implicit */ multi_id(const multi_id &obj);
+  inline /* implicit */ multi_id(std::nullptr_t);
   inline explicit multi_id(space space, id_list list);
   inline explicit multi_id(ctx ctx, const std::string &str);
   inline multi_id &operator=(multi_id obj);
@@ -1728,6 +1751,7 @@
 public:
   inline /* implicit */ multi_pw_aff();
   inline /* implicit */ multi_pw_aff(const multi_pw_aff &obj);
+  inline /* implicit */ multi_pw_aff(std::nullptr_t);
   inline /* implicit */ multi_pw_aff(aff aff);
   inline /* implicit */ multi_pw_aff(multi_aff ma);
   inline /* implicit */ multi_pw_aff(pw_aff pa);
@@ -1846,6 +1870,7 @@
 public:
   inline /* implicit */ multi_union_pw_aff();
   inline /* implicit */ multi_union_pw_aff(const multi_union_pw_aff &obj);
+  inline /* implicit */ multi_union_pw_aff(std::nullptr_t);
   inline /* implicit */ multi_union_pw_aff(multi_pw_aff mpa);
   inline /* implicit */ multi_union_pw_aff(union_pw_aff upa);
   inline explicit multi_union_pw_aff(space space, union_pw_aff_list list);
@@ -1945,6 +1970,7 @@
 public:
   inline /* implicit */ multi_val();
   inline /* implicit */ multi_val(const multi_val &obj);
+  inline /* implicit */ multi_val(std::nullptr_t);
   inline explicit multi_val(space space, val_list list);
   inline explicit multi_val(ctx ctx, const std::string &str);
   inline multi_val &operator=(multi_val obj);
@@ -2029,6 +2055,7 @@
 public:
   inline /* implicit */ point();
   inline /* implicit */ point(const point &obj);
+  inline /* implicit */ point(std::nullptr_t);
   inline explicit point(space dim);
   inline point &operator=(point obj);
   inline ~point();
@@ -2065,6 +2092,7 @@
 public:
   inline /* implicit */ pw_aff();
   inline /* implicit */ pw_aff(const pw_aff &obj);
+  inline /* implicit */ pw_aff(std::nullptr_t);
   inline /* implicit */ pw_aff(aff aff);
   inline explicit pw_aff(ctx ctx, const std::string &str);
   inline explicit pw_aff(set domain, val v);
@@ -2190,6 +2218,7 @@
 public:
   inline /* implicit */ pw_aff_list();
   inline /* implicit */ pw_aff_list(const pw_aff_list &obj);
+  inline /* implicit */ pw_aff_list(std::nullptr_t);
   inline pw_aff_list &operator=(pw_aff_list obj);
   inline ~pw_aff_list();
   inline __isl_give isl_pw_aff_list *copy() const &;
@@ -2242,6 +2271,7 @@
 public:
   inline /* implicit */ pw_multi_aff();
   inline /* implicit */ pw_multi_aff(const pw_multi_aff &obj);
+  inline /* implicit */ pw_multi_aff(std::nullptr_t);
   inline /* implicit */ pw_multi_aff(multi_aff ma);
   inline /* implicit */ pw_multi_aff(pw_aff pa);
   inline explicit pw_multi_aff(ctx ctx, const std::string &str);
@@ -2351,6 +2381,7 @@
 public:
   inline /* implicit */ pw_multi_aff_list();
   inline /* implicit */ pw_multi_aff_list(const pw_multi_aff_list &obj);
+  inline /* implicit */ pw_multi_aff_list(std::nullptr_t);
   inline pw_multi_aff_list &operator=(pw_multi_aff_list obj);
   inline ~pw_multi_aff_list();
   inline __isl_give isl_pw_multi_aff_list *copy() const &;
@@ -2395,6 +2426,7 @@
 public:
   inline /* implicit */ pw_qpolynomial();
   inline /* implicit */ pw_qpolynomial(const pw_qpolynomial &obj);
+  inline /* implicit */ pw_qpolynomial(std::nullptr_t);
   inline explicit pw_qpolynomial(ctx ctx, const std::string &str);
   inline pw_qpolynomial &operator=(pw_qpolynomial obj);
   inline ~pw_qpolynomial();
@@ -2475,6 +2507,7 @@
 public:
   inline /* implicit */ pw_qpolynomial_fold_list();
   inline /* implicit */ pw_qpolynomial_fold_list(const pw_qpolynomial_fold_list &obj);
+  inline /* implicit */ pw_qpolynomial_fold_list(std::nullptr_t);
   inline pw_qpolynomial_fold_list &operator=(pw_qpolynomial_fold_list obj);
   inline ~pw_qpolynomial_fold_list();
   inline __isl_give isl_pw_qpolynomial_fold_list *copy() const &;
@@ -2504,6 +2537,7 @@
 public:
   inline /* implicit */ pw_qpolynomial_list();
   inline /* implicit */ pw_qpolynomial_list(const pw_qpolynomial_list &obj);
+  inline /* implicit */ pw_qpolynomial_list(std::nullptr_t);
   inline pw_qpolynomial_list &operator=(pw_qpolynomial_list obj);
   inline ~pw_qpolynomial_list();
   inline __isl_give isl_pw_qpolynomial_list *copy() const &;
@@ -2548,6 +2582,7 @@
 public:
   inline /* implicit */ qpolynomial();
   inline /* implicit */ qpolynomial(const qpolynomial &obj);
+  inline /* implicit */ qpolynomial(std::nullptr_t);
   inline qpolynomial &operator=(qpolynomial obj);
   inline ~qpolynomial();
   inline __isl_give isl_qpolynomial *copy() const &;
@@ -2616,6 +2651,7 @@
 public:
   inline /* implicit */ qpolynomial_list();
   inline /* implicit */ qpolynomial_list(const qpolynomial_list &obj);
+  inline /* implicit */ qpolynomial_list(std::nullptr_t);
   inline qpolynomial_list &operator=(qpolynomial_list obj);
   inline ~qpolynomial_list();
   inline __isl_give isl_qpolynomial_list *copy() const &;
@@ -2660,6 +2696,7 @@
 public:
   inline /* implicit */ schedule();
   inline /* implicit */ schedule(const schedule &obj);
+  inline /* implicit */ schedule(std::nullptr_t);
   inline explicit schedule(ctx ctx, const std::string &str);
   inline schedule &operator=(schedule obj);
   inline ~schedule();
@@ -2705,6 +2742,7 @@
 public:
   inline /* implicit */ schedule_constraints();
   inline /* implicit */ schedule_constraints(const schedule_constraints &obj);
+  inline /* implicit */ schedule_constraints(std::nullptr_t);
   inline explicit schedule_constraints(ctx ctx, const std::string &str);
   inline schedule_constraints &operator=(schedule_constraints obj);
   inline ~schedule_constraints();
@@ -2750,6 +2788,7 @@
 public:
   inline /* implicit */ schedule_node();
   inline /* implicit */ schedule_node(const schedule_node &obj);
+  inline /* implicit */ schedule_node(std::nullptr_t);
   inline schedule_node &operator=(schedule_node obj);
   inline ~schedule_node();
   inline __isl_give isl_schedule_node *copy() const &;
@@ -2839,6 +2878,7 @@
 public:
   inline /* implicit */ set();
   inline /* implicit */ set(const set &obj);
+  inline /* implicit */ set(std::nullptr_t);
   inline /* implicit */ set(basic_set bset);
   inline /* implicit */ set(point pnt);
   inline explicit set(union_set uset);
@@ -3025,6 +3065,7 @@
 public:
   inline /* implicit */ set_list();
   inline /* implicit */ set_list(const set_list &obj);
+  inline /* implicit */ set_list(std::nullptr_t);
   inline set_list &operator=(set_list obj);
   inline ~set_list();
   inline __isl_give isl_set_list *copy() const &;
@@ -3070,6 +3111,7 @@
 public:
   inline /* implicit */ space();
   inline /* implicit */ space(const space &obj);
+  inline /* implicit */ space(std::nullptr_t);
   inline explicit space(ctx ctx, unsigned int nparam, unsigned int n_in, unsigned int n_out);
   inline explicit space(ctx ctx, unsigned int nparam, unsigned int dim);
   inline space &operator=(space obj);
@@ -3175,6 +3217,7 @@
 public:
   inline /* implicit */ term();
   inline /* implicit */ term(const term &obj);
+  inline /* implicit */ term(std::nullptr_t);
   inline term &operator=(term obj);
   inline ~term();
   inline __isl_give isl_term *copy() const &;
@@ -3206,6 +3249,7 @@
 public:
   inline /* implicit */ union_access_info();
   inline /* implicit */ union_access_info(const union_access_info &obj);
+  inline /* implicit */ union_access_info(std::nullptr_t);
   inline explicit union_access_info(union_map sink);
   inline union_access_info &operator=(union_access_info obj);
   inline ~union_access_info();
@@ -3241,6 +3285,7 @@
 public:
   inline /* implicit */ union_flow();
   inline /* implicit */ union_flow(const union_flow &obj);
+  inline /* implicit */ union_flow(std::nullptr_t);
   inline union_flow &operator=(union_flow obj);
   inline ~union_flow();
   inline __isl_give isl_union_flow *copy() const &;
@@ -3275,6 +3320,7 @@
 public:
   inline /* implicit */ union_map();
   inline /* implicit */ union_map(const union_map &obj);
+  inline /* implicit */ union_map(std::nullptr_t);
   inline /* implicit */ union_map(basic_map bmap);
   inline /* implicit */ union_map(map map);
   inline explicit union_map(union_pw_multi_aff upma);
@@ -3419,6 +3465,7 @@
 public:
   inline /* implicit */ union_map_list();
   inline /* implicit */ union_map_list(const union_map_list &obj);
+  inline /* implicit */ union_map_list(std::nullptr_t);
   inline union_map_list &operator=(union_map_list obj);
   inline ~union_map_list();
   inline __isl_give isl_union_map_list *copy() const &;
@@ -3463,6 +3510,7 @@
 public:
   inline /* implicit */ union_pw_aff();
   inline /* implicit */ union_pw_aff(const union_pw_aff &obj);
+  inline /* implicit */ union_pw_aff(std::nullptr_t);
   inline /* implicit */ union_pw_aff(aff aff);
   inline /* implicit */ union_pw_aff(pw_aff pa);
   inline explicit union_pw_aff(ctx ctx, const std::string &str);
@@ -3539,6 +3587,7 @@
 public:
   inline /* implicit */ union_pw_aff_list();
   inline /* implicit */ union_pw_aff_list(const union_pw_aff_list &obj);
+  inline /* implicit */ union_pw_aff_list(std::nullptr_t);
   inline union_pw_aff_list &operator=(union_pw_aff_list obj);
   inline ~union_pw_aff_list();
   inline __isl_give isl_union_pw_aff_list *copy() const &;
@@ -3583,6 +3632,7 @@
 public:
   inline /* implicit */ union_pw_multi_aff();
   inline /* implicit */ union_pw_multi_aff(const union_pw_multi_aff &obj);
+  inline /* implicit */ union_pw_multi_aff(std::nullptr_t);
   inline /* implicit */ union_pw_multi_aff(aff aff);
   inline explicit union_pw_multi_aff(union_set uset);
   inline /* implicit */ union_pw_multi_aff(multi_aff ma);
@@ -3668,6 +3718,7 @@
 public:
   inline /* implicit */ union_pw_multi_aff_list();
   inline /* implicit */ union_pw_multi_aff_list(const union_pw_multi_aff_list &obj);
+  inline /* implicit */ union_pw_multi_aff_list(std::nullptr_t);
   inline union_pw_multi_aff_list &operator=(union_pw_multi_aff_list obj);
   inline ~union_pw_multi_aff_list();
   inline __isl_give isl_union_pw_multi_aff_list *copy() const &;
@@ -3712,6 +3763,7 @@
 public:
   inline /* implicit */ union_pw_qpolynomial();
   inline /* implicit */ union_pw_qpolynomial(const union_pw_qpolynomial &obj);
+  inline /* implicit */ union_pw_qpolynomial(std::nullptr_t);
   inline explicit union_pw_qpolynomial(ctx ctx, const std::string &str);
   inline union_pw_qpolynomial &operator=(union_pw_qpolynomial obj);
   inline ~union_pw_qpolynomial();
@@ -3779,6 +3831,7 @@
 public:
   inline /* implicit */ union_set();
   inline /* implicit */ union_set(const union_set &obj);
+  inline /* implicit */ union_set(std::nullptr_t);
   inline /* implicit */ union_set(basic_set bset);
   inline /* implicit */ union_set(point pnt);
   inline /* implicit */ union_set(set set);
@@ -3873,6 +3926,7 @@
 public:
   inline /* implicit */ union_set_list();
   inline /* implicit */ union_set_list(const union_set_list &obj);
+  inline /* implicit */ union_set_list(std::nullptr_t);
   inline union_set_list &operator=(union_set_list obj);
   inline ~union_set_list();
   inline __isl_give isl_union_set_list *copy() const &;
@@ -3918,6 +3972,7 @@
 public:
   inline /* implicit */ val();
   inline /* implicit */ val(const val &obj);
+  inline /* implicit */ val(std::nullptr_t);
   inline explicit val(ctx ctx, long i);
   inline explicit val(ctx ctx, const std::string &str);
   inline val &operator=(val obj);
@@ -4003,6 +4058,7 @@
 public:
   inline /* implicit */ val_list();
   inline /* implicit */ val_list(const val_list &obj);
+  inline /* implicit */ val_list(std::nullptr_t);
   inline val_list &operator=(val_list obj);
   inline ~val_list();
   inline __isl_give isl_val_list *copy() const &;
@@ -4047,6 +4103,7 @@
 public:
   inline /* implicit */ vec();
   inline /* implicit */ vec(const vec &obj);
+  inline /* implicit */ vec(std::nullptr_t);
   inline vec &operator=(vec obj);
   inline ~vec();
   inline __isl_give isl_vec *copy() const &;
@@ -4101,6 +4158,8 @@
 {
   ptr = obj.copy();
 }
+aff::aff(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 aff::aff(__isl_take isl_aff *ptr)
@@ -4634,6 +4693,8 @@
 {
   ptr = obj.copy();
 }
+aff_list::aff_list(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 aff_list::aff_list(__isl_take isl_aff_list *ptr)
@@ -4805,6 +4866,8 @@
 {
   ptr = obj.copy();
 }
+ast_build::ast_build(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 ast_build::ast_build(__isl_take isl_ast_build *ptr)
@@ -4948,6 +5011,8 @@
 {
   ptr = obj.copy();
 }
+ast_expr::ast_expr(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 ast_expr::ast_expr(__isl_take isl_ast_expr *ptr)
@@ -5197,6 +5262,8 @@
 {
   ptr = obj.copy();
 }
+ast_expr_list::ast_expr_list(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 ast_expr_list::ast_expr_list(__isl_take isl_ast_expr_list *ptr)
@@ -5368,6 +5435,8 @@
 {
   ptr = obj.copy();
 }
+ast_node::ast_node(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 ast_node::ast_node(__isl_take isl_ast_node *ptr)
@@ -5569,6 +5638,8 @@
 {
   ptr = obj.copy();
 }
+ast_node_list::ast_node_list(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 ast_node_list::ast_node_list(__isl_take isl_ast_node_list *ptr)
@@ -5740,6 +5811,8 @@
 {
   ptr = obj.copy();
 }
+basic_map::basic_map(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 basic_map::basic_map(__isl_take isl_basic_map *ptr)
@@ -6452,6 +6525,8 @@
 {
   ptr = obj.copy();
 }
+basic_map_list::basic_map_list(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 basic_map_list::basic_map_list(__isl_take isl_basic_map_list *ptr)
@@ -6623,6 +6698,8 @@
 {
   ptr = obj.copy();
 }
+basic_set::basic_set(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 basic_set::basic_set(__isl_take isl_basic_set *ptr)
@@ -7174,6 +7251,8 @@
 {
   ptr = obj.copy();
 }
+basic_set_list::basic_set_list(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 basic_set_list::basic_set_list(__isl_take isl_basic_set_list *ptr)
@@ -7351,6 +7430,8 @@
 {
   ptr = obj.copy();
 }
+constraint::constraint(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 constraint::constraint(__isl_take isl_constraint *ptr)
@@ -7536,6 +7617,8 @@
 {
   ptr = obj.copy();
 }
+constraint_list::constraint_list(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 constraint_list::constraint_list(__isl_take isl_constraint_list *ptr)
@@ -7707,6 +7790,8 @@
 {
   ptr = obj.copy();
 }
+fixed_box::fixed_box(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 fixed_box::fixed_box(__isl_take isl_fixed_box *ptr)
@@ -7804,6 +7889,8 @@
 {
   ptr = obj.copy();
 }
+id::id(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 id::id(__isl_take isl_id *ptr)
@@ -7907,6 +7994,8 @@
 {
   ptr = obj.copy();
 }
+id_list::id_list(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 id_list::id_list(__isl_take isl_id_list *ptr)
@@ -8078,6 +8167,8 @@
 {
   ptr = obj.copy();
 }
+id_to_ast_expr::id_to_ast_expr(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 id_to_ast_expr::id_to_ast_expr(__isl_take isl_id_to_ast_expr *ptr)
@@ -8186,6 +8277,8 @@
 {
   ptr = obj.copy();
 }
+local_space::local_space(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 local_space::local_space(__isl_take isl_local_space *ptr)
@@ -8400,6 +8493,8 @@
 {
   ptr = obj.copy();
 }
+map::map(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 map::map(__isl_take isl_map *ptr)
@@ -9603,6 +9698,8 @@
 {
   ptr = obj.copy();
 }
+map_list::map_list(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 map_list::map_list(__isl_take isl_map_list *ptr)
@@ -9774,6 +9871,8 @@
 {
   ptr = obj.copy();
 }
+mat::mat(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 mat::mat(__isl_take isl_mat *ptr)
@@ -10078,6 +10177,8 @@
 {
   ptr = obj.copy();
 }
+multi_aff::multi_aff(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 multi_aff::multi_aff(__isl_take isl_multi_aff *ptr)
@@ -10617,6 +10718,8 @@
 {
   ptr = obj.copy();
 }
+multi_id::multi_id(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 multi_id::multi_id(__isl_take isl_multi_id *ptr)
@@ -10820,6 +10923,8 @@
 {
   ptr = obj.copy();
 }
+multi_pw_aff::multi_pw_aff(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 multi_pw_aff::multi_pw_aff(__isl_take isl_multi_pw_aff *ptr)
@@ -11422,6 +11527,8 @@
 {
   ptr = obj.copy();
 }
+multi_union_pw_aff::multi_union_pw_aff(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 multi_union_pw_aff::multi_union_pw_aff(__isl_take isl_multi_union_pw_aff *ptr)
@@ -11911,6 +12018,8 @@
 {
   ptr = obj.copy();
 }
+multi_val::multi_val(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 multi_val::multi_val(__isl_take isl_multi_val *ptr)
@@ -12313,6 +12422,8 @@
 {
   ptr = obj.copy();
 }
+point::point(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 point::point(__isl_take isl_point *ptr)
@@ -12427,6 +12538,8 @@
 {
   ptr = obj.copy();
 }
+pw_aff::pw_aff(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 pw_aff::pw_aff(__isl_take isl_pw_aff *ptr)
@@ -13081,6 +13194,8 @@
 {
   ptr = obj.copy();
 }
+pw_aff_list::pw_aff_list(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 pw_aff_list::pw_aff_list(__isl_take isl_pw_aff_list *ptr)
@@ -13300,6 +13415,8 @@
 {
   ptr = obj.copy();
 }
+pw_multi_aff::pw_multi_aff(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 pw_multi_aff::pw_multi_aff(__isl_take isl_pw_multi_aff *ptr)
@@ -13860,6 +13977,8 @@
 {
   ptr = obj.copy();
 }
+pw_multi_aff_list::pw_multi_aff_list(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 pw_multi_aff_list::pw_multi_aff_list(__isl_take isl_pw_multi_aff_list *ptr)
@@ -14031,6 +14150,8 @@
 {
   ptr = obj.copy();
 }
+pw_qpolynomial::pw_qpolynomial(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 pw_qpolynomial::pw_qpolynomial(__isl_take isl_pw_qpolynomial *ptr)
@@ -14417,6 +14538,8 @@
 {
   ptr = obj.copy();
 }
+pw_qpolynomial_fold_list::pw_qpolynomial_fold_list(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 pw_qpolynomial_fold_list::pw_qpolynomial_fold_list(__isl_take isl_pw_qpolynomial_fold_list *ptr)
@@ -14491,6 +14614,8 @@
 {
   ptr = obj.copy();
 }
+pw_qpolynomial_list::pw_qpolynomial_list(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 pw_qpolynomial_list::pw_qpolynomial_list(__isl_take isl_pw_qpolynomial_list *ptr)
@@ -14662,6 +14787,8 @@
 {
   ptr = obj.copy();
 }
+qpolynomial::qpolynomial(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 qpolynomial::qpolynomial(__isl_take isl_qpolynomial *ptr)
@@ -14982,6 +15109,8 @@
 {
   ptr = obj.copy();
 }
+qpolynomial_list::qpolynomial_list(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 qpolynomial_list::qpolynomial_list(__isl_take isl_qpolynomial_list *ptr)
@@ -15153,6 +15282,8 @@
 {
   ptr = obj.copy();
 }
+schedule::schedule(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 schedule::schedule(__isl_take isl_schedule *ptr)
@@ -15321,6 +15452,8 @@
 {
   ptr = obj.copy();
 }
+schedule_constraints::schedule_constraints(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 schedule_constraints::schedule_constraints(__isl_take isl_schedule_constraints *ptr)
@@ -15489,6 +15622,8 @@
 {
   ptr = obj.copy();
 }
+schedule_node::schedule_node(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 schedule_node::schedule_node(__isl_take isl_schedule_node *ptr)
@@ -15930,6 +16065,8 @@
 {
   ptr = obj.copy();
 }
+set::set(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 set::set(__isl_take isl_set *ptr)
@@ -16959,6 +17096,8 @@
 {
   ptr = obj.copy();
 }
+set_list::set_list(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 set_list::set_list(__isl_take isl_set_list *ptr)
@@ -17136,6 +17275,8 @@
 {
   ptr = obj.copy();
 }
+space::space(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 space::space(__isl_take isl_space *ptr)
@@ -17665,6 +17806,8 @@
 {
   ptr = obj.copy();
 }
+term::term(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 term::term(__isl_take isl_term *ptr)
@@ -17749,6 +17892,8 @@
 {
   ptr = obj.copy();
 }
+union_access_info::union_access_info(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 union_access_info::union_access_info(__isl_take isl_union_access_info *ptr)
@@ -17859,6 +18004,8 @@
 {
   ptr = obj.copy();
 }
+union_flow::union_flow(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 union_flow::union_flow(__isl_take isl_union_flow *ptr)
@@ -17964,6 +18111,8 @@
 {
   ptr = obj.copy();
 }
+union_map::union_map(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 union_map::union_map(__isl_take isl_union_map *ptr)
@@ -18731,6 +18880,8 @@
 {
   ptr = obj.copy();
 }
+union_map_list::union_map_list(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 union_map_list::union_map_list(__isl_take isl_union_map_list *ptr)
@@ -18902,6 +19053,8 @@
 {
   ptr = obj.copy();
 }
+union_pw_aff::union_pw_aff(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 union_pw_aff::union_pw_aff(__isl_take isl_union_pw_aff *ptr)
@@ -19261,6 +19414,8 @@
 {
   ptr = obj.copy();
 }
+union_pw_aff_list::union_pw_aff_list(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 union_pw_aff_list::union_pw_aff_list(__isl_take isl_union_pw_aff_list *ptr)
@@ -19432,6 +19587,8 @@
 {
   ptr = obj.copy();
 }
+union_pw_multi_aff::union_pw_multi_aff(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 union_pw_multi_aff::union_pw_multi_aff(__isl_take isl_union_pw_multi_aff *ptr)
@@ -19841,6 +19998,8 @@
 {
   ptr = obj.copy();
 }
+union_pw_multi_aff_list::union_pw_multi_aff_list(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 union_pw_multi_aff_list::union_pw_multi_aff_list(__isl_take isl_union_pw_multi_aff_list *ptr)
@@ -20012,6 +20171,8 @@
 {
   ptr = obj.copy();
 }
+union_pw_qpolynomial::union_pw_qpolynomial(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 union_pw_qpolynomial::union_pw_qpolynomial(__isl_take isl_union_pw_qpolynomial *ptr)
@@ -20322,6 +20483,8 @@
 {
   ptr = obj.copy();
 }
+union_set::union_set(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 union_set::union_set(__isl_take isl_union_set *ptr)
@@ -20797,6 +20960,8 @@
 {
   ptr = obj.copy();
 }
+union_set_list::union_set_list(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 union_set_list::union_set_list(__isl_take isl_union_set_list *ptr)
@@ -20974,6 +21139,8 @@
 {
   ptr = obj.copy();
 }
+val::val(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 val::val(__isl_take isl_val *ptr)
@@ -21381,6 +21548,8 @@
 {
   ptr = obj.copy();
 }
+val_list::val_list(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 val_list::val_list(__isl_take isl_val_list *ptr)
@@ -21552,6 +21721,8 @@
 {
   ptr = obj.copy();
 }
+vec::vec(std::nullptr_t)
+    : ptr(nullptr) {}
 
 
 vec::vec(__isl_take isl_vec *ptr)
diff --git a/lib/Support/ISLTools.cpp b/lib/Support/ISLTools.cpp
index f81ad15..5ea9d0b 100644
--- a/lib/Support/ISLTools.cpp
+++ b/lib/Support/ISLTools.cpp
@@ -133,7 +133,7 @@
 
 isl::map polly::singleton(isl::union_map UMap, isl::space ExpectedSpace) {
   if (!UMap)
-    return {};
+    return nullptr;
 
   if (isl_union_map_n_map(UMap.get()) == 0)
     return isl::map::empty(ExpectedSpace);
@@ -146,7 +146,7 @@
 
 isl::set polly::singleton(isl::union_set USet, isl::space ExpectedSpace) {
   if (!USet)
-    return {};
+    return nullptr;
 
   if (isl_union_set_n_set(USet.get()) == 0)
     return isl::set::empty(ExpectedSpace);
@@ -170,7 +170,7 @@
 
 isl::space polly::getScatterSpace(const isl::union_map &Schedule) {
   if (!Schedule)
-    return {};
+    return nullptr;
   unsigned Dims = getNumScatterDims(Schedule);
   isl::space ScatterSpace = Schedule.get_space().set_from_params();
   return ScatterSpace.add_dims(isl::dim::set, Dims);
diff --git a/lib/Transform/DeLICM.cpp b/lib/Transform/DeLICM.cpp
index 0380f8a..cc93614 100644
--- a/lib/Transform/DeLICM.cpp
+++ b/lib/Transform/DeLICM.cpp
@@ -730,7 +730,8 @@
     auto DefEltSched = ValInst.apply_domain(WrittenTranslator);
     simplify(DefEltSched);
 
-    Knowledge Proposed(EltZone, {}, filterKnownValInst(EltKnown), DefEltSched);
+    Knowledge Proposed(EltZone, nullptr, filterKnownValInst(EltKnown),
+                       DefEltSched);
     if (isConflicting(Proposed))
       return false;
 
@@ -941,7 +942,7 @@
     auto Occupied = LifetimeTranslator.range();
     simplify(Occupied);
 
-    Knowledge Proposed(Occupied, {}, EltLifetimeInst, Written);
+    Knowledge Proposed(Occupied, nullptr, EltLifetimeInst, Written);
     if (isConflicting(Proposed))
       return false;
 
@@ -1218,7 +1219,7 @@
       return false;
     }
 
-    Zone = OriginalZone = Knowledge({}, EltUnused, EltKnown, EltWritten);
+    Zone = OriginalZone = Knowledge(nullptr, EltUnused, EltKnown, EltWritten);
     LLVM_DEBUG(dbgs() << "Computed Zone:\n"; OriginalZone.print(dbgs(), 4));
 
     assert(Zone.isUsable() && OriginalZone.isUsable());
diff --git a/lib/Transform/FlattenAlgo.cpp b/lib/Transform/FlattenAlgo.cpp
index 7cafd83..31f692a 100644
--- a/lib/Transform/FlattenAlgo.cpp
+++ b/lib/Transform/FlattenAlgo.cpp
@@ -185,7 +185,7 @@
   // Would cause an infinite loop.
   if (!isDimBoundedByConstant(ScatterSet, 0)) {
     LLVM_DEBUG(dbgs() << "Abort; dimension is not of fixed size\n");
-    return {};
+    return nullptr;
   }
 
   auto AllDomains = Schedule.domain();
@@ -216,7 +216,7 @@
 
     if (!isDimBoundedByParameter(FirstSubScatter, 0)) {
       LLVM_DEBUG(dbgs() << "Abort; sequence step is not bounded\n");
-      return {};
+      return nullptr;
     }
 
     auto FirstSubScatterMap = isl::map::from_range(FirstSubScatter);
@@ -275,7 +275,7 @@
 
   if (!isDimBoundedByConstant(SubExtent, 0)) {
     LLVM_DEBUG(dbgs() << "Abort; dimension not bounded by constant\n");
-    return {};
+    return nullptr;
   }
 
   auto Min = SubExtent.dim_min(0);
@@ -287,7 +287,7 @@
 
   if (!MinVal || !MaxVal || MinVal.is_nan() || MaxVal.is_nan()) {
     LLVM_DEBUG(dbgs() << "Abort; dimension bounds could not be determined\n");
-    return {};
+    return nullptr;
   }
 
   auto FirstSubScheduleAff = scheduleExtractDimAff(SubSchedule, 0);
diff --git a/lib/Transform/FlattenSchedule.cpp b/lib/Transform/FlattenSchedule.cpp
index c02c71e..fc065af 100644
--- a/lib/Transform/FlattenSchedule.cpp
+++ b/lib/Transform/FlattenSchedule.cpp
@@ -90,7 +90,7 @@
   }
 
   virtual void releaseMemory() override {
-    OldSchedule = {};
+    OldSchedule = nullptr;
     IslCtx.reset();
   }
 };
diff --git a/lib/Transform/ForwardOpTree.cpp b/lib/Transform/ForwardOpTree.cpp
index d3b5d4c..6cdcc71 100644
--- a/lib/Transform/ForwardOpTree.cpp
+++ b/lib/Transform/ForwardOpTree.cpp
@@ -365,9 +365,9 @@
 
     if (!Known || !Translator || !NormalizeMap) {
       assert(isl_ctx_last_error(IslCtx.get()) == isl_error_quota);
-      Known = {};
-      Translator = {};
-      NormalizeMap = {};
+      Known = nullptr;
+      Translator = nullptr;
+      NormalizeMap = nullptr;
       LLVM_DEBUG(dbgs() << "Known analysis exceeded max_operations\n");
       return false;
     }
diff --git a/lib/Transform/ScheduleOptimizer.cpp b/lib/Transform/ScheduleOptimizer.cpp
index 3af949c..9c893f5 100644
--- a/lib/Transform/ScheduleOptimizer.cpp
+++ b/lib/Transform/ScheduleOptimizer.cpp
@@ -547,6 +547,8 @@
 
   explicit IslScheduleOptimizerWrapperPass() : ScopPass(ID) {}
 
+  ~IslScheduleOptimizerWrapperPass() override { releaseMemory(); }
+
   /// Optimize the schedule of the SCoP @p S.
   bool runOnScop(Scop &S) override;
 
@@ -558,7 +560,7 @@
 
   /// Release the internal memory.
   void releaseMemory() override {
-    LastSchedule = {};
+    LastSchedule = nullptr;
     IslCtx.reset();
   }
 
diff --git a/lib/Transform/ZoneAlgo.cpp b/lib/Transform/ZoneAlgo.cpp
index 0b81887..83ec5ee 100644
--- a/lib/Transform/ZoneAlgo.cpp
+++ b/lib/Transform/ZoneAlgo.cpp
@@ -546,7 +546,7 @@
   // flow.
   isl::set DefinedContext = S->getDefinedBehaviorContext();
   if (!DefinedContext)
-    return {};
+    return nullptr;
 
   assert(SAI->isPHIKind());
 
@@ -729,7 +729,7 @@
 
 isl::id ZoneAlgorithm::makeValueId(Value *V) {
   if (!V)
-    return {};
+    return nullptr;
 
   auto &Id = ValueIds[V];
   if (Id.is_null()) {
diff --git a/unittests/DeLICM/DeLICMTest.cpp b/unittests/DeLICM/DeLICMTest.cpp
index eaa37ee..3e6b6f0 100644
--- a/unittests/DeLICM/DeLICMTest.cpp
+++ b/unittests/DeLICM/DeLICMTest.cpp
@@ -80,13 +80,13 @@
 
 isl::union_set parseSetOrNull(isl_ctx *Ctx, const char *Str) {
   if (!Str)
-    return {};
+    return nullptr;
   return isl::union_set(Ctx, Str);
 }
 
 isl::union_map parseMapOrNull(isl_ctx *Ctx, const char *Str) {
   if (!Str)
-    return {};
+    return nullptr;
   return isl::union_map(Ctx, Str);
 }