-
Notifications
You must be signed in to change notification settings - Fork 15.5k
[flang] restrict fir.convert lowering #172117
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
|
@llvm/pr-subscribers-flang-fir-hlfir @llvm/pr-subscribers-flang-codegen Author: Susan Tan (ス-ザン タン) (SusanTan) ChangesRestrict lowering of fir.convert and exclude core memref types from it. This is in preparation for a lowering that accommodates MemRef dialect. Full diff: https://github.com/llvm/llvm-project/pull/172117.diff 2 Files Affected:
diff --git a/flang/lib/Optimizer/CodeGen/CodeGen.cpp b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
index f96d45d3f6b66..012cddf291efd 100644
--- a/flang/lib/Optimizer/CodeGen/CodeGen.cpp
+++ b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
@@ -816,6 +816,16 @@ struct ConvertOpConversion : public fir::FIROpConversion<fir::ConvertOp> {
mlir::ConversionPatternRewriter &rewriter) const override {
auto fromFirTy = convert.getValue().getType();
auto toFirTy = convert.getRes().getType();
+
+ // Let more specialized conversions (e.g. FIR to memref
+ // converters) handle fir.convert when either side is a memref. This
+ // avoids interfering with descriptor-based flows such as fir.box /
+ // fir.box_addr and keeps this pattern focused on value conversions.
+ if (mlir::isa<mlir::MemRefType>(fromFirTy) ||
+ mlir::isa<mlir::MemRefType>(toFirTy)) {
+ return mlir::failure();
+ }
+
auto fromTy = convertType(fromFirTy);
auto toTy = convertType(toFirTy);
mlir::Value op0 = adaptor.getOperands()[0];
diff --git a/flang/test/Fir/convert-memref-codegen.mlir b/flang/test/Fir/convert-memref-codegen.mlir
new file mode 100644
index 0000000000000..4496af19e0f67
--- /dev/null
+++ b/flang/test/Fir/convert-memref-codegen.mlir
@@ -0,0 +1,15 @@
+// RUN: not fir-opt --fir-to-llvm-ir="target=x86_64-unknown-linux-gnu" %s -o - 2>&1 | FileCheck %s
+
+// This test ensures that the FIR CodeGen ConvertOpConversion
+// rejects fir.convert when either the source or the destination
+// type is a memref (i.e. it fails to legalize those ops).
+
+module {
+ // CHECK: error: failed to legalize operation 'fir.convert'
+ func.func @memref_to_ref_convert(%arg0: memref<f32>) {
+ %0 = fir.convert %arg0 : (memref<f32>) -> !fir.ref<f32>
+ return
+ }
+}
+
+
|
|
Would it be better that the current ConvertOp lowering pattern |
jeanPerier
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
| if (mlir::isa<mlir::MemRefType>(fromFirTy) || | ||
| mlir::isa<mlir::MemRefType>(toFirTy)) { | ||
| return mlir::failure(); | ||
| } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nit: no braces for single line if.
Isn't this what this change is doing? |
Restrict lowering of fir.convert and exclude core memref types from it. This is in preparation for a lowering that accommodates MemRef dialect.