summaryrefslogtreecommitdiffstats
path: root/polly/lib/CodeGen/PPCGCodeGeneration.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'polly/lib/CodeGen/PPCGCodeGeneration.cpp')
-rw-r--r--polly/lib/CodeGen/PPCGCodeGeneration.cpp23
1 files changed, 19 insertions, 4 deletions
diff --git a/polly/lib/CodeGen/PPCGCodeGeneration.cpp b/polly/lib/CodeGen/PPCGCodeGeneration.cpp
index c35ff50986a..75c060aa7f3 100644
--- a/polly/lib/CodeGen/PPCGCodeGeneration.cpp
+++ b/polly/lib/CodeGen/PPCGCodeGeneration.cpp
@@ -2714,9 +2714,10 @@ public:
/// Create the arrays for @p PPCGProg.
///
/// @param PPCGProg The program to compute the arrays for.
- void createArrays(gpu_prog *PPCGProg) {
+ void createArrays(gpu_prog *PPCGProg,
+ const SmallVector<ScopArrayInfo *, 4> &ValidSAIs) {
int i = 0;
- for (auto &Array : S->arrays()) {
+ for (auto &Array : ValidSAIs) {
std::string TypeName;
raw_string_ostream OS(TypeName);
@@ -2800,11 +2801,25 @@ public:
isl_union_map_empty(isl_set_get_space(PPCGScop->context));
PPCGProg->n_stmts = std::distance(S->begin(), S->end());
PPCGProg->stmts = getStatements();
- PPCGProg->n_array = std::distance(S->array_begin(), S->array_end());
+
+ // Only consider arrays that have a non-empty extent.
+ // Otherwise, this will cause us to consider the following kinds of
+ // empty arrays:
+ // 1. Invariant loads that are represented by SAI objects.
+ // 2. Arrays with statically known zero size.
+ auto ValidSAIsRange =
+ make_filter_range(S->arrays(), [this](ScopArrayInfo *SAI) -> bool {
+ return !isl::manage(getExtent(SAI)).is_empty();
+ });
+ SmallVector<ScopArrayInfo *, 4> ValidSAIs(ValidSAIsRange.begin(),
+ ValidSAIsRange.end());
+
+ PPCGProg->n_array =
+ ValidSAIs.size(); // std::distance(S->array_begin(), S->array_end());
PPCGProg->array = isl_calloc_array(S->getIslCtx(), struct gpu_array_info,
PPCGProg->n_array);
- createArrays(PPCGProg);
+ createArrays(PPCGProg, ValidSAIs);
PPCGProg->may_persist = compute_may_persist(PPCGProg);
return PPCGProg;
OpenPOWER on IntegriCloud