diff options
author | Valentin Clement <clementval@gmail.com> | 2022-02-03 10:40:19 +0100 |
---|---|---|
committer | Valentin Clement <clementval@gmail.com> | 2022-02-03 11:10:30 +0100 |
commit | dc6a344637a6417aedf85e5fd1236e7fcd43c3f1 (patch) | |
tree | 6ad46573fb007d519bb830d4d6dc299b8c9fd7e0 /flang/lib/Lower/ConvertType.cpp | |
parent | d15e7dd1238df20e9c09cc91930f716e0d3d5b05 (diff) | |
download | llvm-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.cpp | 48 |
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( |