summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Grosser <grosser@fim.uni-passau.de>2012-10-16 07:29:19 +0000
committerTobias Grosser <grosser@fim.uni-passau.de>2012-10-16 07:29:19 +0000
commit28781423b2a26995809075314ad7621f0c58abd7 (patch)
tree433df5a3cb7fa7dc5110eddd25785219ae1f17b6
parentc967d8e6e90fc48c1e25051ef457fe954e9983b1 (diff)
downloadbcm5719-llvm-28781423b2a26995809075314ad7621f0c58abd7.tar.gz
bcm5719-llvm-28781423b2a26995809075314ad7621f0c58abd7.zip
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
-rw-r--r--polly/lib/ScheduleOptimizer.cpp39
-rw-r--r--polly/test/ScheduleOptimizer/2012-10-14-Zero-Bands.ll27
-rwxr-xr-xpolly/utils/checkout_cloog.sh2
3 files changed, 63 insertions, 5 deletions
diff --git a/polly/lib/ScheduleOptimizer.cpp b/polly/lib/ScheduleOptimizer.cpp
index 3d8e28f0a62..266ec907d06 100644
--- a/polly/lib/ScheduleOptimizer.cpp
+++ b/polly/lib/ScheduleOptimizer.cpp
@@ -83,13 +83,21 @@ namespace {
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 @@ namespace {
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 @@ isl_union_map *IslScheduleOptimizer::getScheduleMap(isl_schedule *Schedule) {
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 @@ bool IslScheduleOptimizer::runOnScop(Scop &S) {
<< " 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 @@ bool IslScheduleOptimizer::runOnScop(Scop &S) {
}
isl_union_map_free(ScheduleMap);
- isl_schedule_free(Schedule);
+ LastSchedule = Schedule;
unsigned MaxScatDims = 0;
@@ -558,6 +573,22 @@ bool IslScheduleOptimizer::runOnScop(Scop &S) {
}
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 {
diff --git a/polly/test/ScheduleOptimizer/2012-10-14-Zero-Bands.ll b/polly/test/ScheduleOptimizer/2012-10-14-Zero-Bands.ll
new file mode 100644
index 00000000000..5859b7e82f0
--- /dev/null
+++ b/polly/test/ScheduleOptimizer/2012-10-14-Zero-Bands.ll
@@ -0,0 +1,27 @@
+; RUN: opt %loadPolly -polly-region-simplify -polly-opt-isl -analyze < %s | FileCheck %s
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+@A = common global [1536 x float] zeroinitializer
+
+define void @read_nres() {
+entry:
+ br label %if.cond
+
+if.cond:
+ br i1 false, label %if.then, label %if.end
+
+if.then:
+ %ptr = getelementptr [1536 x float]* @A, i64 0, i32 23
+ store float undef, float* %ptr
+ br label %if.end
+
+if.end:
+ br label %return
+
+return:
+ ret void
+}
+
+; CHECK: Calculated schedule:
+; CHECK: { Stmt_if_then[] -> [] }
diff --git a/polly/utils/checkout_cloog.sh b/polly/utils/checkout_cloog.sh
index 31d87af5605..971c02782f0 100755
--- a/polly/utils/checkout_cloog.sh
+++ b/polly/utils/checkout_cloog.sh
@@ -1,7 +1,7 @@
#!/bin/sh
CLOOG_HASH="57470e76bfd58a0c38c598e816411663193e0f45"
-ISL_HASH="14beb7bfa687199d1a515889fbc2459d5f6d235b"
+ISL_HASH="cc969a737d4f8de258a462c3cb1c063fe2f1c5cf"
PWD=`pwd`
OpenPOWER on IntegriCloud