summaryrefslogtreecommitdiffstats
path: root/polly/lib/Transform/DeLICM.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'polly/lib/Transform/DeLICM.cpp')
-rw-r--r--polly/lib/Transform/DeLICM.cpp14
1 files changed, 13 insertions, 1 deletions
diff --git a/polly/lib/Transform/DeLICM.cpp b/polly/lib/Transform/DeLICM.cpp
index e6e76ec9930..68dfac43b15 100644
--- a/polly/lib/Transform/DeLICM.cpp
+++ b/polly/lib/Transform/DeLICM.cpp
@@ -666,6 +666,19 @@ private:
/// For each PHI instance we can directly determine which was the incoming
/// block, and hence derive which value the PHI has.
///
+ /// The returned relation generally is injective, meaning that every PHI write
+ /// has at most one (or zero, if the incoming block's branch does not jump to
+ /// the PHI's block) PHI Read that reads it. However, due to the SCoP's
+ /// parameter context it is possible a statement instance that would overwrite
+ /// the PHI scalar is not in the statement's domain and thus a PHI write
+ /// appear to be used twice. This is a static property, at runtime the
+ /// runtime condition should avoid that a configuration is executed. Although
+ /// incorrect, it should not have any effect in DeLICM. If it passes the
+ /// conflict check, there are multiple locations, one for each PHI Read it
+ /// matches, it had to write to. MemoryAccess::getAddressFunction() will
+ /// select only one of them. That is, statically, not all necessary value are
+ /// written, but the runtime check guards it from ever being executed.
+ ///
/// @param SAI The ScopArrayInfo representing the PHI's storage.
///
/// @return { DomainPHIRead[] -> DomainPHIWrite[] }
@@ -702,7 +715,6 @@ private:
isl_union_map_from_map(LastPerPHIWrites.take()),
isl_union_map_reverse(PHIWriteScatter.take())));
assert(isl_union_map_is_single_valued(Result.keep()) == isl_bool_true);
- assert(isl_union_map_is_injective(Result.keep()) == isl_bool_true);
return Result;
}
OpenPOWER on IntegriCloud