From ddac11aee6494cc91994d5205afd62e2999d3e8c Mon Sep 17 00:00:00 2001 From: Josh Mottley Date: Tue, 14 Dec 2021 14:23:11 +0000 Subject: [PATCH] [flang] Upstream partial lowering of COMMAND_ARGUMENT_COUNT intrinsic This patch adds partial lowering of the "COMMAND_ARGUMENT_COUNT" intrinsic to the backend runtime hook implemented in patch D109048. Also adds a "helper" function for retrieving the default integer type from FIRBuilder, which will be used later when finishing the lowering of intrinsic. Differential Revision: https://reviews.llvm.org/D117869 --- flang/include/flang/Optimizer/Builder/FIRBuilder.h | 6 +++++ .../flang/Optimizer/Builder/Runtime/Command.h | 27 ++++++++++++++++++++++ flang/lib/Optimizer/Builder/CMakeLists.txt | 1 + flang/lib/Optimizer/Builder/Runtime/Command.cpp | 21 +++++++++++++++++ .../Optimizer/Builder/Runtime/CommandTest.cpp | 18 +++++++++++++++ flang/unittests/Optimizer/CMakeLists.txt | 1 + 6 files changed, 74 insertions(+) create mode 100644 flang/include/flang/Optimizer/Builder/Runtime/Command.h create mode 100644 flang/lib/Optimizer/Builder/Runtime/Command.cpp create mode 100644 flang/unittests/Optimizer/Builder/Runtime/CommandTest.cpp diff --git a/flang/include/flang/Optimizer/Builder/FIRBuilder.h b/flang/include/flang/Optimizer/Builder/FIRBuilder.h index ac2ed27..a4de869 100644 --- a/flang/include/flang/Optimizer/Builder/FIRBuilder.h +++ b/flang/include/flang/Optimizer/Builder/FIRBuilder.h @@ -57,6 +57,12 @@ public: /// Get a reference to the kind map. const fir::KindMapping &getKindMap() { return kindMap; } + /// Get the default integer type + [[maybe_unused]] mlir::IntegerType getDefaultIntegerType() { + return getIntegerType( + getKindMap().getIntegerBitsize(getKindMap().defaultIntegerKind())); + } + /// The LHS and RHS are not always in agreement in terms of /// type. In some cases, the disagreement is between COMPLEX and other scalar /// types. In that case, the conversion must insert/extract out of a COMPLEX diff --git a/flang/include/flang/Optimizer/Builder/Runtime/Command.h b/flang/include/flang/Optimizer/Builder/Runtime/Command.h new file mode 100644 index 0000000..253a89e --- /dev/null +++ b/flang/include/flang/Optimizer/Builder/Runtime/Command.h @@ -0,0 +1,27 @@ +//===-- Command.cpp -- generate command line 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 +// +//===----------------------------------------------------------------------===// + +#ifndef FORTRAN_OPTIMIZER_BUILDER_RUNTIME_COMMAND_H +#define FORTRAN_OPTIMIZER_BUILDER_RUNTIME_COMMAND_H + +namespace mlir { +class Value; +class Location; +} // namespace mlir + +namespace fir { +class FirOpBuilder; +} + +namespace fir::runtime { + +/// Generate call to COMMAND_ARGUMENT_COUNT intrinsic runtime routine. +mlir::Value genCommandArgumentCount(fir::FirOpBuilder &, mlir::Location); + +} // namespace fir::runtime +#endif // FORTRAN_OPTIMIZER_BUILDER_RUNTIME_COMMAND_H diff --git a/flang/lib/Optimizer/Builder/CMakeLists.txt b/flang/lib/Optimizer/Builder/CMakeLists.txt index a7dc8de..c8f8da5 100644 --- a/flang/lib/Optimizer/Builder/CMakeLists.txt +++ b/flang/lib/Optimizer/Builder/CMakeLists.txt @@ -9,6 +9,7 @@ add_flang_library(FIRBuilder MutableBox.cpp Runtime/Assign.cpp Runtime/Character.cpp + Runtime/Command.cpp Runtime/Derived.cpp Runtime/Numeric.cpp Runtime/Ragged.cpp diff --git a/flang/lib/Optimizer/Builder/Runtime/Command.cpp b/flang/lib/Optimizer/Builder/Runtime/Command.cpp new file mode 100644 index 0000000..9707c43 --- /dev/null +++ b/flang/lib/Optimizer/Builder/Runtime/Command.cpp @@ -0,0 +1,21 @@ +//===-- Command.cpp -- generate command line 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/Command.h" +#include "flang/Optimizer/Builder/FIRBuilder.h" +#include "flang/Optimizer/Builder/Runtime/RTBuilder.h" +#include "flang/Runtime/command.h" + +using namespace Fortran::runtime; + +mlir::Value fir::runtime::genCommandArgumentCount(fir::FirOpBuilder &builder, + mlir::Location loc) { + auto argumentCountFunc = + fir::runtime::getRuntimeFunc(loc, builder); + return builder.create(loc, argumentCountFunc).getResult(0); +} diff --git a/flang/unittests/Optimizer/Builder/Runtime/CommandTest.cpp b/flang/unittests/Optimizer/Builder/Runtime/CommandTest.cpp new file mode 100644 index 0000000..00f2951 --- /dev/null +++ b/flang/unittests/Optimizer/Builder/Runtime/CommandTest.cpp @@ -0,0 +1,18 @@ +//===- CommandTest.cpp -- command line 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/Command.h" +#include "RuntimeCallTestBase.h" +#include "gtest/gtest.h" + +TEST_F(RuntimeCallTest, genCommandArgumentCountTest) { + mlir::Location loc = firBuilder->getUnknownLoc(); + mlir::Value result = fir::runtime::genCommandArgumentCount(*firBuilder, loc); + checkCallOp(result.getDefiningOp(), "_FortranAArgumentCount", /*nbArgs=*/0, + /*addLocArgs=*/false); +} diff --git a/flang/unittests/Optimizer/CMakeLists.txt b/flang/unittests/Optimizer/CMakeLists.txt index 4edb24e..62a130c 100644 --- a/flang/unittests/Optimizer/CMakeLists.txt +++ b/flang/unittests/Optimizer/CMakeLists.txt @@ -14,6 +14,7 @@ add_flang_unittest(FlangOptimizerTests Builder/DoLoopHelperTest.cpp Builder/FIRBuilderTest.cpp Builder/Runtime/AssignTest.cpp + Builder/Runtime/CommandTest.cpp Builder/Runtime/CharacterTest.cpp Builder/Runtime/DerivedTest.cpp Builder/Runtime/NumericTest.cpp -- 2.7.4