[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
This commit is contained in:
Josh Mottley 2021-12-14 14:23:11 +00:00
parent 5d2b8fa155
commit ddac11aee6
6 changed files with 74 additions and 0 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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<mkRTKey(ArgumentCount)>(loc, builder);
return builder.create<fir::CallOp>(loc, argumentCountFunc).getResult(0);
}

View File

@ -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);
}

View File

@ -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