Skip to content

Commit

Permalink
[flang] Upstream partial lowering of EXIT intrinsic
Browse files Browse the repository at this point in the history
This patch adds partial lowering of the "EXIT" intrinsic to
the backend runtime hook implemented in patch D110741. It also adds a
helper function to the `RuntimeCallTestBase.h` for testing for an
intrinsic function call in a `mlir::Block`.

Differential Revision: https://reviews.llvm.org/D118141
  • Loading branch information
Sezoir committed Feb 1, 2022
1 parent 7518d38 commit ce8022f
Show file tree
Hide file tree
Showing 6 changed files with 91 additions and 0 deletions.
27 changes: 27 additions & 0 deletions flang/include/flang/Optimizer/Builder/Runtime/Stop.h
@@ -0,0 +1,27 @@
//===-- Stop.h - generate stop runtime API calls ----------------*- 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_OPTIMIZER_BUILDER_RUNTIME_STOP_H
#define FORTRAN_OPTIMIZER_BUILDER_RUNTIME_STOP_H

namespace mlir {
class Value;
class Location;
} // namespace mlir

namespace fir {
class FirOpBuilder;
}

namespace fir::runtime {

/// Generate call to EXIT intrinsic runtime routine.
void genExit(fir::FirOpBuilder &, mlir::Location, mlir::Value status);

} // namespace fir::runtime
#endif // FORTRAN_OPTIMIZER_BUILDER_RUNTIME_STOP_H
1 change: 1 addition & 0 deletions flang/lib/Optimizer/Builder/CMakeLists.txt
Expand Up @@ -14,6 +14,7 @@ add_flang_library(FIRBuilder
Runtime/Numeric.cpp
Runtime/Ragged.cpp
Runtime/Reduction.cpp
Runtime/Stop.cpp
Runtime/Transformational.cpp

DEPENDS
Expand Down
22 changes: 22 additions & 0 deletions flang/lib/Optimizer/Builder/Runtime/Stop.cpp
@@ -0,0 +1,22 @@
//===-- Stop.h - generate stop runtime API calls ----------------*- 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
//
//===----------------------------------------------------------------------===//

#include "flang/Optimizer/Builder/Runtime/Stop.h"
#include "flang/Optimizer/Builder/FIRBuilder.h"
#include "flang/Optimizer/Builder/Runtime/RTBuilder.h"
#include "flang/Runtime/stop.h"

using namespace Fortran::runtime;

void fir::runtime::genExit(fir::FirOpBuilder &builder, mlir::Location loc,
mlir::Value status) {
auto exitFunc = fir::runtime::getRuntimeFunc<mkRTKey(Exit)>(loc, builder);
llvm::SmallVector<mlir::Value> args =
fir::runtime::createArguments(builder, loc, exitFunc.getType(), status);
builder.create<fir::CallOp>(loc, exitFunc, args);
}
20 changes: 20 additions & 0 deletions flang/unittests/Optimizer/Builder/Runtime/RuntimeCallTestBase.h
Expand Up @@ -120,4 +120,24 @@ static inline void checkCallOpFromResultBox(mlir::Value result,
checkCallOpFromResultBox(convOp.getResult(), fctName, nbArgs, addLocArgs);
}

/// Check the operations in \p block for a `fir::CallOp` operation where the
/// function being called shares its function name with \p fctName and the
/// number of arguments is equal to \p nbArgs. Note that this check only cares
/// if the operation exists, and not the order in when the operation is called.
/// This results in exiting the test as soon as the first correct instance of
/// `fir::CallOp` is found).
static inline void checkBlockForCallOp(
mlir::Block *block, llvm::StringRef fctName, unsigned nbArgs) {
assert(block && "mlir::Block given is a nullptr");
for (auto &op : block->getOperations()) {
if (auto callOp = mlir::dyn_cast<fir::CallOp>(op)) {
if (fctName == callOp.callee()->getRootReference().getValue()) {
EXPECT_EQ(nbArgs, callOp.args().size());
return;
}
}
}
FAIL() << "No calls to " << fctName << " were found!";
}

#endif // FORTRAN_OPTIMIZER_BUILDER_RUNTIME_RUNTIMECALLTESTBASE_H
20 changes: 20 additions & 0 deletions flang/unittests/Optimizer/Builder/Runtime/StopTest.cpp
@@ -0,0 +1,20 @@
//===- StopTest.cpp -- Stop runtime builder unit tests ---------===//
//
// 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/Stop.h"
#include "RuntimeCallTestBase.h"
#include "gtest/gtest.h"

TEST_F(RuntimeCallTest, genExitTest) {
mlir::Location loc = firBuilder->getUnknownLoc();
mlir::Value status = firBuilder->createIntegerConstant(loc, i32Ty, 0);
fir::runtime::genExit(*firBuilder, loc, status);
mlir::Block *block = firBuilder->getBlock();
EXPECT_TRUE(block) << "Failed to retrieve the block!";
checkBlockForCallOp(block, "_FortranAExit", 1);
}
1 change: 1 addition & 0 deletions flang/unittests/Optimizer/CMakeLists.txt
Expand Up @@ -20,6 +20,7 @@ add_flang_unittest(FlangOptimizerTests
Builder/Runtime/NumericTest.cpp
Builder/Runtime/RaggedTest.cpp
Builder/Runtime/ReductionTest.cpp
Builder/Runtime/StopTest.cpp
Builder/Runtime/TransformationalTest.cpp
FIRContextTest.cpp
InternalNamesTest.cpp
Expand Down

0 comments on commit ce8022f

Please sign in to comment.