diff --git a/flang/include/flang/Optimizer/CodeGen/CGOps.td b/flang/include/flang/Optimizer/CodeGen/CGOps.td index c375edee1fa77f..35e70fa2ffa3fb 100644 --- a/flang/include/flang/Optimizer/CodeGen/CGOps.td +++ b/flang/include/flang/Optimizer/CodeGen/CGOps.td @@ -16,8 +16,6 @@ include "mlir/IR/SymbolInterfaces.td" include "flang/Optimizer/Dialect/FIRTypes.td" -include "flang/Optimizer/Dialect/FIRAttr.td" -include "mlir/IR/BuiltinAttributes.td" def fircg_Dialect : Dialect { let name = "fircg"; @@ -204,36 +202,4 @@ def fircg_XArrayCoorOp : fircg_Op<"ext_array_coor", [AttrSizedOperandSegments]> }]; } -// Extended Declare operation. -def fircg_XDeclareOp : fircg_Op<"ext_declare", [AttrSizedOperandSegments]> { - let summary = "for internal conversion only"; - - let description = [{ - Prior to lowering to LLVM IR dialect, a DeclareOp will - be converted to an extended DeclareOp. - }]; - - let arguments = (ins - AnyRefOrBox:$memref, - Variadic:$shape, - Variadic:$shift, - Variadic:$typeparams, - Optional:$dummy_scope, - Builtin_StringAttr:$uniq_name - ); - let results = (outs AnyRefOrBox); - - let assemblyFormat = [{ - $memref (`(` $shape^ `)`)? (`origin` $shift^)? (`typeparams` $typeparams^)? - (`dummy_scope` $dummy_scope^)? - attr-dict `:` functional-type(operands, results) - }]; - - let extraClassDeclaration = [{ - // Shape is optional, but if it exists, it will be at offset 1. - unsigned shapeOffset() { return 1; } - unsigned shiftOffset() { return shapeOffset() + getShape().size(); } - }]; -} - #endif diff --git a/flang/include/flang/Optimizer/CodeGen/CGPasses.td b/flang/include/flang/Optimizer/CodeGen/CGPasses.td index 565920e55e6a8d..f524fb42373444 100644 --- a/flang/include/flang/Optimizer/CodeGen/CGPasses.td +++ b/flang/include/flang/Optimizer/CodeGen/CGPasses.td @@ -47,10 +47,6 @@ def CodeGenRewrite : Pass<"cg-rewrite", "mlir::ModuleOp"> { let dependentDialects = [ "fir::FIROpsDialect", "fir::FIRCodeGenDialect" ]; - let options = [ - Option<"preserveDeclare", "preserve-declare", "bool", /*default=*/"false", - "Preserve DeclareOp during pre codegen re-write."> - ]; let statistics = [ Statistic<"numDCE", "num-dce'd", "Number of operations eliminated"> ]; diff --git a/flang/include/flang/Optimizer/CodeGen/CodeGen.h b/flang/include/flang/Optimizer/CodeGen/CodeGen.h index 4d2b191b46d088..26097dabf56c45 100644 --- a/flang/include/flang/Optimizer/CodeGen/CodeGen.h +++ b/flang/include/flang/Optimizer/CodeGen/CodeGen.h @@ -30,8 +30,7 @@ struct NameUniquer; /// Prerequiste pass for code gen. Perform intermediate rewrites to perform /// the code gen (to LLVM-IR dialect) conversion. -std::unique_ptr createFirCodeGenRewritePass( - CodeGenRewriteOptions Options = CodeGenRewriteOptions{}); +std::unique_ptr createFirCodeGenRewritePass(); /// FirTargetRewritePass options. struct TargetRewriteOptions { @@ -89,8 +88,7 @@ void populateFIRToLLVMConversionPatterns(fir::LLVMTypeConverter &converter, fir::FIRToLLVMPassOptions &options); /// Populate the pattern set with the PreCGRewrite patterns. -void populatePreCGRewritePatterns(mlir::RewritePatternSet &patterns, - bool preserveDeclare); +void populatePreCGRewritePatterns(mlir::RewritePatternSet &patterns); // declarative passes #define GEN_PASS_REGISTRATION diff --git a/flang/include/flang/Tools/CLOptions.inc b/flang/include/flang/Tools/CLOptions.inc index 761315e0abc812..cc3431d5b71d29 100644 --- a/flang/include/flang/Tools/CLOptions.inc +++ b/flang/include/flang/Tools/CLOptions.inc @@ -169,11 +169,9 @@ inline void addMemoryAllocationOpt(mlir::PassManager &pm) { } #if !defined(FLANG_EXCLUDE_CODEGEN) -inline void addCodeGenRewritePass(mlir::PassManager &pm, bool preserveDeclare) { - fir::CodeGenRewriteOptions options; - options.preserveDeclare = preserveDeclare; - addPassConditionally(pm, disableCodeGenRewrite, - [&]() { return fir::createFirCodeGenRewritePass(options); }); +inline void addCodeGenRewritePass(mlir::PassManager &pm) { + addPassConditionally( + pm, disableCodeGenRewrite, fir::createFirCodeGenRewritePass); } inline void addTargetRewritePass(mlir::PassManager &pm) { @@ -355,8 +353,7 @@ inline void createDefaultFIRCodeGenPassPipeline(mlir::PassManager &pm, MLIRToLLVMPassPipelineConfig config, llvm::StringRef inputFilename = {}) { fir::addBoxedProcedurePass(pm); addNestedPassToAllTopLevelOperations(pm, fir::createAbstractResultOpt); - fir::addCodeGenRewritePass( - pm, (config.DebugInfo != llvm::codegenoptions::NoDebugInfo)); + fir::addCodeGenRewritePass(pm); fir::addTargetRewritePass(pm); fir::addExternalNameConversionPass(pm, config.Underscoring); fir::createDebugPasses(pm, config.DebugInfo, config.OptLevel, inputFilename); diff --git a/flang/lib/Optimizer/CodeGen/CGOps.cpp b/flang/lib/Optimizer/CodeGen/CGOps.cpp index 6b8ba74525556e..44d07d26dd2b68 100644 --- a/flang/lib/Optimizer/CodeGen/CGOps.cpp +++ b/flang/lib/Optimizer/CodeGen/CGOps.cpp @@ -10,7 +10,7 @@ // //===----------------------------------------------------------------------===// -#include "flang/Optimizer/CodeGen/CGOps.h" +#include "CGOps.h" #include "flang/Optimizer/Dialect/FIRDialect.h" #include "flang/Optimizer/Dialect/FIROps.h" #include "flang/Optimizer/Dialect/FIRType.h" diff --git a/flang/include/flang/Optimizer/CodeGen/CGOps.h b/flang/lib/Optimizer/CodeGen/CGOps.h similarity index 94% rename from flang/include/flang/Optimizer/CodeGen/CGOps.h rename to flang/lib/Optimizer/CodeGen/CGOps.h index df909d9ee81cb4..b5a6d5bb9a9e6f 100644 --- a/flang/include/flang/Optimizer/CodeGen/CGOps.h +++ b/flang/lib/Optimizer/CodeGen/CGOps.h @@ -13,7 +13,6 @@ #ifndef OPTIMIZER_CODEGEN_CGOPS_H #define OPTIMIZER_CODEGEN_CGOPS_H -#include "flang/Optimizer/Dialect/FIRAttr.h" #include "flang/Optimizer/Dialect/FIRType.h" #include "mlir/Dialect/Func/IR/FuncOps.h" diff --git a/flang/lib/Optimizer/CodeGen/CodeGen.cpp b/flang/lib/Optimizer/CodeGen/CodeGen.cpp index 72172f63888e1c..21154902d23f8f 100644 --- a/flang/lib/Optimizer/CodeGen/CodeGen.cpp +++ b/flang/lib/Optimizer/CodeGen/CodeGen.cpp @@ -12,7 +12,7 @@ #include "flang/Optimizer/CodeGen/CodeGen.h" -#include "flang/Optimizer/CodeGen/CGOps.h" +#include "CGOps.h" #include "flang/Optimizer/CodeGen/CodeGenOpenMP.h" #include "flang/Optimizer/CodeGen/FIROpPatterns.h" #include "flang/Optimizer/CodeGen/TypeConverter.h" @@ -170,28 +170,6 @@ genAllocationScaleSize(OP op, mlir::Type ity, return nullptr; } -namespace { -struct DeclareOpConversion : public fir::FIROpConversion { -public: - using FIROpConversion::FIROpConversion; - mlir::LogicalResult - matchAndRewrite(fir::cg::XDeclareOp declareOp, OpAdaptor adaptor, - mlir::ConversionPatternRewriter &rewriter) const override { - auto memRef = adaptor.getOperands()[0]; - if (auto fusedLoc = mlir::dyn_cast(declareOp.getLoc())) { - if (auto varAttr = - mlir::dyn_cast_or_null( - fusedLoc.getMetadata())) { - rewriter.create(memRef.getLoc(), memRef, - varAttr, nullptr); - } - } - rewriter.replaceOp(declareOp, memRef); - return mlir::success(); - } -}; -} // namespace - namespace { /// convert to LLVM IR dialect `alloca` struct AllocaOpConversion : public fir::FIROpConversion { @@ -3736,19 +3714,19 @@ void fir::populateFIRToLLVMConversionPatterns( BoxOffsetOpConversion, BoxProcHostOpConversion, BoxRankOpConversion, BoxTypeCodeOpConversion, BoxTypeDescOpConversion, CallOpConversion, CmpcOpConversion, ConstcOpConversion, ConvertOpConversion, - CoordinateOpConversion, DTEntryOpConversion, DeclareOpConversion, - DivcOpConversion, EmboxOpConversion, EmboxCharOpConversion, - EmboxProcOpConversion, ExtractValueOpConversion, FieldIndexOpConversion, - FirEndOpConversion, FreeMemOpConversion, GlobalLenOpConversion, - GlobalOpConversion, HasValueOpConversion, InsertOnRangeOpConversion, - InsertValueOpConversion, IsPresentOpConversion, LenParamIndexOpConversion, - LoadOpConversion, MulcOpConversion, NegcOpConversion, - NoReassocOpConversion, SelectCaseOpConversion, SelectOpConversion, - SelectRankOpConversion, SelectTypeOpConversion, ShapeOpConversion, - ShapeShiftOpConversion, ShiftOpConversion, SliceOpConversion, - StoreOpConversion, StringLitOpConversion, SubcOpConversion, - TypeDescOpConversion, TypeInfoOpConversion, UnboxCharOpConversion, - UnboxProcOpConversion, UndefOpConversion, UnreachableOpConversion, + CoordinateOpConversion, DTEntryOpConversion, DivcOpConversion, + EmboxOpConversion, EmboxCharOpConversion, EmboxProcOpConversion, + ExtractValueOpConversion, FieldIndexOpConversion, FirEndOpConversion, + FreeMemOpConversion, GlobalLenOpConversion, GlobalOpConversion, + HasValueOpConversion, InsertOnRangeOpConversion, InsertValueOpConversion, + IsPresentOpConversion, LenParamIndexOpConversion, LoadOpConversion, + MulcOpConversion, NegcOpConversion, NoReassocOpConversion, + SelectCaseOpConversion, SelectOpConversion, SelectRankOpConversion, + SelectTypeOpConversion, ShapeOpConversion, ShapeShiftOpConversion, + ShiftOpConversion, SliceOpConversion, StoreOpConversion, + StringLitOpConversion, SubcOpConversion, TypeDescOpConversion, + TypeInfoOpConversion, UnboxCharOpConversion, UnboxProcOpConversion, + UndefOpConversion, UnreachableOpConversion, UnrealizedConversionCastOpConversion, XArrayCoorOpConversion, XEmboxOpConversion, XReboxOpConversion, ZeroOpConversion>(converter, options); diff --git a/flang/lib/Optimizer/CodeGen/PreCGRewrite.cpp b/flang/lib/Optimizer/CodeGen/PreCGRewrite.cpp index c54a7457db7610..5bd3ec8d18450e 100644 --- a/flang/lib/Optimizer/CodeGen/PreCGRewrite.cpp +++ b/flang/lib/Optimizer/CodeGen/PreCGRewrite.cpp @@ -12,8 +12,8 @@ #include "flang/Optimizer/CodeGen/CodeGen.h" +#include "CGOps.h" #include "flang/Optimizer/Builder/Todo.h" // remove when TODO's are done -#include "flang/Optimizer/CodeGen/CGOps.h" #include "flang/Optimizer/Dialect/FIRDialect.h" #include "flang/Optimizer/Dialect/FIROps.h" #include "flang/Optimizer/Dialect/FIRType.h" @@ -270,43 +270,13 @@ class ArrayCoorConversion : public mlir::OpRewritePattern { }; class DeclareOpConversion : public mlir::OpRewritePattern { - bool preserveDeclare; - public: using OpRewritePattern::OpRewritePattern; - DeclareOpConversion(mlir::MLIRContext *ctx, bool preserveDecl) - : OpRewritePattern(ctx), preserveDeclare(preserveDecl) {} mlir::LogicalResult matchAndRewrite(fir::DeclareOp declareOp, mlir::PatternRewriter &rewriter) const override { - if (!preserveDeclare) { - rewriter.replaceOp(declareOp, declareOp.getMemref()); - return mlir::success(); - } - auto loc = declareOp.getLoc(); - llvm::SmallVector shapeOpers; - llvm::SmallVector shiftOpers; - if (auto shapeVal = declareOp.getShape()) { - if (auto shapeOp = mlir::dyn_cast(shapeVal.getDefiningOp())) - populateShape(shapeOpers, shapeOp); - else if (auto shiftOp = - mlir::dyn_cast(shapeVal.getDefiningOp())) - populateShapeAndShift(shapeOpers, shiftOpers, shiftOp); - else if (auto shiftOp = - mlir::dyn_cast(shapeVal.getDefiningOp())) - populateShift(shiftOpers, shiftOp); - else - return mlir::failure(); - } - // FIXME: Add FortranAttrs and CudaAttrs - auto xDeclOp = rewriter.create( - loc, declareOp.getType(), declareOp.getMemref(), shapeOpers, shiftOpers, - declareOp.getTypeparams(), declareOp.getDummyScope(), - declareOp.getUniqName()); - LLVM_DEBUG(llvm::dbgs() - << "rewriting " << declareOp << " to " << xDeclOp << '\n'); - rewriter.replaceOp(declareOp, xDeclOp.getOperation()->getResults()); + rewriter.replaceOp(declareOp, declareOp.getMemref()); return mlir::success(); } }; @@ -327,7 +297,6 @@ class DummyScopeOpConversion class CodeGenRewrite : public fir::impl::CodeGenRewriteBase { public: - CodeGenRewrite(fir::CodeGenRewriteOptions opts) : Base(opts) {} void runOnOperation() override final { mlir::ModuleOp mod = getOperation(); @@ -345,7 +314,7 @@ class CodeGenRewrite : public fir::impl::CodeGenRewriteBase { mlir::cast(embox.getType()).getEleTy())); }); mlir::RewritePatternSet patterns(&context); - fir::populatePreCGRewritePatterns(patterns, preserveDeclare); + fir::populatePreCGRewritePatterns(patterns); if (mlir::failed( mlir::applyPartialConversion(mod, target, std::move(patterns)))) { mlir::emitError(mlir::UnknownLoc::get(&context), @@ -361,14 +330,12 @@ class CodeGenRewrite : public fir::impl::CodeGenRewriteBase { } // namespace -std::unique_ptr -fir::createFirCodeGenRewritePass(fir::CodeGenRewriteOptions Options) { - return std::make_unique(Options); +std::unique_ptr fir::createFirCodeGenRewritePass() { + return std::make_unique(); } -void fir::populatePreCGRewritePatterns(mlir::RewritePatternSet &patterns, - bool preserveDeclare) { +void fir::populatePreCGRewritePatterns(mlir::RewritePatternSet &patterns) { patterns.insert(patterns.getContext()); - patterns.add(patterns.getContext(), preserveDeclare); + DeclareOpConversion, DummyScopeOpConversion>( + patterns.getContext()); } diff --git a/flang/lib/Optimizer/Transforms/AddDebugInfo.cpp b/flang/lib/Optimizer/Transforms/AddDebugInfo.cpp index cfad366cb5cb5a..908c8fc96f633e 100644 --- a/flang/lib/Optimizer/Transforms/AddDebugInfo.cpp +++ b/flang/lib/Optimizer/Transforms/AddDebugInfo.cpp @@ -15,7 +15,6 @@ #include "flang/Common/Version.h" #include "flang/Optimizer/Builder/FIRBuilder.h" #include "flang/Optimizer/Builder/Todo.h" -#include "flang/Optimizer/CodeGen/CGOps.h" #include "flang/Optimizer/Dialect/FIRDialect.h" #include "flang/Optimizer/Dialect/FIROps.h" #include "flang/Optimizer/Dialect/FIRType.h" @@ -46,59 +45,13 @@ namespace fir { namespace { class AddDebugInfoPass : public fir::impl::AddDebugInfoBase { - void handleDeclareOp(fir::cg::XDeclareOp declOp, - mlir::LLVM::DIFileAttr fileAttr, - mlir::LLVM::DIScopeAttr scopeAttr, - fir::DebugTypeGenerator &typeGen); - public: AddDebugInfoPass(fir::AddDebugInfoOptions options) : Base(options) {} void runOnOperation() override; }; -static uint32_t getLineFromLoc(mlir::Location loc) { - uint32_t line = 1; - if (auto fileLoc = mlir::dyn_cast(loc)) - line = fileLoc.getLine(); - return line; -} - } // namespace -void AddDebugInfoPass::handleDeclareOp(fir::cg::XDeclareOp declOp, - mlir::LLVM::DIFileAttr fileAttr, - mlir::LLVM::DIScopeAttr scopeAttr, - fir::DebugTypeGenerator &typeGen) { - mlir::MLIRContext *context = &getContext(); - mlir::OpBuilder builder(context); - auto result = fir::NameUniquer::deconstruct(declOp.getUniqName()); - - if (result.first != fir::NameUniquer::NameKind::VARIABLE) - return; - - // Only accept local variables. - if (result.second.procs.empty()) - return; - - // FIXME: There may be cases where an argument is processed a bit before - // DeclareOp is generated. In that case, DeclareOp may point to an - // intermediate op and not to BlockArgument. We need to find those cases and - // walk the chain to get to the actual argument. - - unsigned argNo = 0; - if (auto Arg = llvm::dyn_cast(declOp.getMemref())) - argNo = Arg.getArgNumber() + 1; - - auto tyAttr = typeGen.convertType(fir::unwrapRefType(declOp.getType()), - fileAttr, scopeAttr, declOp.getLoc()); - - auto localVarAttr = mlir::LLVM::DILocalVariableAttr::get( - context, scopeAttr, mlir::StringAttr::get(context, result.second.name), - fileAttr, getLineFromLoc(declOp.getLoc()), argNo, /* alignInBits*/ 0, - tyAttr); - declOp->setLoc(builder.getFusedLoc({declOp->getLoc()}, localVarAttr)); -} - void AddDebugInfoPass::runOnOperation() { mlir::ModuleOp module = getOperation(); mlir::MLIRContext *context = &getContext(); @@ -191,15 +144,14 @@ void AddDebugInfoPass::runOnOperation() { subprogramFlags = subprogramFlags | mlir::LLVM::DISubprogramFlags::Definition; } - unsigned line = getLineFromLoc(l); + unsigned line = 1; + if (auto funcLoc = mlir::dyn_cast(l)) + line = funcLoc.getLine(); + auto spAttr = mlir::LLVM::DISubprogramAttr::get( context, id, compilationUnit, fileAttr, funcName, fullName, funcFileAttr, line, line, subprogramFlags, subTypeAttr); funcOp->setLoc(builder.getFusedLoc({funcOp->getLoc()}, spAttr)); - - funcOp.walk([&](fir::cg::XDeclareOp declOp) { - handleDeclareOp(declOp, fileAttr, spAttr, typeGen); - }); }); } diff --git a/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp b/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp index 64c6547e06e0f9..e5b4050dfb2426 100644 --- a/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp +++ b/flang/lib/Optimizer/Transforms/DebugTypeGenerator.cpp @@ -24,6 +24,11 @@ DebugTypeGenerator::DebugTypeGenerator(mlir::ModuleOp m) LLVM_DEBUG(llvm::dbgs() << "DITypeAttr generator\n"); } +static mlir::LLVM::DITypeAttr genPlaceholderType(mlir::MLIRContext *context) { + return mlir::LLVM::DIBasicTypeAttr::get( + context, llvm::dwarf::DW_TAG_base_type, "void", 32, 1); +} + static mlir::LLVM::DITypeAttr genBasicType(mlir::MLIRContext *context, mlir::StringAttr name, unsigned bitSize, @@ -32,11 +37,6 @@ static mlir::LLVM::DITypeAttr genBasicType(mlir::MLIRContext *context, context, llvm::dwarf::DW_TAG_base_type, name, bitSize, decoding); } -static mlir::LLVM::DITypeAttr genPlaceholderType(mlir::MLIRContext *context) { - return genBasicType(context, mlir::StringAttr::get(context, "integer"), 32, - llvm::dwarf::DW_ATE_signed); -} - mlir::LLVM::DITypeAttr DebugTypeGenerator::convertType(mlir::Type Ty, mlir::LLVM::DIFileAttr fileAttr, mlir::LLVM::DIScopeAttr scope, diff --git a/flang/test/Fir/declare-codegen.fir b/flang/test/Fir/declare-codegen.fir index c5879facb1572f..9d68d3b2f9d4de 100644 --- a/flang/test/Fir/declare-codegen.fir +++ b/flang/test/Fir/declare-codegen.fir @@ -1,7 +1,5 @@ // Test rewrite of fir.declare. The result is replaced by the memref operand. -// RUN: fir-opt --cg-rewrite="preserve-declare=true" %s -o - | FileCheck %s --check-prefixes DECL -// RUN: fir-opt --cg-rewrite="preserve-declare=false" %s -o - | FileCheck %s --check-prefixes NODECL -// RUN: fir-opt --cg-rewrite %s -o - | FileCheck %s --check-prefixes NODECL +// RUN: fir-opt --cg-rewrite %s -o - | FileCheck %s func.func @test(%arg0: !fir.ref>) { @@ -17,14 +15,9 @@ func.func @test(%arg0: !fir.ref>) { func.func private @bar(%arg0: !fir.ref>) -// NODECL-LABEL: func.func @test( -// NODECL-SAME: %[[arg0:.*]]: !fir.ref>) { -// NODECL-NEXT: fir.call @bar(%[[arg0]]) : (!fir.ref>) -> () - -// DECL-LABEL: func.func @test( -// DECL-SAME: %[[arg0:.*]]: !fir.ref>) { -// DECL: fircg.ext_declare - +// CHECK-LABEL: func.func @test( +// CHECK-SAME: %[[arg0:.*]]: !fir.ref>) { +// CHECK-NEXT: fir.call @bar(%[[arg0]]) : (!fir.ref>) -> () func.func @useless_shape_with_duplicate_extent_operand(%arg0: !fir.ref>) { %c3 = arith.constant 3 : index @@ -33,8 +26,5 @@ func.func @useless_shape_with_duplicate_extent_operand(%arg0: !fir.ref) { %scope = fir.dummy_scope : !fir.dscope %0 = fir.declare %arg0 dummy_scope %scope {uniq_name = "x"} : (!fir.ref, !fir.dscope) -> !fir.ref return } -// DECL-LABEL: func.func @dummy_scope( -// DECL: fircg.ext_declare - -// NODECL-LABEL: func.func @dummy_scope( -// NODECL-NEXT: return \ No newline at end of file +// CHECK-LABEL: func.func @dummy_scope( +// CHECK-NEXT: return diff --git a/flang/test/Transforms/debug-local-var-2.f90 b/flang/test/Transforms/debug-local-var-2.f90 deleted file mode 100644 index 15b9b148492e14..00000000000000 --- a/flang/test/Transforms/debug-local-var-2.f90 +++ /dev/null @@ -1,91 +0,0 @@ -! RUN: %flang_fc1 -emit-llvm -debug-info-kind=standalone %s -o - | FileCheck %s - -! This tests checks the debug information for local variables in llvm IR. - -! CHECK-LABEL: define void @_QQmain -! CHECK-DAG: %[[AL11:.*]] = alloca i32 -! CHECK-DAG: %[[AL12:.*]] = alloca i64 -! CHECK-DAG: %[[AL13:.*]] = alloca i8 -! CHECK-DAG: %[[AL14:.*]] = alloca i32 -! CHECK-DAG: %[[AL15:.*]] = alloca float -! CHECK-DAG: %[[AL16:.*]] = alloca double -! CHECK-DAG: call void @llvm.dbg.declare(metadata ptr %[[AL11]], metadata ![[I4:.*]], metadata !DIExpression()) -! CHECK-DAG: call void @llvm.dbg.declare(metadata ptr %[[AL12]], metadata ![[I8:.*]], metadata !DIExpression()) -! CHECK-DAG: call void @llvm.dbg.declare(metadata ptr %[[AL13]], metadata ![[L1:.*]], metadata !DIExpression()) -! CHECK-DAG: call void @llvm.dbg.declare(metadata ptr %[[AL14]], metadata ![[L4:.*]], metadata !DIExpression()) -! CHECK-DAG: call void @llvm.dbg.declare(metadata ptr %[[AL15]], metadata ![[R4:.*]], metadata !DIExpression()) -! CHECK-DAG: call void @llvm.dbg.declare(metadata ptr %[[AL16]], metadata ![[R8:.*]], metadata !DIExpression()) -! CHECK-LABEL: } - -! CHECK-LABEL: define {{.*}}i64 @_QFPfn1 -! CHECK-SAME: (ptr %[[ARG1:.*]], ptr %[[ARG2:.*]], ptr %[[ARG3:.*]]) -! CHECK-DAG: tail call void @llvm.dbg.declare(metadata ptr %[[ARG1]], metadata ![[A1:.*]], metadata !DIExpression()) -! CHECK-DAG: tail call void @llvm.dbg.declare(metadata ptr %[[ARG2]], metadata ![[B1:.*]], metadata !DIExpression()) -! CHECK-DAG: tail call void @llvm.dbg.declare(metadata ptr %[[ARG3]], metadata ![[C1:.*]], metadata !DIExpression()) -! CHECK-DAG: %[[AL2:.*]] = alloca i64 -! CHECK-DAG: tail call void @llvm.dbg.declare(metadata ptr %[[AL2]], metadata ![[RES1:.*]], metadata !DIExpression()) -! CHECK-LABEL: } - -! CHECK-LABEL: define {{.*}}i32 @_QFPfn2 -! CHECK-SAME: (ptr %[[FN2ARG1:.*]], ptr %[[FN2ARG2:.*]], ptr %[[FN2ARG3:.*]]) -! CHECK-DAG: tail call void @llvm.dbg.declare(metadata ptr %[[FN2ARG1]], metadata ![[A2:.*]], metadata !DIExpression()) -! CHECK-DAG: tail call void @llvm.dbg.declare(metadata ptr %[[FN2ARG2]], metadata ![[B2:.*]], metadata !DIExpression()) -! CHECK-DAG: tail call void @llvm.dbg.declare(metadata ptr %[[FN2ARG3]], metadata ![[C2:.*]], metadata !DIExpression()) -! CHECK-DAG: %[[AL3:.*]] = alloca i32 -! CHECK-DAG: tail call void @llvm.dbg.declare(metadata ptr %[[AL3]], metadata ![[RES2:.*]], metadata !DIExpression()) -! CHECK-LABEL: } - -program mn -! CHECK-DAG: ![[MAIN:.*]] = distinct !DISubprogram(name: "_QQmain", {{.*}}) - -! CHECK-DAG: ![[TYI32:.*]] = !DIBasicType(name: "integer", size: 32, encoding: DW_ATE_signed) -! CHECK-DAG: ![[TYI64:.*]] = !DIBasicType(name: "integer", size: 64, encoding: DW_ATE_signed) -! CHECK-DAG: ![[TYL8:.*]] = !DIBasicType(name: "logical", size: 8, encoding: DW_ATE_boolean) -! CHECK-DAG: ![[TYL32:.*]] = !DIBasicType(name: "logical", size: 32, encoding: DW_ATE_boolean) -! CHECK-DAG: ![[TYR32:.*]] = !DIBasicType(name: "real", size: 32, encoding: DW_ATE_float) -! CHECK-DAG: ![[TYR64:.*]] = !DIBasicType(name: "real", size: 64, encoding: DW_ATE_float) - -! CHECK-DAG: ![[I4]] = !DILocalVariable(name: "i4", scope: ![[MAIN]], file: !{{.*}}, line: [[@LINE+6]], type: ![[TYI32]]) -! CHECK-DAG: ![[I8]] = !DILocalVariable(name: "i8", scope: ![[MAIN]], file: !{{.*}}, line: [[@LINE+6]], type: ![[TYI64]]) -! CHECK-DAG: ![[R4]] = !DILocalVariable(name: "r4", scope: ![[MAIN]], file: !{{.*}}, line: [[@LINE+6]], type: ![[TYR32]]) -! CHECK-DAG: ![[R8]] = !DILocalVariable(name: "r8", scope: ![[MAIN]], file: !{{.*}}, line: [[@LINE+6]], type: ![[TYR64]]) -! CHECK-DAG: ![[L1]] = !DILocalVariable(name: "l1", scope: ![[MAIN]], file: !{{.*}}, line: [[@LINE+6]], type: ![[TYL8]]) -! CHECK-DAG: ![[L4]] = !DILocalVariable(name: "l4", scope: ![[MAIN]], file: !{{.*}}, line: [[@LINE+6]], type: ![[TYL32]]) - integer(kind=4) :: i4 - integer(kind=8) :: i8 - real(kind=4) :: r4 - real(kind=8) :: r8 - logical(kind=1) :: l1 - logical(kind=4) :: l4 - - i8 = fn1(i4, r8, l1) - i4 = fn2(i8, r4, l4) -contains -! CHECK-DAG: ![[FN1:.*]] = distinct !DISubprogram(name: "fn1", {{.*}}) -! CHECK-DAG: ![[A1]] = !DILocalVariable(name: "a1", arg: 1, scope: ![[FN1]], file: !{{.*}}, line: [[@LINE+5]], type: ![[TYI32]]) -! CHECK-DAG: ![[B1]] = !DILocalVariable(name: "b1", arg: 2, scope: ![[FN1]], file: !{{.*}}, line: [[@LINE+5]], type: ![[TYR64]]) -! CHECK-DAG: ![[C1]] = !DILocalVariable(name: "c1", arg: 3, scope: ![[FN1]], file: !{{.*}}, line: [[@LINE+5]], type: ![[TYL8]]) -! CHECK-DAG: ![[RES1]] = !DILocalVariable(name: "res1", scope: ![[FN1]], file: !{{.*}}, line: [[@LINE+5]], type: ![[TYI64]]) - function fn1(a1, b1, c1) result (res1) - integer(kind=4), intent(in) :: a1 - real(kind=8), intent(in) :: b1 - logical(kind=1), intent(in) :: c1 - integer(kind=8) :: res1 - - res1 = a1 + b1 - end function - -! CHECK-DAG: ![[FN2:.*]] = distinct !DISubprogram(name: "fn2", {{.*}}) -! CHECK-DAG: ![[A2]] = !DILocalVariable(name: "a2", arg: 1, scope: ![[FN2]], file: !{{.*}}, line: [[@LINE+5]], type: ![[TYI64]]) -! CHECK-DAG: ![[B2]] = !DILocalVariable(name: "b2", arg: 2, scope: ![[FN2]], file: !{{.*}}, line: [[@LINE+5]], type: ![[TYR32]]) -! CHECK-DAG: ![[C2]] = !DILocalVariable(name: "c2", arg: 3, scope: ![[FN2]], file: !{{.*}}, line: [[@LINE+5]], type: ![[TYL32]]) -! CHECK-DAG: ![[RES2]] = !DILocalVariable(name: "res2", scope: ![[FN2]], file: !{{.*}}, line: [[@LINE+5]], type: ![[TYI32]]) - function fn2(a2, b2, c2) result (res2) - integer(kind=8), intent(in) :: a2 - real(kind=4), intent(in) :: b2 - logical(kind=4), intent(in) :: c2 - integer(kind=4) :: res2 - - res2 = a2 + b2 - end function -end program diff --git a/flang/test/Transforms/debug-local-var.f90 b/flang/test/Transforms/debug-local-var.f90 deleted file mode 100644 index 96dc111ad308e1..00000000000000 --- a/flang/test/Transforms/debug-local-var.f90 +++ /dev/null @@ -1,54 +0,0 @@ -! RUN: %flang_fc1 -emit-fir -debug-info-kind=standalone -mmlir --mlir-print-debuginfo %s -o - | \ -! RUN: fir-opt --cg-rewrite="preserve-declare=true" --mlir-print-debuginfo | fir-opt --add-debug-info --mlir-print-debuginfo | FileCheck %s - -! CHECK-DAG: #[[INT8:.*]] = #llvm.di_basic_type -! CHECK-DAG: #[[INT4:.*]] = #llvm.di_basic_type -! CHECK-DAG: #[[REAL8:.*]] = #llvm.di_basic_type -! CHECK-DAG: #[[LOG1:.*]] = #llvm.di_basic_type -! CHECK-DAG: #[[REAL4:.*]] = #llvm.di_basic_type -! CHECK-DAG: #[[LOG4:.*]] = #llvm.di_basic_type -! CHECK-DAG: #[[MAIN:.*]] = #llvm.di_subprogram<{{.*}}name = "_QQmain"{{.*}}> -! CHECK-DAG: #[[FN1:.*]] = #llvm.di_subprogram<{{.*}}name = "fn1"{{.*}}> -! CHECK-DAG: #[[FN2:.*]] = #llvm.di_subprogram<{{.*}}name = "fn2"{{.*}}> - -program mn -! CHECK-DAG: #[[I4:.*]] = #llvm.di_local_variable -! CHECK-DAG: #[[I8:.*]] = #llvm.di_local_variable -! CHECK-DAG: #[[R4:.*]] = #llvm.di_local_variable -! CHECK-DAG: #[[R8:.*]] = #llvm.di_local_variable -! CHECK-DAG: #[[L1:.*]] = #llvm.di_local_variable -! CHECK-DAG: #[[L4:.*]] = #llvm.di_local_variable - integer(kind=4) :: i4 - integer(kind=8) :: i8 - real(kind=4) :: r4 - real(kind=8) :: r8 - logical(kind=1) :: l1 - logical(kind=4) :: l4 - i8 = fn1(i4, r8, l1) - i4 = fn2(i8, r4, l4) -contains - function fn1(a1, b1, c1) result (res1) -! CHECK-DAG: #[[A1:.*]] = #llvm.di_local_variable -! CHECK-DAG: #[[B1:.*]] = #llvm.di_local_variable -! CHECK-DAG: #[[C1:.*]] = #llvm.di_local_variable -! CHECK-DAG: #[[RES1:.*]] = #llvm.di_local_variable - integer(kind=4), intent(in) :: a1 - real(kind=8), intent(in) :: b1 - logical(kind=1), intent(in) :: c1 - integer(kind=8) :: res1 - res1 = a1 + b1 - end function - - function fn2(a2, b2, c2) result (res2) - implicit none -! CHECK-DAG: #[[A2:.*]] = #llvm.di_local_variable -! CHECK-DAG: #[[B2:.*]] = #llvm.di_local_variable -! CHECK-DAG: #[[C2:.*]] = #llvm.di_local_variable -! CHECK-DAG: #[[RES2:.*]] = #llvm.di_local_variable - integer(kind=8), intent(in) :: a2 - real(kind=4), intent(in) :: b2 - logical(kind=4), intent(in) :: c2 - integer(kind=4) :: res2 - res2 = a2 + b2 - end function -end program