Skip to content

Commit 282e471

Browse files
authored
[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 #142567 (see for example: https://lab.llvm.org/buildbot/#/builders/199/builds/4009).
1 parent f09050f commit 282e471

File tree

2 files changed

+43
-9
lines changed

2 files changed

+43
-9
lines changed

flang/lib/Optimizer/CodeGen/CodeGen.cpp

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3294,6 +3294,30 @@ struct LoadOpConversion : public fir::FIROpConversion<fir::LoadOp> {
32943294
}
32953295
};
32963296

3297+
struct LocalitySpecifierOpConversion
3298+
: public fir::FIROpConversion<fir::LocalitySpecifierOp> {
3299+
using FIROpConversion::FIROpConversion;
3300+
llvm::LogicalResult
3301+
matchAndRewrite(fir::LocalitySpecifierOp localizer, OpAdaptor adaptor,
3302+
mlir::ConversionPatternRewriter &rewriter) const override {
3303+
#ifdef EXPENSIVE_CHECKS
3304+
auto uses = mlir::SymbolTable::getSymbolUses(
3305+
localizer, localizer->getParentOfType<mlir::ModuleOp>());
3306+
3307+
// `fir.local` ops are not supposed to have any uses at this point (i.e.
3308+
// during lowering to LLVM). In case of serialization, the
3309+
// `fir.do_concurrent` users are expected to have been lowered to
3310+
// `fir.do_loop` nests. In case of parallelization, the `fir.do_concurrent`
3311+
// users are expected to have been lowered to the target parallel model
3312+
// (e.g. OpenMP).
3313+
assert(uses && uses->empty());
3314+
#endif
3315+
3316+
rewriter.eraseOp(localizer);
3317+
return mlir::success();
3318+
}
3319+
};
3320+
32973321
/// Lower `fir.no_reassoc` to LLVM IR dialect.
32983322
/// TODO: how do we want to enforce this in LLVM-IR? Can we manipulate the fast
32993323
/// math flags?
@@ -4249,15 +4273,15 @@ void fir::populateFIRToLLVMConversionPatterns(
42494273
FieldIndexOpConversion, FirEndOpConversion, FreeMemOpConversion,
42504274
GlobalLenOpConversion, GlobalOpConversion, InsertOnRangeOpConversion,
42514275
IsPresentOpConversion, LenParamIndexOpConversion, LoadOpConversion,
4252-
MulcOpConversion, NegcOpConversion, NoReassocOpConversion,
4253-
SelectCaseOpConversion, SelectOpConversion, SelectRankOpConversion,
4254-
SelectTypeOpConversion, ShapeOpConversion, ShapeShiftOpConversion,
4255-
ShiftOpConversion, SliceOpConversion, StoreOpConversion,
4256-
StringLitOpConversion, SubcOpConversion, TypeDescOpConversion,
4257-
TypeInfoOpConversion, UnboxCharOpConversion, UnboxProcOpConversion,
4258-
UndefOpConversion, UnreachableOpConversion, XArrayCoorOpConversion,
4259-
XEmboxOpConversion, XReboxOpConversion, ZeroOpConversion>(converter,
4260-
options);
4276+
LocalitySpecifierOpConversion, MulcOpConversion, NegcOpConversion,
4277+
NoReassocOpConversion, SelectCaseOpConversion, SelectOpConversion,
4278+
SelectRankOpConversion, SelectTypeOpConversion, ShapeOpConversion,
4279+
ShapeShiftOpConversion, ShiftOpConversion, SliceOpConversion,
4280+
StoreOpConversion, StringLitOpConversion, SubcOpConversion,
4281+
TypeDescOpConversion, TypeInfoOpConversion, UnboxCharOpConversion,
4282+
UnboxProcOpConversion, UndefOpConversion, UnreachableOpConversion,
4283+
XArrayCoorOpConversion, XEmboxOpConversion, XReboxOpConversion,
4284+
ZeroOpConversion>(converter, options);
42614285

42624286
// Patterns that are populated without a type converter do not trigger
42634287
// target materializations for the operands of the root op.

flang/test/Fir/local.fir

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// RUN: fir-opt --fir-to-llvm-ir %s | FileCheck %s
2+
3+
// Tests that `fir.local` ops are dropped from the module before LLVM lowering.
4+
5+
fir.local {type = local} @local_privatizer : i32
6+
func.func @foo() {
7+
return
8+
}
9+
10+
// CHECK-NOT: fir.local

0 commit comments

Comments
 (0)