[flang] Upstream partial lowering of COMMAND_ARGUMENT_COUNT intrinsic
authorJosh Mottley <Josh.Mottley@arm.com>
Tue, 14 Dec 2021 14:23:11 +0000 (14:23 +0000)
committerJosh Mottley <Josh.Mottley@arm.com>
Mon, 31 Jan 2022 17:01:26 +0000 (17:01 +0000)
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
flang/include/flang/Optimizer/Builder/Runtime/Command.h [new file with mode: 0644]
flang/lib/Optimizer/Builder/CMakeLists.txt
flang/lib/Optimizer/Builder/Runtime/Command.cpp [new file with mode: 0644]
flang/unittests/Optimizer/Builder/Runtime/CommandTest.cpp [new file with mode: 0644]
flang/unittests/Optimizer/CMakeLists.txt

index ac2ed27..a4de869 100644 (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
diff --git a/flang/include/flang/Optimizer/Builder/Runtime/Command.h b/flang/include/flang/Optimizer/Builder/Runtime/Command.h
new file mode 100644 (file)
index 0000000..253a89e
--- /dev/null
@@ -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
index a7dc8de..c8f8da5 100644 (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
diff --git a/flang/lib/Optimizer/Builder/Runtime/Command.cpp b/flang/lib/Optimizer/Builder/Runtime/Command.cpp
new file mode 100644 (file)
index 0000000..9707c43
--- /dev/null
@@ -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);
+}
diff --git a/flang/unittests/Optimizer/Builder/Runtime/CommandTest.cpp b/flang/unittests/Optimizer/Builder/Runtime/CommandTest.cpp
new file mode 100644 (file)
index 0000000..00f2951
--- /dev/null
@@ -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);
+}
index 4edb24e..62a130c 100644 (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