isl scheduler: Do not fail when returning an empty band list

The bug was within isl. To fix it, we simply update the isl version that
is used by Polly. We still have some changes within Polly to be able to
write a proper test case.

Reported-by: Sameer Sahasrabuddhe <Sameer.Sahasrabuddhe@amd.com>
llvm-svn: 166021
diff --git a/polly/lib/ScheduleOptimizer.cpp b/polly/lib/ScheduleOptimizer.cpp
index 3d8e28f..266ec90 100644
--- a/polly/lib/ScheduleOptimizer.cpp
+++ b/polly/lib/ScheduleOptimizer.cpp
@@ -83,13 +83,21 @@
 
   public:
     static char ID;
-    explicit IslScheduleOptimizer() : ScopPass(ID) {}
+    explicit IslScheduleOptimizer() : ScopPass(ID) {
+      LastSchedule = NULL;
+    }
+
+    ~IslScheduleOptimizer() {
+      isl_schedule_free(LastSchedule);
+    }
 
     virtual bool runOnScop(Scop &S);
     void printScop(llvm::raw_ostream &OS) const;
     void getAnalysisUsage(AnalysisUsage &AU) const;
 
   private:
+    isl_schedule *LastSchedule;
+
     static void extendScattering(Scop &S, unsigned NewDimensions);
 
     /// @brief Create a map that describes a n-dimensonal tiling.
@@ -179,6 +187,12 @@
     static isl_union_map *getScheduleForBandList(isl_band_list *BandList);
 
     static isl_union_map *getScheduleMap(isl_schedule *Schedule);
+
+    bool doFinalization() {
+      isl_schedule_free(LastSchedule);
+      LastSchedule = NULL;
+      return true;
+    }
   };
 
 }
@@ -437,6 +451,9 @@
 bool IslScheduleOptimizer::runOnScop(Scop &S) {
   Dependences *D = &getAnalysis<Dependences>();
 
+  isl_schedule_free(LastSchedule);
+  LastSchedule = NULL;
+
   // Build input data.
   int ValidityKinds = Dependences::TYPE_RAW | Dependences::TYPE_WAR
                       | Dependences::TYPE_WAW;
@@ -452,10 +469,8 @@
         << " Falling back to optimizing all dependences.\n";
     ProximityKinds = Dependences::TYPE_RAW | Dependences::TYPE_WAR
                      | Dependences::TYPE_WAW;
-
   }
 
-
   isl_union_set *Domain = S.getDomains();
 
   if (!Domain)
@@ -546,7 +561,7 @@
   }
 
   isl_union_map_free(ScheduleMap);
-  isl_schedule_free(Schedule);
+  LastSchedule = Schedule;
 
   unsigned MaxScatDims = 0;
 
@@ -558,6 +573,22 @@
 }
 
 void IslScheduleOptimizer::printScop(raw_ostream &OS) const {
+  isl_printer *p;
+  char *ScheduleStr;
+
+  OS << "Calculated schedule:\n";
+
+  if (!LastSchedule) {
+    OS << "n/a\n";
+    return;
+  }
+
+  p = isl_printer_to_str(isl_schedule_get_ctx(LastSchedule));
+  p = isl_printer_print_schedule(p, LastSchedule);
+  ScheduleStr = isl_printer_get_str(p);
+  isl_printer_free(p);
+
+  OS << ScheduleStr << "\n";
 }
 
 void IslScheduleOptimizer::getAnalysisUsage(AnalysisUsage &AU) const {