[flang-commits] [flang] f523b9a - [flang] don't allow conversions between logical and floating point
Tom Eccles via flang-commits
flang-commits at lists.llvm.org
Mon Jun 19 02:14:37 PDT 2023
Author: Tom Eccles
Date: 2023-06-19T09:09:01Z
New Revision: f523b9a55a3adecf1a8373ca7525630bdd7fb5ef
URL: https://github.com/llvm/llvm-project/commit/f523b9a55a3adecf1a8373ca7525630bdd7fb5ef
DIFF: https://github.com/llvm/llvm-project/commit/f523b9a55a3adecf1a8373ca7525630bdd7fb5ef.diff
LOG: [flang] don't allow conversions between logical and floating point
Codegen only supports conversions between logicals and integers. The
verifier should reflect this.
Differential Revision: https://reviews.llvm.org/D152935
Added:
Modified:
flang/include/flang/Optimizer/Dialect/FIROps.td
flang/lib/Optimizer/Dialect/FIROps.cpp
flang/test/Fir/invalid.fir
Removed:
################################################################################
diff --git a/flang/include/flang/Optimizer/Dialect/FIROps.td b/flang/include/flang/Optimizer/Dialect/FIROps.td
index c9d68f1e1cf90..8b05c97360607 100644
--- a/flang/include/flang/Optimizer/Dialect/FIROps.td
+++ b/flang/include/flang/Optimizer/Dialect/FIROps.td
@@ -2606,6 +2606,7 @@ def fir_ConvertOp : fir_OneResultOp<"convert", [NoMemoryEffect]> {
let hasVerifier = 1;
let extraClassDeclaration = [{
+ static bool isInteger(mlir::Type ty);
static bool isIntegerCompatible(mlir::Type ty);
static bool isFloatCompatible(mlir::Type ty);
static bool isPointerCompatible(mlir::Type ty);
diff --git a/flang/lib/Optimizer/Dialect/FIROps.cpp b/flang/lib/Optimizer/Dialect/FIROps.cpp
index e796f2c385d95..7f899a2937987 100644
--- a/flang/lib/Optimizer/Dialect/FIROps.cpp
+++ b/flang/lib/Optimizer/Dialect/FIROps.cpp
@@ -928,9 +928,12 @@ mlir::OpFoldResult fir::ConvertOp::fold(FoldAdaptor adaptor) {
return {};
}
+bool fir::ConvertOp::isInteger(mlir::Type ty) {
+ return ty.isa<mlir::IntegerType, mlir::IndexType, fir::IntegerType>();
+}
+
bool fir::ConvertOp::isIntegerCompatible(mlir::Type ty) {
- return ty.isa<mlir::IntegerType, mlir::IndexType, fir::IntegerType,
- fir::LogicalType>();
+ return isInteger(ty) || mlir::isa<fir::LogicalType>(ty);
}
bool fir::ConvertOp::isFloatCompatible(mlir::Type ty) {
@@ -1001,8 +1004,8 @@ bool fir::ConvertOp::canBeConverted(mlir::Type inType, mlir::Type outType) {
return true;
return (isPointerCompatible(inType) && isPointerCompatible(outType)) ||
(isIntegerCompatible(inType) && isIntegerCompatible(outType)) ||
- (isIntegerCompatible(inType) && isFloatCompatible(outType)) ||
- (isFloatCompatible(inType) && isIntegerCompatible(outType)) ||
+ (isInteger(inType) && isFloatCompatible(outType)) ||
+ (isFloatCompatible(inType) && isInteger(outType)) ||
(isFloatCompatible(inType) && isFloatCompatible(outType)) ||
(isIntegerCompatible(inType) && isPointerCompatible(outType)) ||
(isPointerCompatible(inType) && isIntegerCompatible(outType)) ||
diff --git a/flang/test/Fir/invalid.fir b/flang/test/Fir/invalid.fir
index c01bcc809d341..c3bfb6922deda 100644
--- a/flang/test/Fir/invalid.fir
+++ b/flang/test/Fir/invalid.fir
@@ -946,3 +946,19 @@ func.func @invalid_selector(%arg : !fir.box<!fir.ref<i32>>) -> i32 {
%zero = arith.constant 0 : i32
return %zero : i32
}
+
+// -----
+
+func.func @logical_to_fp(%arg0: !fir.logical<4>) -> f32 {
+ // expected-error at +1{{'fir.convert' op invalid type conversion}}
+ %0 = fir.convert %arg0 : (!fir.logical<4>) -> f32
+ return %0 : f32
+}
+
+// -----
+
+func.func @fp_to_logical(%arg0: f32) -> !fir.logical<4> {
+ // expected-error at +1{{'fir.convert' op invalid type conversion}}
+ %0 = fir.convert %arg0 : (f32) -> !fir.logical<4>
+ return %0 : !fir.logical<4>
+}
More information about the flang-commits
mailing list