void AliasCheckGenerator::printIslExpressions(const Scop &S) { BoundsMapT BoundsMap; unsigned int numAccs = 0; for (ScopStmt *Stmt : S) { for (MemoryAccess *Acc : *Stmt) { Map Access = isl::Map(Acc->getAccessRelation()); Set Domain = isl::Set(Stmt->getDomain()); const Set MemAccs = Domain.apply(Access); if (!BoundsMap.count(MemAccs)) { BoundsMap.insert(MemAccs); ++numAccs; } } } log(Debug, 2) << "Num Accesses: " << numAccs << " -> " << binomial_coefficient(numAccs, 2) << "\n"; BoundsMapT mapcp = BoundsMap; const Set ParamCtx = Set(S.getAssumedContext()); Set Cond = Set::universe(ParamCtx.getSpace()); for (const Set &s : BoundsMap) { BoundsMapT::iterator it = mapcp.find(s); if (it != mapcp.end()) { mapcp.erase(it); if (mapcp.size() > 0) { Cond = checkPairs(Cond, s, mapcp); } } } AstBuild Builder = AstBuild::fromContext(ParamCtx); PwAff Check = Cond.indicatorFunction(); AstExpr ExprCheck = Builder.exprFromPwAff(Check); log(Debug, 4) << "if (" << ExprCheck.toStr(Format::FC) << ")\n\n"; }
static bool RenderExpr(WasmRenderContext& c, AstExpr& expr) { switch (expr.kind()) { case AstExprKind::NullaryOperator: return RenderNullaryOperator(c, expr.as<AstNullaryOperator>()); case AstExprKind::Unreachable: return RenderUnreachable(c, expr.as<AstUnreachable>()); case AstExprKind::Call: return RenderCall(c, expr.as<AstCall>()); case AstExprKind::CallIndirect: return RenderCallIndirect(c, expr.as<AstCallIndirect>()); case AstExprKind::Const: return RenderConst(c, expr.as<AstConst>()); case AstExprKind::GetLocal: return RenderGetLocal(c, expr.as<AstGetLocal>()); case AstExprKind::SetLocal: return RenderSetLocal(c, expr.as<AstSetLocal>()); case AstExprKind::Block: return RenderBlock(c, expr.as<AstBlock>()); case AstExprKind::If: return RenderIf(c, expr.as<AstIf>()); case AstExprKind::UnaryOperator: return RenderUnaryOperator(c, expr.as<AstUnaryOperator>()); case AstExprKind::BinaryOperator: return RenderBinaryOperator(c, expr.as<AstBinaryOperator>()); case AstExprKind::TernaryOperator: return RenderTernaryOperator(c, expr.as<AstTernaryOperator>()); case AstExprKind::ComparisonOperator: return RenderComparisonOperator(c, expr.as<AstComparisonOperator>()); case AstExprKind::ConversionOperator: return RenderConversionOperator(c, expr.as<AstConversionOperator>()); case AstExprKind::Load: return RenderLoad(c, expr.as<AstLoad>()); case AstExprKind::Store: return RenderStore(c, expr.as<AstStore>()); case AstExprKind::Branch: return RenderBranch(c, expr.as<AstBranch>()); case AstExprKind::BranchTable: return RenderBrTable(c, expr.as<AstBranchTable>()); case AstExprKind::Return: return RenderReturn(c, expr.as<AstReturn>()); default: // Note: it's important not to remove this default since readExpr() // can return Expr values for which there is no enumerator. break; } return false; }
static bool RenderExpr(WasmRenderContext& c, AstExpr& expr, bool newLine /* = true */) { switch (expr.kind()) { case AstExprKind::Drop: if (!RenderDrop(c, expr.as<AstDrop>())) return false; break; case AstExprKind::Nop: if (!RenderNop(c, expr.as<AstNop>())) return false; break; case AstExprKind::Unreachable: if (!RenderUnreachable(c, expr.as<AstUnreachable>())) return false; break; case AstExprKind::Call: if (!RenderCall(c, expr.as<AstCall>())) return false; break; case AstExprKind::CallIndirect: if (!RenderCallIndirect(c, expr.as<AstCallIndirect>())) return false; break; case AstExprKind::Const: if (!RenderConst(c, expr.as<AstConst>())) return false; break; case AstExprKind::GetLocal: if (!RenderGetLocal(c, expr.as<AstGetLocal>())) return false; break; case AstExprKind::SetLocal: if (!RenderSetLocal(c, expr.as<AstSetLocal>())) return false; break; case AstExprKind::GetGlobal: if (!RenderGetGlobal(c, expr.as<AstGetGlobal>())) return false; break; case AstExprKind::SetGlobal: if (!RenderSetGlobal(c, expr.as<AstSetGlobal>())) return false; break; case AstExprKind::TeeLocal: if (!RenderTeeLocal(c, expr.as<AstTeeLocal>())) return false; break; case AstExprKind::Block: if (!RenderBlock(c, expr.as<AstBlock>())) return false; break; case AstExprKind::If: if (!RenderIf(c, expr.as<AstIf>())) return false; break; case AstExprKind::UnaryOperator: if (!RenderUnaryOperator(c, expr.as<AstUnaryOperator>())) return false; break; case AstExprKind::BinaryOperator: if (!RenderBinaryOperator(c, expr.as<AstBinaryOperator>())) return false; break; case AstExprKind::TernaryOperator: if (!RenderTernaryOperator(c, expr.as<AstTernaryOperator>())) return false; break; case AstExprKind::ComparisonOperator: if (!RenderComparisonOperator(c, expr.as<AstComparisonOperator>())) return false; break; case AstExprKind::ConversionOperator: if (!RenderConversionOperator(c, expr.as<AstConversionOperator>())) return false; break; case AstExprKind::Load: if (!RenderLoad(c, expr.as<AstLoad>())) return false; break; case AstExprKind::Store: if (!RenderStore(c, expr.as<AstStore>())) return false; break; case AstExprKind::Branch: if (!RenderBranch(c, expr.as<AstBranch>())) return false; break; case AstExprKind::BranchTable: if (!RenderBrTable(c, expr.as<AstBranchTable>())) return false; break; case AstExprKind::Return: if (!RenderReturn(c, expr.as<AstReturn>())) return false; break; case AstExprKind::First: newLine = false; if (!RenderFirst(c, expr.as<AstFirst>())) return false; break; case AstExprKind::CurrentMemory: if (!RenderCurrentMemory(c, expr.as<AstCurrentMemory>())) return false; break; case AstExprKind::GrowMemory: if (!RenderGrowMemory(c, expr.as<AstGrowMemory>())) return false; break; default: MOZ_CRASH("Bad AstExprKind"); } return !newLine || c.buffer.append("\n"); }
static bool RenderExpr(WasmRenderContext& c, AstExpr& expr, bool newLine /* = true */) { switch (expr.kind()) { case AstExprKind::Drop: if (!RenderDrop(c, expr.as<AstDrop>())) return false; break; case AstExprKind::Nop: if (!RenderNop(c, expr.as<AstNop>())) return false; break; case AstExprKind::Unreachable: if (!RenderUnreachable(c, expr.as<AstUnreachable>())) return false; break; case AstExprKind::Call: if (!RenderCall(c, expr.as<AstCall>())) return false; break; case AstExprKind::CallIndirect: if (!RenderCallIndirect(c, expr.as<AstCallIndirect>())) return false; break; case AstExprKind::Const: if (!RenderConst(c, expr.as<AstConst>())) return false; break; case AstExprKind::GetLocal: if (!RenderGetLocal(c, expr.as<AstGetLocal>())) return false; break; case AstExprKind::SetLocal: if (!RenderSetLocal(c, expr.as<AstSetLocal>())) return false; break; case AstExprKind::GetGlobal: if (!RenderGetGlobal(c, expr.as<AstGetGlobal>())) return false; break; case AstExprKind::SetGlobal: if (!RenderSetGlobal(c, expr.as<AstSetGlobal>())) return false; break; case AstExprKind::TeeLocal: if (!RenderTeeLocal(c, expr.as<AstTeeLocal>())) return false; break; case AstExprKind::Block: if (!RenderBlock(c, expr.as<AstBlock>())) return false; break; case AstExprKind::If: if (!RenderIf(c, expr.as<AstIf>())) return false; break; case AstExprKind::UnaryOperator: if (!RenderUnaryOperator(c, expr.as<AstUnaryOperator>())) return false; break; case AstExprKind::BinaryOperator: if (!RenderBinaryOperator(c, expr.as<AstBinaryOperator>())) return false; break; case AstExprKind::TernaryOperator: if (!RenderTernaryOperator(c, expr.as<AstTernaryOperator>())) return false; break; case AstExprKind::ComparisonOperator: if (!RenderComparisonOperator(c, expr.as<AstComparisonOperator>())) return false; break; case AstExprKind::ConversionOperator: if (!RenderConversionOperator(c, expr.as<AstConversionOperator>())) return false; break; case AstExprKind::Load: if (!RenderLoad(c, expr.as<AstLoad>())) return false; break; case AstExprKind::Store: if (!RenderStore(c, expr.as<AstStore>())) return false; break; case AstExprKind::Branch: if (!RenderBranch(c, expr.as<AstBranch>())) return false; break; case AstExprKind::BranchTable: if (!RenderBrTable(c, expr.as<AstBranchTable>())) return false; break; case AstExprKind::Return: if (!RenderReturn(c, expr.as<AstReturn>())) return false; break; case AstExprKind::First: newLine = false; if (!RenderFirst(c, expr.as<AstFirst>())) return false; break; case AstExprKind::CurrentMemory: if (!RenderCurrentMemory(c, expr.as<AstCurrentMemory>())) return false; break; case AstExprKind::GrowMemory: if (!RenderGrowMemory(c, expr.as<AstGrowMemory>())) return false; break; default: // Note: it's important not to remove this default since readExpr() // can return Expr values for which there is no enumerator. return Fail(c, "unexpected expression kind"); } return !newLine || c.buffer.append("\n"); }
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"; } }