aboutsummaryrefslogtreecommitdiff
path: root/flang/lib/Lower/ConvertType.cpp
diff options
context:
space:
mode:
authorValentin Clement <clementval@gmail.com>2022-02-03 10:40:19 +0100
committerValentin Clement <clementval@gmail.com>2022-02-03 11:10:30 +0100
commitdc6a344637a6417aedf85e5fd1236e7fcd43c3f1 (patch)
tree6ad46573fb007d519bb830d4d6dc299b8c9fd7e0 /flang/lib/Lower/ConvertType.cpp
parentd15e7dd1238df20e9c09cc91930f716e0d3d5b05 (diff)
downloadllvm-dc6a344637a6417aedf85e5fd1236e7fcd43c3f1.zip
llvm-dc6a344637a6417aedf85e5fd1236e7fcd43c3f1.tar.gz
llvm-dc6a344637a6417aedf85e5fd1236e7fcd43c3f1.tar.bz2
[flang] Add lowering for integer constant
This patch enables the lowering of integer constant. The `ScalarExprLowering` class is introduced in `ConvertExpr.cpp` to help the lowering of expression. This patch adds all the placeholder as well for future expression lowering with the appropriate TODOs. Integer constant expression are lowered to `arith.constant` with an integer type corresponding to the kind value. This patch is in support of D118787 This patch is part of the upstreaming effort from fir-dev branch. Reviewed By: schweitz, kiranchandramohan Differential Revision: https://reviews.llvm.org/D118786
Diffstat (limited to 'flang/lib/Lower/ConvertType.cpp')
-rw-r--r--flang/lib/Lower/ConvertType.cpp48
1 files changed, 43 insertions, 5 deletions
diff --git a/flang/lib/Lower/ConvertType.cpp b/flang/lib/Lower/ConvertType.cpp
index 299b9e3..a411c0f 100644
--- a/flang/lib/Lower/ConvertType.cpp
+++ b/flang/lib/Lower/ConvertType.cpp
@@ -475,11 +475,49 @@ private:
} // namespace
-mlir::Type Fortran::lower::getFIRType(
- mlir::MLIRContext *context,
- const Fortran::common::IntrinsicTypeDefaultKinds &defaults,
- Fortran::common::TypeCategory tc, int kind) {
- return TypeBuilder{context, defaults}.genFIRTy(tc, kind);
+template <int KIND>
+int getIntegerBits() {
+ return Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer,
+ KIND>::Scalar::bits;
+}
+static mlir::Type genIntegerType(mlir::MLIRContext *context, int kind) {
+ if (Fortran::evaluate::IsValidKindOfIntrinsicType(
+ Fortran::common::TypeCategory::Integer, kind)) {
+ switch (kind) {
+ case 1:
+ return mlir::IntegerType::get(context, getIntegerBits<1>());
+ case 2:
+ return mlir::IntegerType::get(context, getIntegerBits<2>());
+ case 4:
+ return mlir::IntegerType::get(context, getIntegerBits<4>());
+ case 8:
+ return mlir::IntegerType::get(context, getIntegerBits<8>());
+ case 16:
+ return mlir::IntegerType::get(context, getIntegerBits<16>());
+ }
+ }
+ llvm_unreachable("INTEGER kind not translated");
+}
+
+static mlir::Type genFIRType(mlir::MLIRContext *context,
+ Fortran::common::TypeCategory tc, int kind) {
+ switch (tc) {
+ case Fortran::common::TypeCategory::Integer:
+ return genIntegerType(context, kind);
+ case Fortran::common::TypeCategory::Real:
+ case Fortran::common::TypeCategory::Complex:
+ case Fortran::common::TypeCategory::Logical:
+ case Fortran::common::TypeCategory::Character:
+ default:
+ break;
+ }
+ llvm_unreachable("unhandled type category");
+}
+
+mlir::Type Fortran::lower::getFIRType(mlir::MLIRContext *context,
+ Fortran::common::TypeCategory tc,
+ int kind) {
+ return genFIRType(context, tc, kind);
}
mlir::Type Fortran::lower::getFIRType(