Exemple #1
0
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");
}
Exemple #5
0
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";
  }
}