Generate temporary storage inside WHERE and FORALL using the temporary stack runtime. This covers all cases outside of LHS temporary, where the descriptor stack will have to be used. Reviewed By: vzakhari Differential Revision: https://reviews.llvm.org/D151251
59 lines
2.8 KiB
C++
59 lines
2.8 KiB
C++
//===- TemporaryStack.cpp ---- temporary stack runtime API calls ----------===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "flang/Optimizer/Builder/Runtime/TemporaryStack.h"
|
|
#include "flang/Optimizer/Builder/FIRBuilder.h"
|
|
#include "flang/Optimizer/Builder/Runtime/RTBuilder.h"
|
|
#include "flang/Runtime/temporary-stack.h"
|
|
|
|
using namespace Fortran::runtime;
|
|
|
|
mlir::Value fir::runtime::genCreateValueStack(mlir::Location loc,
|
|
fir::FirOpBuilder &builder) {
|
|
mlir::func::FuncOp func =
|
|
fir::runtime::getRuntimeFunc<mkRTKey(CreateValueStack)>(loc, builder);
|
|
mlir::FunctionType funcType = func.getFunctionType();
|
|
mlir::Value sourceFile = fir::factory::locationToFilename(builder, loc);
|
|
mlir::Value sourceLine =
|
|
fir::factory::locationToLineNo(builder, loc, funcType.getInput(1));
|
|
auto args = fir::runtime::createArguments(builder, loc, funcType, sourceFile,
|
|
sourceLine);
|
|
return builder.create<fir::CallOp>(loc, func, args).getResult(0);
|
|
}
|
|
|
|
void fir::runtime::genPushValue(mlir::Location loc, fir::FirOpBuilder &builder,
|
|
mlir::Value opaquePtr, mlir::Value boxValue) {
|
|
mlir::func::FuncOp func =
|
|
fir::runtime::getRuntimeFunc<mkRTKey(PushValue)>(loc, builder);
|
|
mlir::FunctionType funcType = func.getFunctionType();
|
|
auto args = fir::runtime::createArguments(builder, loc, funcType, opaquePtr,
|
|
boxValue);
|
|
builder.create<fir::CallOp>(loc, func, args);
|
|
}
|
|
|
|
void fir::runtime::genValueAt(mlir::Location loc, fir::FirOpBuilder &builder,
|
|
mlir::Value opaquePtr, mlir::Value i,
|
|
mlir::Value retValueBox) {
|
|
mlir::func::FuncOp func =
|
|
fir::runtime::getRuntimeFunc<mkRTKey(ValueAt)>(loc, builder);
|
|
mlir::FunctionType funcType = func.getFunctionType();
|
|
auto args = fir::runtime::createArguments(builder, loc, funcType, opaquePtr,
|
|
i, retValueBox);
|
|
builder.create<fir::CallOp>(loc, func, args);
|
|
}
|
|
|
|
void fir::runtime::genDestroyValueStack(mlir::Location loc,
|
|
fir::FirOpBuilder &builder,
|
|
mlir::Value opaquePtr) {
|
|
mlir::func::FuncOp func =
|
|
fir::runtime::getRuntimeFunc<mkRTKey(DestroyValueStack)>(loc, builder);
|
|
mlir::FunctionType funcType = func.getFunctionType();
|
|
auto args = fir::runtime::createArguments(builder, loc, funcType, opaquePtr);
|
|
builder.create<fir::CallOp>(loc, func, args);
|
|
}
|