brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · 6de51f1 Raw
67 lines · cpp
1//===---------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===---------------------------------------------------------------------===//8 9#include "clang/CIR/Interfaces/CIRLoopOpInterface.h"10 11#include "clang/CIR/Dialect/IR/CIRDialect.h"12#include "clang/CIR/Interfaces/CIRLoopOpInterface.cpp.inc"13#include "llvm/Support/ErrorHandling.h"14 15namespace cir {16 17void LoopOpInterface::getLoopOpSuccessorRegions(18    LoopOpInterface op, mlir::RegionBranchPoint point,19    llvm::SmallVectorImpl<mlir::RegionSuccessor> &regions) {20  assert(point.isParent() || point.getTerminatorPredecessorOrNull());21 22  // Branching to first region: go to condition or body (do-while).23  if (point.isParent()) {24    regions.emplace_back(&op.getEntry(), op.getEntry().getArguments());25    return;26  }27 28  mlir::Region *parentRegion =29      point.getTerminatorPredecessorOrNull()->getParentRegion();30 31  // Branching from condition: go to body or exit.32  if (&op.getCond() == parentRegion) {33    regions.emplace_back(mlir::RegionSuccessor(op, op->getResults()));34    regions.emplace_back(&op.getBody(), op.getBody().getArguments());35    return;36  }37 38  // Branching from body: go to step (for) or condition.39  if (&op.getBody() == parentRegion) {40    // FIXME(cir): Should we consider break/continue statements here?41    mlir::Region *afterBody =42        (op.maybeGetStep() ? op.maybeGetStep() : &op.getCond());43    regions.emplace_back(afterBody, afterBody->getArguments());44    return;45  }46 47  // Branching from step: go to condition.48  if (op.maybeGetStep() == parentRegion) {49    regions.emplace_back(&op.getCond(), op.getCond().getArguments());50    return;51  }52 53  llvm_unreachable("unexpected branch origin");54}55 56/// Verify invariants of the LoopOpInterface.57llvm::LogicalResult detail::verifyLoopOpInterface(mlir::Operation *op) {58  // FIXME: fix this so the conditionop isn't requiring MLIRCIR59  // auto loopOp = mlir::cast<LoopOpInterface>(op);60  // if (!mlir::isa<ConditionOp>(loopOp.getCond().back().getTerminator()))61  //   return op->emitOpError(62  //       "expected condition region to terminate with 'cir.condition'");63  return llvm::success();64}65 66} // namespace cir67