From f27081ba6a12685b403181e51a00a3d6f3360ca5 Mon Sep 17 00:00:00 2001 From: Razvan Lupusoru Date: Thu, 20 Feb 2025 18:49:23 -0800 Subject: [PATCH] [FIR] Avoid generating llvm.undef for dummy scoping info (#128098) Dummy scoping operations are generated to keep track of scopes for purpose of Fortran level analyses like Alias Analysis. For codegen, the scoping info is converted to a fir.undef during pre-codegen rewrite. Then during declare lowering, this info is no longer used - but it is still translated to llvm.undef. I cleaned up so it is simply erased. The generated LLVM should now no longer have a stray undef which looks off when trying to make sense of the IR. Co-authored-by: Razvan Lupusoru --- flang/lib/Optimizer/CodeGen/CodeGen.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/flang/lib/Optimizer/CodeGen/CodeGen.cpp b/flang/lib/Optimizer/CodeGen/CodeGen.cpp index 439cc7a85623..bd87215eeb17 100644 --- a/flang/lib/Optimizer/CodeGen/CodeGen.cpp +++ b/flang/lib/Optimizer/CodeGen/CodeGen.cpp @@ -3575,6 +3575,14 @@ struct UndefOpConversion : public fir::FIROpConversion { llvm::LogicalResult matchAndRewrite(fir::UndefOp undef, OpAdaptor, mlir::ConversionPatternRewriter &rewriter) const override { + if (mlir::isa(undef.getType())) { + // Dummy scoping is used for Fortran analyses like AA. Once it gets to + // pre-codegen rewrite it is erased and a fir.undef is created to + // feed to the fir declare operation. Thus, during codegen, we can + // simply erase is as it is no longer used. + rewriter.eraseOp(undef); + return mlir::success(); + } rewriter.replaceOpWithNewOp( undef, convertType(undef.getType())); return mlir::success();