-
Notifications
You must be signed in to change notification settings - Fork 14.3k
[flang][extension] support concatenation with absent optional #112678
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
Conversation
@llvm/pr-subscribers-flang-fir-hlfir Author: None (jeanPerier) ChangesFix #112593 by adding support in lowering to concatenation with an absent optional assumed length dummy argument because:
I insist on the fact that no compiler support this with explicit length optional arguments and the executable will segafult and I would discourage users from using that "feature" because runtime checks for bad optional dereference will kick when used (For instance, "nagfor -C=present" will produce an executable that abort with an error message . Flang does not have such runtime check option so far). Full diff: https://github.com/llvm/llvm-project/pull/112678.diff 2 Files Affected:
diff --git a/flang/lib/Optimizer/CodeGen/CodeGen.cpp b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
index 9b624efa053813..68b8c6613585e6 100644
--- a/flang/lib/Optimizer/CodeGen/CodeGen.cpp
+++ b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
@@ -3373,19 +3373,7 @@ struct AbsentOpConversion : public fir::FIROpConversion<fir::AbsentOp> {
matchAndRewrite(fir::AbsentOp absent, OpAdaptor,
mlir::ConversionPatternRewriter &rewriter) const override {
mlir::Type ty = convertType(absent.getType());
- mlir::Location loc = absent.getLoc();
-
- if (mlir::isa<fir::BoxCharType>(absent.getType())) {
- auto structTy = mlir::cast<mlir::LLVM::LLVMStructType>(ty);
- assert(!structTy.isOpaque() && !structTy.getBody().empty());
- auto undefStruct = rewriter.create<mlir::LLVM::UndefOp>(loc, ty);
- auto nullField =
- rewriter.create<mlir::LLVM::ZeroOp>(loc, structTy.getBody()[0]);
- rewriter.replaceOpWithNewOp<mlir::LLVM::InsertValueOp>(
- absent, undefStruct, nullField, 0);
- } else {
- rewriter.replaceOpWithNewOp<mlir::LLVM::ZeroOp>(absent, ty);
- }
+ rewriter.replaceOpWithNewOp<mlir::LLVM::ZeroOp>(absent, ty);
return mlir::success();
}
};
diff --git a/flang/test/Fir/optional.fir b/flang/test/Fir/optional.fir
index 3b350d6fa94195..bded8b5332a300 100644
--- a/flang/test/Fir/optional.fir
+++ b/flang/test/Fir/optional.fir
@@ -47,7 +47,7 @@ func.func @foo3(%arg0: !fir.boxchar<1>) -> i1 {
// CHECK-LABEL: @bar3
func.func @bar3() -> i1 {
%0 = fir.absent !fir.boxchar<1>
- // CHECK: call i1 @foo3(ptr null, i64 undef)
+ // CHECK: call i1 @foo3(ptr null, i64 0)
%1 = fir.call @foo3(%0) : (!fir.boxchar<1>) -> i1
return %1 : i1
}
|
@llvm/pr-subscribers-flang-codegen Author: None (jeanPerier) ChangesFix #112593 by adding support in lowering to concatenation with an absent optional assumed length dummy argument because:
I insist on the fact that no compiler support this with explicit length optional arguments and the executable will segafult and I would discourage users from using that "feature" because runtime checks for bad optional dereference will kick when used (For instance, "nagfor -C=present" will produce an executable that abort with an error message . Flang does not have such runtime check option so far). Full diff: https://github.com/llvm/llvm-project/pull/112678.diff 2 Files Affected:
diff --git a/flang/lib/Optimizer/CodeGen/CodeGen.cpp b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
index 9b624efa053813..68b8c6613585e6 100644
--- a/flang/lib/Optimizer/CodeGen/CodeGen.cpp
+++ b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
@@ -3373,19 +3373,7 @@ struct AbsentOpConversion : public fir::FIROpConversion<fir::AbsentOp> {
matchAndRewrite(fir::AbsentOp absent, OpAdaptor,
mlir::ConversionPatternRewriter &rewriter) const override {
mlir::Type ty = convertType(absent.getType());
- mlir::Location loc = absent.getLoc();
-
- if (mlir::isa<fir::BoxCharType>(absent.getType())) {
- auto structTy = mlir::cast<mlir::LLVM::LLVMStructType>(ty);
- assert(!structTy.isOpaque() && !structTy.getBody().empty());
- auto undefStruct = rewriter.create<mlir::LLVM::UndefOp>(loc, ty);
- auto nullField =
- rewriter.create<mlir::LLVM::ZeroOp>(loc, structTy.getBody()[0]);
- rewriter.replaceOpWithNewOp<mlir::LLVM::InsertValueOp>(
- absent, undefStruct, nullField, 0);
- } else {
- rewriter.replaceOpWithNewOp<mlir::LLVM::ZeroOp>(absent, ty);
- }
+ rewriter.replaceOpWithNewOp<mlir::LLVM::ZeroOp>(absent, ty);
return mlir::success();
}
};
diff --git a/flang/test/Fir/optional.fir b/flang/test/Fir/optional.fir
index 3b350d6fa94195..bded8b5332a300 100644
--- a/flang/test/Fir/optional.fir
+++ b/flang/test/Fir/optional.fir
@@ -47,7 +47,7 @@ func.func @foo3(%arg0: !fir.boxchar<1>) -> i1 {
// CHECK-LABEL: @bar3
func.func @bar3() -> i1 {
%0 = fir.absent !fir.boxchar<1>
- // CHECK: call i1 @foo3(ptr null, i64 undef)
+ // CHECK: call i1 @foo3(ptr null, i64 0)
%1 = fir.call @foo3(%0) : (!fir.boxchar<1>) -> i1
return %1 : i1
}
|
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
Thank you very much for the quick fix @jeanPerier ! |
Fix #112593 by adding support in lowering to concatenation with an absent optional assumed length dummy argument because:
I insist on the fact that no compiler support this with explicit length optional arguments and the executable will segafult and I would discourage users from using that "feature" because runtime checks for bad optional dereference will kick when used (For instance, "nagfor -C=present" will produce an executable that abort with an error message . Flang does not have such runtime check option so far).