blob: 12901e9eb7a6d42d304842c0aa19a08e868093c9 [file] [log] [blame]
//===-- Lower/DoLoopHelper.h -- gen fir.do_loop ops -------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef FORTRAN_LOWER_DOLOOPHELPER_H
#define FORTRAN_LOWER_DOLOOPHELPER_H
#include "flang/Lower/FIRBuilder.h"
namespace Fortran::lower {
/// Helper to build fir.do_loop Ops.
class DoLoopHelper {
public:
explicit DoLoopHelper(FirOpBuilder &builder, mlir::Location loc)
: builder(builder), loc(loc) {}
DoLoopHelper(const DoLoopHelper &) = delete;
/// Type of a callback to generate the loop body.
using BodyGenerator = std::function<void(FirOpBuilder &, mlir::Value)>;
/// Build loop [\p lb, \p ub] with step \p step.
/// If \p step is an empty value, 1 is used for the step.
void createLoop(mlir::Value lb, mlir::Value ub, mlir::Value step,
const BodyGenerator &bodyGenerator);
/// Build loop [\p lb, \p ub] with step 1.
void createLoop(mlir::Value lb, mlir::Value ub,
const BodyGenerator &bodyGenerator);
/// Build loop [0, \p count) with step 1.
void createLoop(mlir::Value count, const BodyGenerator &bodyGenerator);
private:
FirOpBuilder &builder;
mlir::Location loc;
};
} // namespace Fortran::lower
#endif // FORTRAN_LOWER_DOLOOPHELPER_H