void AliasCheckGenerator::printConditions(const isl::Set &ParamContext, const isl::Set &Acc, const BoundsMapT &map) const { void *np = NULL; Set AccA = Acc; // Eliminate all but one single dimension and take the min/max. unsigned int ndims = AccA.dim(DimType::DTSet); AccA = AccA.eliminate(DimType::DTSet, 1, ndims - 1); PwAff minA = AccA.dimMin(0); PwAff maxA = AccA.dimMax(0); AstBuild Builder = AstBuild::fromContext(ParamContext); Space A = AccA.getSpace(); std::string nA = A.getTupleName(DimType::DTSet); Id idA = Id::alloc(nA, np); AstExpr ExpMinA = Builder.exprFromPwAff(minA); AstExpr ExpMaxA = Builder.exprFromPwAff(maxA); AstExpr ExpIdA = AstExpr::fromId(idA); ExpMinA = ExpIdA.add(ExpMinA); ExpMaxA = ExpIdA.add(ExpMaxA); for (const isl::Set &s : map) { Set AccB = s; Space B = AccB.getSpace(); std::string nB = B.getTupleName(DimType::DTSet); Id idB = Id::alloc(nB, np); PwAff minB = AccB.dimMin(0); PwAff maxB = AccB.dimMax(0); AstExpr ExpMinB = Builder.exprFromPwAff(minB); AstExpr ExpMaxB = Builder.exprFromPwAff(maxB); AstExpr ExpIdB = AstExpr::fromId(idB); ExpMinB = ExpIdB.add(ExpMinB); ExpMaxB = ExpIdB.add(ExpMaxB); dbgs().indent(6) << "[ (" << ExpMinA.toStr(Format::FC) << ")"; dbgs() << " <= (" << ExpMaxB.toStr(Format::FC) << ")"; dbgs() << " && (" << ExpMinB.toStr(Format::FC) << ")"; dbgs() << " <= (" << ExpMaxA.toStr(Format::FC) << ") ]\n"; } }
Set AliasCheckGenerator::checkPairs(const Set &Cond, const Set &Acc, const BoundsMapT &map) const { Set AccA = Acc; Set ResCond = Cond; // Eliminate all but one single dimension and take the min/max. unsigned int ndims = AccA.dim(DimType::DTSet); AccA = AccA.eliminate(DimType::DTSet, 1, ndims - 1); PwAff minA = AccA.dimMin(0); PwAff maxA = AccA.dimMax(0); Space spaceA = AccA.getSpace(); std::string nA = spaceA.getTupleName(DimType::DTSet); Set baseA = Set::readFromStr("[" + nA + "] -> { [" + nA + "] };"); PwAff bpA = baseA.dimMin(0); minA = minA.add(bpA); maxA = maxA.add(bpA); for (const isl::Set &s : map) { Set AccB = s; ndims = AccB.dim(DimType::DTSet); AccB = AccB.eliminate(DimType::DTSet, 1, ndims - 1); Space spaceB = AccB.getSpace(); std::string nB = spaceB.getTupleName(DimType::DTSet); Set baseB = Set::readFromStr("[" + nB + "] -> { [" + nB + "] };"); PwAff bpB = baseB.dimMin(0); PwAff minB = AccB.dimMin(0).add(bpB); PwAff maxB = AccB.dimMax(0).add(bpB); ResCond = ResCond.intersect(minA.leSet(maxB).intersect(minB.leSet(maxA))); ResCond = ResCond.coalesce(); } return ResCond; }