mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-09 02:49:11 +00:00
[ScopInfo] Translate getNonHoistableCtx to C++ [NFC]
llvm-svn: 304841
This commit is contained in:
parent
cb3603a4eb
commit
4071cb571a
@ -28,6 +28,8 @@
|
||||
#include "isl/ctx.h"
|
||||
#include "isl/set.h"
|
||||
|
||||
#include "isl-noexceptions.h"
|
||||
|
||||
#include <deque>
|
||||
#include <forward_list>
|
||||
|
||||
@ -1898,8 +1900,7 @@ private:
|
||||
MemoryAccess *lookupBasePtrAccess(MemoryAccess *MA);
|
||||
|
||||
/// Check if the base ptr of @p MA is in the SCoP but not hoistable.
|
||||
bool hasNonHoistableBasePtrInScop(MemoryAccess *MA,
|
||||
__isl_keep isl_union_map *Writes);
|
||||
bool hasNonHoistableBasePtrInScop(MemoryAccess *MA, isl::union_map Writes);
|
||||
|
||||
/// Create equivalence classes for required invariant accesses.
|
||||
///
|
||||
@ -1922,8 +1923,7 @@ private:
|
||||
///
|
||||
/// @return Return the context under which the access cannot be hoisted or a
|
||||
/// nullptr if it cannot be hoisted at all.
|
||||
__isl_give isl_set *getNonHoistableCtx(MemoryAccess *Access,
|
||||
__isl_keep isl_union_map *Writes);
|
||||
isl::set getNonHoistableCtx(MemoryAccess *Access, isl::union_map Writes);
|
||||
|
||||
/// Verify that all required invariant loads have been hoisted.
|
||||
///
|
||||
|
@ -3187,12 +3187,9 @@ MemoryAccess *Scop::lookupBasePtrAccess(MemoryAccess *MA) {
|
||||
}
|
||||
|
||||
bool Scop::hasNonHoistableBasePtrInScop(MemoryAccess *MA,
|
||||
__isl_keep isl_union_map *Writes) {
|
||||
isl::union_map Writes) {
|
||||
if (auto *BasePtrMA = lookupBasePtrAccess(MA)) {
|
||||
auto *NHCtx = getNonHoistableCtx(BasePtrMA, Writes);
|
||||
bool Hoistable = NHCtx != nullptr;
|
||||
isl_set_free(NHCtx);
|
||||
return !Hoistable;
|
||||
return getNonHoistableCtx(BasePtrMA, Writes).is_null();
|
||||
}
|
||||
|
||||
Value *BaseAddr = MA->getOriginalBaseAddr();
|
||||
@ -3883,8 +3880,7 @@ void Scop::addInvariantLoads(ScopStmt &Stmt, InvariantAccessesTy &InvMAs) {
|
||||
isl_set_free(DomainCtx);
|
||||
}
|
||||
|
||||
__isl_give isl_set *Scop::getNonHoistableCtx(MemoryAccess *Access,
|
||||
__isl_keep isl_union_map *Writes) {
|
||||
isl::set Scop::getNonHoistableCtx(MemoryAccess *Access, isl::union_map Writes) {
|
||||
// TODO: Loads that are not loop carried, hence are in a statement with
|
||||
// zero iterators, are by construction invariant, though we
|
||||
// currently "hoist" them anyway. This is necessary because we allow
|
||||
@ -3911,49 +3907,41 @@ __isl_give isl_set *Scop::getNonHoistableCtx(MemoryAccess *Access,
|
||||
if (hasNonHoistableBasePtrInScop(Access, Writes))
|
||||
return nullptr;
|
||||
|
||||
isl_map *AccessRelation = Access->getAccessRelation();
|
||||
assert(!isl_map_is_empty(AccessRelation));
|
||||
isl::map AccessRelation = give(Access->getAccessRelation());
|
||||
assert(!AccessRelation.is_empty());
|
||||
|
||||
if (isl_map_involves_dims(AccessRelation, isl_dim_in, 0,
|
||||
Stmt.getNumIterators())) {
|
||||
isl_map_free(AccessRelation);
|
||||
if (AccessRelation.involves_dims(isl::dim::in, 0, Stmt.getNumIterators()))
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
AccessRelation = isl_map_intersect_domain(AccessRelation, Stmt.getDomain());
|
||||
isl_set *SafeToLoad;
|
||||
AccessRelation = AccessRelation.intersect_domain(give(Stmt.getDomain()));
|
||||
isl::set SafeToLoad;
|
||||
|
||||
auto &DL = getFunction().getParent()->getDataLayout();
|
||||
if (isSafeToLoadUnconditionally(LI->getPointerOperand(), LI->getAlignment(),
|
||||
DL)) {
|
||||
SafeToLoad =
|
||||
isl_set_universe(isl_space_range(isl_map_get_space(AccessRelation)));
|
||||
isl_map_free(AccessRelation);
|
||||
SafeToLoad = isl::set::universe(AccessRelation.get_space().range());
|
||||
} 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.
|
||||
isl_map_free(AccessRelation);
|
||||
return nullptr;
|
||||
} else {
|
||||
SafeToLoad = isl_map_range(AccessRelation);
|
||||
SafeToLoad = AccessRelation.range();
|
||||
}
|
||||
|
||||
isl_union_map *Written = isl_union_map_intersect_range(
|
||||
isl_union_map_copy(Writes), isl_union_set_from_set(SafeToLoad));
|
||||
auto *WrittenCtx = isl_union_map_params(Written);
|
||||
bool IsWritten = !isl_set_is_empty(WrittenCtx);
|
||||
isl::union_map Written = Writes.intersect_range(SafeToLoad);
|
||||
isl::set WrittenCtx = Written.params();
|
||||
bool IsWritten = !WrittenCtx.is_empty();
|
||||
|
||||
if (!IsWritten)
|
||||
return WrittenCtx;
|
||||
|
||||
WrittenCtx = isl_set_remove_divs(WrittenCtx);
|
||||
bool TooComplex = isl_set_n_basic_set(WrittenCtx) >= MaxDisjunctsInDomain;
|
||||
if (TooComplex || !isRequiredInvariantLoad(LI)) {
|
||||
isl_set_free(WrittenCtx);
|
||||
WrittenCtx = WrittenCtx.remove_divs();
|
||||
bool TooComplex =
|
||||
isl_set_n_basic_set(WrittenCtx.get()) >= MaxDisjunctsInDomain;
|
||||
if (TooComplex || !isRequiredInvariantLoad(LI))
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
addAssumption(INVARIANTLOAD, isl_set_copy(WrittenCtx), LI->getDebugLoc(),
|
||||
addAssumption(INVARIANTLOAD, WrittenCtx.copy(), LI->getDebugLoc(),
|
||||
AS_RESTRICTION);
|
||||
return WrittenCtx;
|
||||
}
|
||||
@ -3974,20 +3962,19 @@ void Scop::hoistInvariantLoads() {
|
||||
if (!PollyInvariantLoadHoisting)
|
||||
return;
|
||||
|
||||
isl_union_map *Writes = getWrites();
|
||||
isl::union_map Writes = give(getWrites());
|
||||
for (ScopStmt &Stmt : *this) {
|
||||
InvariantAccessesTy InvariantAccesses;
|
||||
|
||||
for (MemoryAccess *Access : Stmt)
|
||||
if (auto *NHCtx = getNonHoistableCtx(Access, Writes))
|
||||
InvariantAccesses.push_back({Access, NHCtx});
|
||||
if (isl::set NHCtx = getNonHoistableCtx(Access, Writes))
|
||||
InvariantAccesses.push_back({Access, NHCtx.release()});
|
||||
|
||||
// Transfer the memory access from the statement to the SCoP.
|
||||
for (auto InvMA : InvariantAccesses)
|
||||
Stmt.removeMemoryAccess(InvMA.MA);
|
||||
addInvariantLoads(Stmt, InvariantAccesses);
|
||||
}
|
||||
isl_union_map_free(Writes);
|
||||
}
|
||||
|
||||
/// Find the canonical scop array info object for a set of invariant load
|
||||
|
Loading…
x
Reference in New Issue
Block a user