[flang-commits] [flang] [flang][extension] support concatenation with absent optional (PR #112678)
via flang-commits
flang-commits at lists.llvm.org
Thu Oct 17 01:35:17 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-codegen
Author: None (jeanPerier)
<details>
<summary>Changes</summary>
Fix #<!-- -->112593 by adding support in lowering to concatenation with an absent optional _assumed length_ dummy argument because:
1. Most compilers seem to support it (most likely by accident).
2. This actually makes the compiler codegen simpler. Codegen was going out of its way to poke the LLVM optimizer bear by producing an undef argument for the length.
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:
- (modified) flang/lib/Optimizer/CodeGen/CodeGen.cpp (+1-13)
- (modified) flang/test/Fir/optional.fir (+1-1)
``````````diff
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
}
``````````
</details>
https://github.com/llvm/llvm-project/pull/112678
More information about the flang-commits
mailing list