brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.0 KiB · 0ec91d5 Raw
49 lines · cpp
1//===-- DoLoopHelper.cpp --------------------------------------------------===//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 "flang/Optimizer/Builder/DoLoopHelper.h"10 11//===----------------------------------------------------------------------===//12// DoLoopHelper implementation13//===----------------------------------------------------------------------===//14 15fir::DoLoopOp16fir::factory::DoLoopHelper::createLoop(mlir::Value lb, mlir::Value ub,17                                       mlir::Value step,18                                       const BodyGenerator &bodyGenerator) {19  auto lbi = builder.convertToIndexType(loc, lb);20  auto ubi = builder.convertToIndexType(loc, ub);21  assert(step && "step must be an actual Value");22  auto inc = builder.convertToIndexType(loc, step);23  auto loop = fir::DoLoopOp::create(builder, loc, lbi, ubi, inc);24  auto insertPt = builder.saveInsertionPoint();25  builder.setInsertionPointToStart(loop.getBody());26  auto index = loop.getInductionVar();27  bodyGenerator(builder, index);28  builder.restoreInsertionPoint(insertPt);29  return loop;30}31 32fir::DoLoopOp33fir::factory::DoLoopHelper::createLoop(mlir::Value lb, mlir::Value ub,34                                       const BodyGenerator &bodyGenerator) {35  return createLoop(36      lb, ub, builder.createIntegerConstant(loc, builder.getIndexType(), 1),37      bodyGenerator);38}39 40fir::DoLoopOp41fir::factory::DoLoopHelper::createLoop(mlir::Value count,42                                       const BodyGenerator &bodyGenerator) {43  auto indexType = builder.getIndexType();44  auto zero = builder.createIntegerConstant(loc, indexType, 0);45  auto one = builder.createIntegerConstant(loc, count.getType(), 1);46  auto up = mlir::arith::SubIOp::create(builder, loc, count, one);47  return createLoop(zero, up, one, bodyGenerator);48}49