[flang-commits] [flang] 282e471 - [flang] Erase `fir.local` ops before lowering `fir` to `llvm` (#143687)
via flang-commits
flang-commits at lists.llvm.org
Wed Jun 11 20:58:59 PDT 2025
Author: Kareem Ergawy
Date: 2025-06-12T05:58:55+02:00
New Revision: 282e471018d234f78b0990100834532389877519
URL: https://github.com/llvm/llvm-project/commit/282e471018d234f78b0990100834532389877519
DIFF: https://github.com/llvm/llvm-project/commit/282e471018d234f78b0990100834532389877519.diff
LOG: [flang] Erase `fir.local` ops before lowering `fir` to `llvm` (#143687)
`fir.local` ops are not supposed to have any uses at this point (i.e.
during lowering to LLVM). In case of serialization, the
`fir.do_concurrent` users are expected to have been lowered to
`fir.do_loop` nests. In case of parallelization, the `fir.do_concurrent`
users are expected to have been lowered to the target parallel model
(e.g. OpenMP).
This hopefully resolved a build issue introduced by
https://github.com/llvm/llvm-project/pull/142567 (see for example:
https://lab.llvm.org/buildbot/#/builders/199/builds/4009).
Added:
flang/test/Fir/local.fir
Modified:
flang/lib/Optimizer/CodeGen/CodeGen.cpp
Removed:
################################################################################
diff --git a/flang/lib/Optimizer/CodeGen/CodeGen.cpp b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
index 82d960a6fc61e..a3de3ae9d116a 100644
--- a/flang/lib/Optimizer/CodeGen/CodeGen.cpp
+++ b/flang/lib/Optimizer/CodeGen/CodeGen.cpp
@@ -3294,6 +3294,30 @@ struct LoadOpConversion : public fir::FIROpConversion<fir::LoadOp> {
}
};
+struct LocalitySpecifierOpConversion
+ : public fir::FIROpConversion<fir::LocalitySpecifierOp> {
+ using FIROpConversion::FIROpConversion;
+ llvm::LogicalResult
+ matchAndRewrite(fir::LocalitySpecifierOp localizer, OpAdaptor adaptor,
+ mlir::ConversionPatternRewriter &rewriter) const override {
+#ifdef EXPENSIVE_CHECKS
+ auto uses = mlir::SymbolTable::getSymbolUses(
+ localizer, localizer->getParentOfType<mlir::ModuleOp>());
+
+ // `fir.local` ops are not supposed to have any uses at this point (i.e.
+ // during lowering to LLVM). In case of serialization, the
+ // `fir.do_concurrent` users are expected to have been lowered to
+ // `fir.do_loop` nests. In case of parallelization, the `fir.do_concurrent`
+ // users are expected to have been lowered to the target parallel model
+ // (e.g. OpenMP).
+ assert(uses && uses->empty());
+#endif
+
+ rewriter.eraseOp(localizer);
+ return mlir::success();
+ }
+};
+
/// Lower `fir.no_reassoc` to LLVM IR dialect.
/// TODO: how do we want to enforce this in LLVM-IR? Can we manipulate the fast
/// math flags?
@@ -4249,15 +4273,15 @@ void fir::populateFIRToLLVMConversionPatterns(
FieldIndexOpConversion, FirEndOpConversion, FreeMemOpConversion,
GlobalLenOpConversion, GlobalOpConversion, InsertOnRangeOpConversion,
IsPresentOpConversion, LenParamIndexOpConversion, LoadOpConversion,
- MulcOpConversion, NegcOpConversion, NoReassocOpConversion,
- SelectCaseOpConversion, SelectOpConversion, SelectRankOpConversion,
- SelectTypeOpConversion, ShapeOpConversion, ShapeShiftOpConversion,
- ShiftOpConversion, SliceOpConversion, StoreOpConversion,
- StringLitOpConversion, SubcOpConversion, TypeDescOpConversion,
- TypeInfoOpConversion, UnboxCharOpConversion, UnboxProcOpConversion,
- UndefOpConversion, UnreachableOpConversion, XArrayCoorOpConversion,
- XEmboxOpConversion, XReboxOpConversion, ZeroOpConversion>(converter,
- options);
+ LocalitySpecifierOpConversion, MulcOpConversion, NegcOpConversion,
+ NoReassocOpConversion, SelectCaseOpConversion, SelectOpConversion,
+ SelectRankOpConversion, SelectTypeOpConversion, ShapeOpConversion,
+ ShapeShiftOpConversion, ShiftOpConversion, SliceOpConversion,
+ StoreOpConversion, StringLitOpConversion, SubcOpConversion,
+ TypeDescOpConversion, TypeInfoOpConversion, UnboxCharOpConversion,
+ UnboxProcOpConversion, UndefOpConversion, UnreachableOpConversion,
+ XArrayCoorOpConversion, XEmboxOpConversion, XReboxOpConversion,
+ ZeroOpConversion>(converter, options);
// Patterns that are populated without a type converter do not trigger
// target materializations for the operands of the root op.
diff --git a/flang/test/Fir/local.fir b/flang/test/Fir/local.fir
new file mode 100644
index 0000000000000..006f5ca944670
--- /dev/null
+++ b/flang/test/Fir/local.fir
@@ -0,0 +1,10 @@
+// RUN: fir-opt --fir-to-llvm-ir %s | FileCheck %s
+
+// Tests that `fir.local` ops are dropped from the module before LLVM lowering.
+
+fir.local {type = local} @local_privatizer : i32
+func.func @foo() {
+ return
+}
+
+// CHECK-NOT: fir.local
More information about the flang-commits
mailing list