diff --git a/flang/include/flang/Optimizer/Builder/FIRBuilder.h b/flang/include/flang/Optimizer/Builder/FIRBuilder.h index f7151f26f09cb3..180e2c8ab33ea2 100644 --- a/flang/include/flang/Optimizer/Builder/FIRBuilder.h +++ b/flang/include/flang/Optimizer/Builder/FIRBuilder.h @@ -29,6 +29,7 @@ #include namespace mlir { +class DataLayout; class SymbolTable; } @@ -253,6 +254,15 @@ class FirOpBuilder : public mlir::OpBuilder, public mlir::OpBuilder::Listener { mlir::ValueRange lenParams = {}, llvm::ArrayRef attrs = {}); + /// Create an LLVM stack save intrinsic op. Returns the saved stack pointer. + /// The stack address space is fetched from the data layout of the current + /// module. + mlir::Value genStackSave(mlir::Location loc); + + /// Create an LLVM stack restore intrinsic op. stackPointer should be a value + /// previously returned from genStackSave. + void genStackRestore(mlir::Location loc, mlir::Value stackPointer); + /// Create a global value. fir::GlobalOp createGlobal(mlir::Location loc, mlir::Type type, llvm::StringRef name, @@ -523,6 +533,9 @@ class FirOpBuilder : public mlir::OpBuilder, public mlir::OpBuilder::Listener { setCommonAttributes(op); } + /// Construct a data layout on demand and return it + mlir::DataLayout &getDataLayout(); + private: /// Set attributes (e.g. FastMathAttr) to \p op operation /// based on the current attributes setting. @@ -537,6 +550,11 @@ class FirOpBuilder : public mlir::OpBuilder, public mlir::OpBuilder::Listener { /// fir::GlobalOp and func::FuncOp symbol table to speed-up /// lookups. mlir::SymbolTable *symbolTable = nullptr; + + /// DataLayout constructed on demand. Access via getDataLayout(). + /// Stored via a unique_ptr rather than an optional so as not to bloat this + /// class when most instances won't ever need a data layout. + std::unique_ptr dataLayout = nullptr; }; } // namespace fir @@ -729,6 +747,9 @@ elideExtentsAlreadyInType(mlir::Type type, mlir::ValueRange shape); llvm::SmallVector elideLengthsAlreadyInType(mlir::Type type, mlir::ValueRange lenParams); +/// Get the address space which should be used for allocas +uint64_t getAllocaAddressSpace(mlir::DataLayout *dataLayout); + } // namespace fir::factory #endif // FORTRAN_OPTIMIZER_BUILDER_FIRBUILDER_H diff --git a/flang/include/flang/Optimizer/Builder/LowLevelIntrinsics.h b/flang/include/flang/Optimizer/Builder/LowLevelIntrinsics.h index e5a7113149346c..9be051632f93d9 100644 --- a/flang/include/flang/Optimizer/Builder/LowLevelIntrinsics.h +++ b/flang/include/flang/Optimizer/Builder/LowLevelIntrinsics.h @@ -42,12 +42,6 @@ mlir::func::FuncOp getLlvmGetRounding(FirOpBuilder &builder); /// Get the `llvm.set.rounding` intrinsic. mlir::func::FuncOp getLlvmSetRounding(FirOpBuilder &builder); -/// Get the `llvm.stacksave` intrinsic. -mlir::func::FuncOp getLlvmStackSave(FirOpBuilder &builder); - -/// Get the `llvm.stackrestore` intrinsic. -mlir::func::FuncOp getLlvmStackRestore(FirOpBuilder &builder); - /// Get the `llvm.init.trampoline` intrinsic. mlir::func::FuncOp getLlvmInitTrampoline(FirOpBuilder &builder); diff --git a/flang/include/flang/Optimizer/Support/DataLayout.h b/flang/include/flang/Optimizer/Support/DataLayout.h index d21576bb95f795..6072425b7d637f 100644 --- a/flang/include/flang/Optimizer/Support/DataLayout.h +++ b/flang/include/flang/Optimizer/Support/DataLayout.h @@ -45,7 +45,6 @@ void setMLIRDataLayoutFromAttributes(mlir::ModuleOp mlirModule, /// std::nullopt. std::optional getOrSetDataLayout(mlir::ModuleOp mlirModule, bool allowDefaultLayout = false); - } // namespace fir::support #endif // FORTRAN_OPTIMIZER_SUPPORT_DATALAYOUT_H diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp index 3e9db06b61d502..6724d93e0c5524 100644 --- a/flang/lib/Lower/Bridge.cpp +++ b/flang/lib/Lower/Bridge.cpp @@ -3256,15 +3256,10 @@ class FirConverter : public Fortran::lower::AbstractConverter { const Fortran::parser::CharBlock &endPosition = eval.getLastNestedEvaluation().position; localSymbols.pushScope(); - mlir::func::FuncOp stackSave = fir::factory::getLlvmStackSave(*builder); - mlir::func::FuncOp stackRestore = - fir::factory::getLlvmStackRestore(*builder); - mlir::Value stackPtr = - builder->create(toLocation(), stackSave).getResult(0); + mlir::Value stackPtr = builder->genStackSave(toLocation()); mlir::Location endLoc = genLocation(endPosition); - stmtCtx.attachCleanup([=]() { - builder->create(endLoc, stackRestore, stackPtr); - }); + stmtCtx.attachCleanup( + [=]() { builder->genStackRestore(endLoc, stackPtr); }); Fortran::semantics::Scope &scope = bridge.getSemanticsContext().FindScope(endPosition); scopeBlockIdMap.try_emplace(&scope, ++blockId); diff --git a/flang/lib/Lower/ConvertCall.cpp b/flang/lib/Lower/ConvertCall.cpp index f445a21e560bc9..a085affd6c7126 100644 --- a/flang/lib/Lower/ConvertCall.cpp +++ b/flang/lib/Lower/ConvertCall.cpp @@ -368,22 +368,9 @@ std::pair Fortran::lower::genCallOpAndResult( if (!extents.empty() || !lengths.empty()) { auto *bldr = &converter.getFirOpBuilder(); - auto stackSaveFn = fir::factory::getLlvmStackSave(builder); - auto stackSaveSymbol = bldr->getSymbolRefAttr(stackSaveFn.getName()); - mlir::Value sp; - fir::CallOp call = bldr->create( - loc, stackSaveSymbol, stackSaveFn.getFunctionType().getResults(), - mlir::ValueRange{}); - if (call.getNumResults() != 0) - sp = call.getResult(0); - stmtCtx.attachCleanup([bldr, loc, sp]() { - auto stackRestoreFn = fir::factory::getLlvmStackRestore(*bldr); - auto stackRestoreSymbol = - bldr->getSymbolRefAttr(stackRestoreFn.getName()); - bldr->create(loc, stackRestoreSymbol, - stackRestoreFn.getFunctionType().getResults(), - mlir::ValueRange{sp}); - }); + mlir::Value sp = bldr->genStackSave(loc); + stmtCtx.attachCleanup( + [bldr, loc, sp]() { bldr->genStackRestore(loc, sp); }); } mlir::Value temp = builder.createTemporary(loc, type, ".result", extents, resultLengths); diff --git a/flang/lib/Optimizer/Builder/FIRBuilder.cpp b/flang/lib/Optimizer/Builder/FIRBuilder.cpp index d786d79ba8701b..849d8482126930 100644 --- a/flang/lib/Optimizer/Builder/FIRBuilder.cpp +++ b/flang/lib/Optimizer/Builder/FIRBuilder.cpp @@ -18,6 +18,7 @@ #include "flang/Optimizer/Dialect/FIRAttr.h" #include "flang/Optimizer/Dialect/FIROpsSupport.h" #include "flang/Optimizer/Dialect/FIRType.h" +#include "flang/Optimizer/Support/DataLayout.h" #include "flang/Optimizer/Support/FatalError.h" #include "flang/Optimizer/Support/InternalNames.h" #include "flang/Optimizer/Support/Utils.h" @@ -328,6 +329,17 @@ mlir::Value fir::FirOpBuilder::createHeapTemporary( name, dynamicLength, dynamicShape, attrs); } +mlir::Value fir::FirOpBuilder::genStackSave(mlir::Location loc) { + mlir::Type voidPtr = mlir::LLVM::LLVMPointerType::get( + getContext(), fir::factory::getAllocaAddressSpace(&getDataLayout())); + return create(loc, voidPtr); +} + +void fir::FirOpBuilder::genStackRestore(mlir::Location loc, + mlir::Value stackPointer) { + create(loc, stackPointer); +} + /// Create a global variable in the (read-only) data section. A global variable /// must have a unique name to identify and reference it. fir::GlobalOp fir::FirOpBuilder::createGlobal( @@ -791,6 +803,15 @@ void fir::FirOpBuilder::setFastMathFlags( setFastMathFlags(arithFMF); } +// Construction of an mlir::DataLayout is expensive so only do it on demand and +// memoise it in the builder instance +mlir::DataLayout &fir::FirOpBuilder::getDataLayout() { + if (dataLayout) + return *dataLayout; + dataLayout = std::make_unique(getModule()); + return *dataLayout; +} + //===--------------------------------------------------------------------===// // ExtendedValue inquiry helper implementation //===--------------------------------------------------------------------===// @@ -1664,3 +1685,10 @@ void fir::factory::setInternalLinkage(mlir::func::FuncOp func) { mlir::LLVM::LinkageAttr::get(func->getContext(), internalLinkage); func->setAttr("llvm.linkage", linkage); } + +uint64_t fir::factory::getAllocaAddressSpace(mlir::DataLayout *dataLayout) { + if (dataLayout) + if (mlir::Attribute addrSpace = dataLayout->getAllocaMemorySpace()) + return mlir::cast(addrSpace).getUInt(); + return 0; +} diff --git a/flang/lib/Optimizer/Builder/LowLevelIntrinsics.cpp b/flang/lib/Optimizer/Builder/LowLevelIntrinsics.cpp index bb5f77d5d4d1de..411a48614af6c8 100644 --- a/flang/lib/Optimizer/Builder/LowLevelIntrinsics.cpp +++ b/flang/lib/Optimizer/Builder/LowLevelIntrinsics.cpp @@ -76,25 +76,6 @@ fir::factory::getLlvmSetRounding(fir::FirOpBuilder &builder) { funcTy); } -mlir::func::FuncOp fir::factory::getLlvmStackSave(fir::FirOpBuilder &builder) { - // FIXME: This should query the target alloca address space - auto ptrTy = builder.getRefType(builder.getIntegerType(8)); - auto funcTy = - mlir::FunctionType::get(builder.getContext(), std::nullopt, {ptrTy}); - return builder.createFunction(builder.getUnknownLoc(), "llvm.stacksave.p0", - funcTy); -} - -mlir::func::FuncOp -fir::factory::getLlvmStackRestore(fir::FirOpBuilder &builder) { - // FIXME: This should query the target alloca address space - auto ptrTy = builder.getRefType(builder.getIntegerType(8)); - auto funcTy = - mlir::FunctionType::get(builder.getContext(), {ptrTy}, std::nullopt); - return builder.createFunction(builder.getUnknownLoc(), "llvm.stackrestore.p0", - funcTy); -} - mlir::func::FuncOp fir::factory::getLlvmInitTrampoline(fir::FirOpBuilder &builder) { auto ptrTy = builder.getRefType(builder.getIntegerType(8)); diff --git a/flang/lib/Optimizer/CodeGen/TargetRewrite.cpp b/flang/lib/Optimizer/CodeGen/TargetRewrite.cpp index a2a9cff4c4977e..f6cb26ff9613f4 100644 --- a/flang/lib/Optimizer/CodeGen/TargetRewrite.cpp +++ b/flang/lib/Optimizer/CodeGen/TargetRewrite.cpp @@ -1236,25 +1236,18 @@ class TargetRewrite : public fir::impl::TargetRewritePassBase { inline void clearMembers() { setMembers(nullptr, nullptr, nullptr); } - uint64_t getAllocaAddressSpace() const { - if (dataLayout) - if (mlir::Attribute addrSpace = dataLayout->getAllocaMemorySpace()) - return llvm::cast(addrSpace).getUInt(); - return 0; - } - // Inserts a call to llvm.stacksave at the current insertion // point and the given location. Returns the call's result Value. inline mlir::Value genStackSave(mlir::Location loc) { - mlir::Type voidPtr = mlir::LLVM::LLVMPointerType::get( - rewriter->getContext(), getAllocaAddressSpace()); - return rewriter->create(loc, voidPtr); + fir::FirOpBuilder builder(*rewriter, getModule()); + return builder.genStackSave(loc); } // Inserts a call to llvm.stackrestore at the current insertion // point and the given location and argument. inline void genStackRestore(mlir::Location loc, mlir::Value sp) { - rewriter->create(loc, sp); + fir::FirOpBuilder builder(*rewriter, getModule()); + return builder.genStackRestore(loc, sp); } fir::CodeGenSpecifics *specifics = nullptr; diff --git a/flang/lib/Optimizer/Transforms/StackArrays.cpp b/flang/lib/Optimizer/Transforms/StackArrays.cpp index a8f1a744cda5fe..1b929928dc7164 100644 --- a/flang/lib/Optimizer/Transforms/StackArrays.cpp +++ b/flang/lib/Optimizer/Transforms/StackArrays.cpp @@ -734,28 +734,12 @@ void AllocMemConversion::insertStackSaveRestore( auto mod = oldAlloc->getParentOfType(); fir::FirOpBuilder builder{rewriter, mod}; - mlir::func::FuncOp stackSaveFn = fir::factory::getLlvmStackSave(builder); - mlir::SymbolRefAttr stackSaveSym = - builder.getSymbolRefAttr(stackSaveFn.getName()); - builder.setInsertionPoint(oldAlloc); - mlir::Value sp = - builder - .create(oldAlloc.getLoc(), stackSaveSym, - stackSaveFn.getFunctionType().getResults(), - mlir::ValueRange{}) - .getResult(0); - - mlir::func::FuncOp stackRestoreFn = - fir::factory::getLlvmStackRestore(builder); - mlir::SymbolRefAttr stackRestoreSym = - builder.getSymbolRefAttr(stackRestoreFn.getName()); + mlir::Value sp = builder.genStackSave(oldAlloc.getLoc()); auto createStackRestoreCall = [&](mlir::Operation *user) { builder.setInsertionPoint(user); - builder.create(user->getLoc(), stackRestoreSym, - stackRestoreFn.getFunctionType().getResults(), - mlir::ValueRange{sp}); + builder.genStackRestore(user->getLoc(), sp); }; for (mlir::Operation *user : oldAlloc->getUsers()) { diff --git a/flang/lib/Optimizer/Transforms/StackReclaim.cpp b/flang/lib/Optimizer/Transforms/StackReclaim.cpp index 8a60a9e64f704b..bd3e49a47bc399 100644 --- a/flang/lib/Optimizer/Transforms/StackReclaim.cpp +++ b/flang/lib/Optimizer/Transforms/StackReclaim.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include "flang/Common/Fortran.h" +#include "flang/Optimizer/Builder/FIRBuilder.h" #include "flang/Optimizer/Dialect/FIRDialect.h" #include "flang/Optimizer/Dialect/FIROps.h" #include "flang/Optimizer/Transforms/Passes.h" @@ -31,34 +32,20 @@ class StackReclaimPass : public fir::impl::StackReclaimBase { }; } // namespace -uint64_t getAllocaAddressSpace(Operation *op) { - mlir::ModuleOp module = mlir::dyn_cast_or_null(op); - if (!module) - module = op->getParentOfType(); - - if (mlir::Attribute addrSpace = - mlir::DataLayout(module).getAllocaMemorySpace()) - return llvm::cast(addrSpace).getUInt(); - return 0; -} - void StackReclaimPass::runOnOperation() { auto *op = getOperation(); - auto *context = &getContext(); - mlir::OpBuilder builder(context); - mlir::Type voidPtr = - mlir::LLVM::LLVMPointerType::get(context, getAllocaAddressSpace(op)); + fir::FirOpBuilder builder(op, fir::getKindMapping(op)); op->walk([&](fir::DoLoopOp loopOp) { mlir::Location loc = loopOp.getLoc(); if (!loopOp.getRegion().getOps().empty()) { builder.setInsertionPointToStart(&loopOp.getRegion().front()); - auto stackSaveOp = builder.create(loc, voidPtr); + mlir::Value sp = builder.genStackSave(loc); auto *terminator = loopOp.getRegion().back().getTerminator(); builder.setInsertionPoint(terminator); - builder.create(loc, stackSaveOp); + builder.genStackRestore(loc, sp); } }); } diff --git a/flang/test/HLFIR/order_assignments/where-scheduling.f90 b/flang/test/HLFIR/order_assignments/where-scheduling.f90 index d3665d234a7125..ab87ae92de5799 100644 --- a/flang/test/HLFIR/order_assignments/where-scheduling.f90 +++ b/flang/test/HLFIR/order_assignments/where-scheduling.f90 @@ -134,7 +134,7 @@ end function f !CHECK-NEXT: run 1 save : where/mask !CHECK-NEXT: run 2 evaluate: where/region_assign1 !CHECK-LABEL: ------------ scheduling where in _QPonly_once ------------ -!CHECK-NEXT: unknown effect: %{{[0-9]+}} = fir.call @llvm.stacksave.p0() fastmath : () -> !fir.ref +!CHECK-NEXT: unknown effect: %{{[0-9]+}} = llvm.intr.stacksave : !llvm.ptr !CHECK-NEXT: run 1 save (w): where/mask !CHECK-NEXT: run 2 evaluate: where/region_assign1 !CHECK-NEXT: run 3 evaluate: where/region_assign2 diff --git a/flang/test/Lower/HLFIR/block_bindc_pocs.f90 b/flang/test/Lower/HLFIR/block_bindc_pocs.f90 index 090eeb35ea88b0..ed07d88c53a606 100644 --- a/flang/test/Lower/HLFIR/block_bindc_pocs.f90 +++ b/flang/test/Lower/HLFIR/block_bindc_pocs.f90 @@ -8,9 +8,9 @@ subroutine test_proc() bind(C) end subroutine test_proc end interface end module m -!CHECK-DAG: %[[S0:.*]] = fir.call @llvm.stacksave.p0() fastmath : () -> !fir.ref +!CHECK-DAG: %[[S0:.*]] = llvm.intr.stacksave : !llvm.ptr !CHECK-DAG: fir.call @test_proc() proc_attrs fastmath : () -> () -!CHECK-DAG: fir.call @llvm.stackrestore.p0(%[[S0]]) fastmath : (!fir.ref) -> () +!CHECK-DAG: llvm.intr.stackrestore %[[S0]] : !llvm.ptr !CHECK-DAG: func.func private @test_proc() attributes {fir.bindc_name = "test_proc"} subroutine test BLOCK diff --git a/flang/test/Lower/HLFIR/elemental-array-ops.f90 b/flang/test/Lower/HLFIR/elemental-array-ops.f90 index 80801fdde0d729..9929c17ec33994 100644 --- a/flang/test/Lower/HLFIR/elemental-array-ops.f90 +++ b/flang/test/Lower/HLFIR/elemental-array-ops.f90 @@ -182,12 +182,12 @@ end subroutine char_return ! CHECK: %[[VAL_23:.*]] = arith.constant 0 : index ! CHECK: %[[VAL_24:.*]] = arith.cmpi sgt, %[[VAL_22]], %[[VAL_23]] : index ! CHECK: %[[VAL_25:.*]] = arith.select %[[VAL_24]], %[[VAL_22]], %[[VAL_23]] : index -! CHECK: %[[VAL_26:.*]] = fir.call @llvm.stacksave.p0() fastmath : () -> !fir.ref +! CHECK: %[[VAL_26:.*]] = llvm.intr.stacksave : !llvm.ptr ! CHECK: %[[VAL_27:.*]] = fir.call @_QPcallee(%[[VAL_2]], %[[VAL_25]], %[[VAL_20]]) fastmath : (!fir.ref>, index, !fir.boxchar<1>) -> !fir.boxchar<1> ! CHECK: %[[VAL_28:.*]]:2 = hlfir.declare %[[VAL_2]] typeparams %[[VAL_25]] {uniq_name = ".tmp.func_result"} : (!fir.ref>, index) -> (!fir.ref>, !fir.ref>) ! CHECK: %[[MustFree:.*]] = arith.constant false ! CHECK: %[[ResultTemp:.*]] = hlfir.as_expr %[[VAL_28]]#0 move %[[MustFree]] : (!fir.ref>, i1) -> !hlfir.expr> -! CHECK: fir.call @llvm.stackrestore.p0(%[[VAL_26]]) fastmath : (!fir.ref) -> () +! CHECK: llvm.intr.stackrestore %[[VAL_26]] : !llvm.ptr ! CHECK: hlfir.yield_element %[[ResultTemp]] : !hlfir.expr> ! CHECK: } ! CHECK: %[[VAL_29:.*]] = arith.constant 0 : index diff --git a/flang/test/Lower/HLFIR/proc-pointer-comp-pass.f90 b/flang/test/Lower/HLFIR/proc-pointer-comp-pass.f90 index 247008e3a93df2..c1a827fe36ab1d 100644 --- a/flang/test/Lower/HLFIR/proc-pointer-comp-pass.f90 +++ b/flang/test/Lower/HLFIR/proc-pointer-comp-pass.f90 @@ -105,6 +105,6 @@ subroutine test5(x) ! CHECK: %[[VAL_7:.*]] = arith.constant 0 : index ! CHECK: %[[VAL_8:.*]] = arith.cmpi sgt, %[[VAL_6]], %[[VAL_7]] : index ! CHECK: %[[VAL_9:.*]] = arith.select %[[VAL_8]], %[[VAL_6]], %[[VAL_7]] : index -! CHECK: %[[VAL_10:.*]] = fir.call @llvm.stacksave.p0() fastmath : () -> !fir.ref +! CHECK: %[[VAL_10:.*]] = llvm.intr.stacksave : !llvm.ptr ! CHECK: %[[VAL_11:.*]] = fir.box_addr %[[VAL_4]] : (!fir.boxproc<(!fir.ref>, index, !fir.ref,p:!fir.boxproc<(!fir.ref>, index, !fir.ref>) -> !fir.boxchar<1>>}>>) -> !fir.boxchar<1>>) -> ((!fir.ref>, index, !fir.ref,p:!fir.boxproc<(!fir.ref>, index, !fir.ref>) -> !fir.boxchar<1>>}>>) -> !fir.boxchar<1>) ! CHECK: %[[VAL_12:.*]] = fir.call %[[VAL_11]](%[[VAL_1]], %[[VAL_9]], %[[VAL_2]]#1) fastmath : (!fir.ref>, index, !fir.ref,p:!fir.boxproc<(!fir.ref>, index, !fir.ref>) -> !fir.boxchar<1>>}>>) -> !fir.boxchar<1> diff --git a/flang/test/Lower/HLFIR/where-nonelemental.f90 b/flang/test/Lower/HLFIR/where-nonelemental.f90 index f0a6857f0f4b99..15a281b0ba6813 100644 --- a/flang/test/Lower/HLFIR/where-nonelemental.f90 +++ b/flang/test/Lower/HLFIR/where-nonelemental.f90 @@ -26,10 +26,10 @@ real elemental function elem_func(x) ! CHECK-LABEL: func.func @_QPtest_where( ! CHECK: hlfir.where { ! CHECK-NOT: hlfir.exactly_once -! CHECK: %[[VAL_17:.*]] = fir.call @llvm.stacksave.p0() fastmath : () -> !fir.ref +! CHECK: %[[VAL_17:.*]] = llvm.intr.stacksave : !llvm.ptr ! CHECK: %[[VAL_19:.*]] = fir.call @_QPlogical_func1() fastmath : () -> !fir.array<100x!fir.logical<4>> ! CHECK: hlfir.yield %{{.*}} : !hlfir.expr<100x!fir.logical<4>> cleanup { -! CHECK: fir.call @llvm.stackrestore.p0(%[[VAL_17]]) fastmath : (!fir.ref) -> () +! CHECK: llvm.intr.stackrestore %[[VAL_17]] : !llvm.ptr ! CHECK: } ! CHECK: } do { ! CHECK: hlfir.region_assign { @@ -70,10 +70,10 @@ real elemental function elem_func(x) ! CHECK: } ! CHECK: hlfir.elsewhere mask { ! CHECK: %[[VAL_62:.*]] = hlfir.exactly_once : !hlfir.expr<100x!fir.logical<4>> { -! CHECK: %[[VAL_72:.*]] = fir.call @llvm.stacksave.p0() fastmath : () -> !fir.ref +! CHECK: %[[VAL_72:.*]] = llvm.intr.stacksave : !llvm.ptr ! CHECK: fir.call @_QPlogical_func2() fastmath : () -> !fir.array<100x!fir.logical<4>> ! CHECK: hlfir.yield %{{.*}} : !hlfir.expr<100x!fir.logical<4>> cleanup { -! CHECK: fir.call @llvm.stackrestore.p0(%[[VAL_72]]) fastmath : (!fir.ref) -> () +! CHECK: llvm.intr.stackrestore %[[VAL_72]] : !llvm.ptr ! CHECK: } ! CHECK: } ! CHECK: hlfir.yield %[[VAL_62]] : !hlfir.expr<100x!fir.logical<4>> @@ -123,11 +123,11 @@ integer pure function pure_ifoo() ! CHECK: } (%[[VAL_10:.*]]: i32) { ! CHECK: %[[VAL_11:.*]] = hlfir.forall_index "i" %[[VAL_10]] : (i32) -> !fir.ref ! CHECK: hlfir.where { -! CHECK: %[[VAL_21:.*]] = fir.call @llvm.stacksave.p0() fastmath : () -> !fir.ref +! CHECK: %[[VAL_21:.*]] = llvm.intr.stacksave : !llvm.ptr ! CHECK-NOT: hlfir.exactly_once ! CHECK: %[[VAL_23:.*]] = fir.call @_QPpure_logical_func1() fastmath : () -> !fir.array<100x!fir.logical<4>> ! CHECK: hlfir.yield %{{.*}} : !hlfir.expr<100x!fir.logical<4>> cleanup { -! CHECK: fir.call @llvm.stackrestore.p0(%[[VAL_21]]) fastmath : (!fir.ref) -> () +! CHECK: llvm.intr.stackrestore %[[VAL_21]] : !llvm.ptr ! CHECK: } ! CHECK: } do { ! CHECK: hlfir.region_assign { @@ -172,10 +172,10 @@ integer pure function pure_ifoo() ! CHECK: } ! CHECK: hlfir.elsewhere mask { ! CHECK: %[[VAL_129:.*]] = hlfir.exactly_once : !hlfir.expr<100x!fir.logical<4>> { -! CHECK: %[[VAL_139:.*]] = fir.call @llvm.stacksave.p0() fastmath : () -> !fir.ref +! CHECK: %[[VAL_139:.*]] = llvm.intr.stacksave : !llvm.ptr ! CHECK: %[[VAL_141:.*]] = fir.call @_QPpure_logical_func2() fastmath : () -> !fir.array<100x!fir.logical<4>> ! CHECK: hlfir.yield %{{.*}} : !hlfir.expr<100x!fir.logical<4>> cleanup { -! CHECK: fir.call @llvm.stackrestore.p0(%[[VAL_139]]) fastmath : (!fir.ref) -> () +! CHECK: llvm.intr.stackrestore %[[VAL_139]] : !llvm.ptr ! CHECK: } ! CHECK: } ! CHECK: hlfir.yield %[[VAL_129]] : !hlfir.expr<100x!fir.logical<4>> diff --git a/flang/test/Lower/array-elemental-calls-char.f90 b/flang/test/Lower/array-elemental-calls-char.f90 index e2507f0a5e6046..652e79232c1b5e 100644 --- a/flang/test/Lower/array-elemental-calls-char.f90 +++ b/flang/test/Lower/array-elemental-calls-char.f90 @@ -227,7 +227,7 @@ subroutine foo6(c) ! CHECK: %[[VAL_16:.*]] = fir.convert %[[VAL_15]] : (i32) -> index ! CHECK: %[[CMPI:.*]] = arith.cmpi sgt, %[[VAL_16]], %{{.*}} : index ! CHECK: %[[SELECT:.*]] = arith.select %[[CMPI]], %[[VAL_16]], %{{.*}} : index - ! CHECK: %[[VAL_17:.*]] = fir.call @llvm.stacksave.p0() {{.*}}: () -> !fir.ref + ! CHECK: %[[VAL_17:.*]] = llvm.intr.stacksave : !llvm.ptr ! CHECK: %[[VAL_18:.*]] = fir.alloca !fir.char<1,?>(%[[SELECT]] : index) {bindc_name = ".result"} ! CHECK: %[[VAL_19:.*]] = fir.call @_QMchar_elemPelem_return_char(%[[VAL_18]], %[[SELECT]], %[[VAL_14]]) {{.*}}: (!fir.ref>, index, !fir.boxchar<1>) -> !fir.boxchar<1> ! CHECK: %[[VAL_20:.*]] = arith.cmpi slt, %[[VAL_6]]#1, %[[SELECT]] : index @@ -253,7 +253,7 @@ subroutine foo6(c) ! CHECK: %[[VAL_36:.*]] = arith.subi %[[VAL_31]], %[[VAL_2]] : index ! CHECK: br ^bb3(%[[VAL_35]], %[[VAL_36]] : index, index) ! CHECK: ^bb5: - ! CHECK: fir.call @llvm.stackrestore.p0(%[[VAL_17]]) {{.*}}: (!fir.ref) -> () + ! CHECK: llvm.intr.stackrestore %[[VAL_17]] : !llvm.ptr ! CHECK: %[[VAL_37:.*]] = arith.subi %[[VAL_10]], %[[VAL_2]] : index ! CHECK: br ^bb1(%[[VAL_12]], %[[VAL_37]] : index, index) ! CHECK: ^bb6: diff --git a/flang/test/Lower/block.f90 b/flang/test/Lower/block.f90 index 70ff67db718edc..d2bc90ef6c671c 100644 --- a/flang/test/Lower/block.f90 +++ b/flang/test/Lower/block.f90 @@ -7,13 +7,13 @@ program bb ! block stack management and exits integer :: i, j ! CHECK: fir.store %c0{{.*}} to %[[V_1]] : !fir.ref i = 0 - ! CHECK: %[[V_3:[0-9]+]] = fir.call @llvm.stacksave.p0() + ! CHECK: %[[V_3:[0-9]+]] = llvm.intr.stacksave : !llvm.ptr ! CHECK: fir.store %{{.*}} to %[[V_1]] : !fir.ref ! CHECK: br ^bb1 ! CHECK: ^bb1: // 2 preds: ^bb0, ^bb16 ! CHECK: cond_br %{{.*}}, ^bb2, ^bb17 ! CHECK: ^bb2: // pred: ^bb1 - ! CHECK: %[[V_11:[0-9]+]] = fir.call @llvm.stacksave.p0() + ! CHECK: %[[V_11:[0-9]+]] = llvm.intr.stacksave : !llvm.ptr ! CHECK: fir.store %{{.*}} to %[[V_1]] : !fir.ref ! CHECK: cond_br %{{.*}}, ^bb3, ^bb4 ! CHECK: ^bb3: // pred: ^bb2 @@ -27,29 +27,29 @@ program bb ! block stack management and exits ! CHECK: fir.store %{{.*}} to %[[V_1]] : !fir.ref ! CHECK: cond_br %{{.*}}, ^bb7, ^bb8 ! CHECK: ^bb7: // pred: ^bb6 - ! CHECK: fir.call @llvm.stackrestore.p0(%[[V_11]]) + ! CHECK: llvm.intr.stackrestore %[[V_11]] : !llvm.ptr ! CHECK: br ^bb15 ! CHECK: ^bb8: // pred: ^bb6 ! CHECK: fir.store %{{.*}} to %[[V_1]] : !fir.ref ! CHECK: cond_br %{{.*}}, ^bb9, ^bb10 ! CHECK: ^bb9: // pred: ^bb8 - ! CHECK: fir.call @llvm.stackrestore.p0(%[[V_11]]) + ! CHECK: llvm.intr.stackrestore %[[V_11]] : !llvm.ptr ! CHECK: br ^bb16 ! CHECK: ^bb10: // 2 preds: ^bb3, ^bb8 ! CHECK: fir.store %{{.*}} to %[[V_1]] : !fir.ref ! CHECK: cond_br %{{.*}}, ^bb11, ^bb12 ! CHECK: ^bb11: // pred: ^bb10 - ! CHECK: fir.call @llvm.stackrestore.p0(%[[V_11]]) + ! CHECK: llvm.intr.stackrestore %[[V_11]] : !llvm.ptr ! CHECK: br ^bb18 ! CHECK: ^bb12: // pred: ^bb10 ! CHECK: fir.store %{{.*}} to %[[V_1]] : !fir.ref ! CHECK: cond_br %{{.*}}, ^bb13, ^bb14 ! CHECK: ^bb13: // pred: ^bb12 - ! CHECK: fir.call @llvm.stackrestore.p0(%[[V_11]]) - ! CHECK: fir.call @llvm.stackrestore.p0(%[[V_3]]) + ! CHECK: llvm.intr.stackrestore %[[V_11]] : !llvm.ptr + ! CHECK: llvm.intr.stackrestore %[[V_3]] : !llvm.ptr ! CHECK: br ^bb19 ! CHECK: ^bb14: // 2 preds: ^bb5, ^bb12 - ! CHECK: fir.call @llvm.stackrestore.p0(%[[V_11]]) + ! CHECK: llvm.intr.stackrestore %[[V_11]] : !llvm.ptr ! CHECK: br ^bb15 ! CHECK: ^bb15: // 2 preds: ^bb7, ^bb14 ! CHECK: br ^bb16 @@ -59,7 +59,7 @@ program bb ! block stack management and exits ! CHECK: fir.store %{{.*}} to %[[V_1]] : !fir.ref ! CHECK: cf.br ^bb18 ! CHECK: ^bb18: // 2 preds: ^bb11, ^bb17 - ! CHECK: fir.call @llvm.stackrestore.p0(%[[V_3]]) + ! CHECK: llvm.intr.stackrestore %[[V_3]] : !llvm.ptr ! CHECK: br ^bb19 ! CHECK: ^bb19: // 2 preds: ^bb13, ^bb18 block @@ -79,10 +79,10 @@ program bb ! block stack management and exits 12 end block 100 print*, i ! expect 21 - ! CHECK: %[[V_51:[0-9]+]] = fir.call @llvm.stacksave.p0() fastmath : () -> !fir.ref + ! CHECK: %[[V_51:[0-9]+]] = llvm.intr.stacksave : !llvm.ptr ! CHECK: fir.store %c5{{.*}} to %[[V_0]] : !fir.ref ! CHECK: fir.call @ss(%[[V_0]]) proc_attrs fastmath : (!fir.ref) -> () - ! CHECK: fir.call @llvm.stackrestore.p0(%[[V_51]]) fastmath : (!fir.ref) -> () + ! CHECK: llvm.intr.stackrestore %[[V_51]] : !llvm.ptr block interface subroutine ss(n) bind(c) diff --git a/flang/test/Lower/computed-goto.f90 b/flang/test/Lower/computed-goto.f90 index adf76c3ae8d7a9..bb24411bd11ea6 100644 --- a/flang/test/Lower/computed-goto.f90 +++ b/flang/test/Lower/computed-goto.f90 @@ -38,15 +38,15 @@ function m(index) ! CHECK-LABEL: func @_QPm1 function m1(index) ! CHECK: %[[V_0:[0-9]+]] = fir.alloca i32 {bindc_name = "m1" - ! CHECK: %[[V_1:[0-9]+]] = fir.call @llvm.stacksave.p0() + ! CHECK: %[[V_1:[0-9]+]] = llvm.intr.stacksave : !llvm.ptr ! CHECK: %[[V_2:[0-9]+]] = fir.load %arg0 : !fir.ref ! CHECK: %[[V_3:[0-9]+]] = arith.cmpi eq, %[[V_2]], %c1{{.*}} : i32 ! CHECK: cf.cond_br %[[V_3]], ^bb1, ^bb2 ! CHECK: ^bb1: // pred: ^bb0 - ! CHECK: fir.call @llvm.stackrestore.p0(%[[V_1]]) + ! CHECK: llvm.intr.stackrestore %[[V_1]] : !llvm.ptr ! CHECK: cf.br ^bb3 ! CHECK: ^bb2: // pred: ^bb0 - ! CHECK: fir.call @llvm.stackrestore.p0(%[[V_1]]) + ! CHECK: llvm.intr.stackrestore %[[V_1]] : !llvm.ptr ! CHECK: fir.store %c0{{.*}} to %[[V_0]] : !fir.ref ! CHECK: cf.br ^bb4 ! CHECK: ^bb3: // pred: ^bb1 @@ -65,21 +65,21 @@ function m1(index) ! CHECK-LABEL: func @_QPm2 function m2(index) ! CHECK: %[[V_0:[0-9]+]] = fir.alloca i32 {bindc_name = "m2" - ! CHECK: %[[V_1:[0-9]+]] = fir.call @llvm.stacksave.p0() + ! CHECK: %[[V_1:[0-9]+]] = llvm.intr.stacksave : !llvm.ptr ! CHECK: %[[V_2:[0-9]+]] = fir.load %arg0 : !fir.ref ! CHECK: %[[V_3:[0-9]+]] = arith.cmpi eq, %[[V_2]], %c1{{.*}} : i32 ! CHECK: cf.cond_br %[[V_3]], ^bb1, ^bb2 ! CHECK: ^bb1: // pred: ^bb0 - ! CHECK: fir.call @llvm.stackrestore.p0(%[[V_1]]) + ! CHECK: llvm.intr.stackrestore %[[V_1]] : !llvm.ptr ! CHECK: cf.br ^bb5 ! CHECK: ^bb2: // pred: ^bb0 ! CHECK: %[[V_4:[0-9]+]] = arith.cmpi eq, %[[V_2]], %c2{{.*}} : i32 ! CHECK: cf.cond_br %[[V_4]], ^bb3, ^bb4 ! CHECK: ^bb3: // pred: ^bb2 - ! CHECK: fir.call @llvm.stackrestore.p0(%[[V_1]]) + ! CHECK: llvm.intr.stackrestore %[[V_1]] : !llvm.ptr ! CHECK: cf.br ^bb6 ! CHECK: ^bb4: // pred: ^bb2 - ! CHECK: fir.call @llvm.stackrestore.p0(%[[V_1]]) + ! CHECK: llvm.intr.stackrestore %[[V_1]] : !llvm.ptr ! CHECK: fir.store %c0{{.*}} to %[[V_0]] : !fir.ref ! CHECK: cf.br ^bb7 ! CHECK: ^bb5: // pred: ^bb1 @@ -102,27 +102,27 @@ function m2(index) ! CHECK-LABEL: func @_QPm3 function m3(index) ! CHECK: %[[V_0:[0-9]+]] = fir.alloca i32 {bindc_name = "m3" - ! CHECK: %[[V_1:[0-9]+]] = fir.call @llvm.stacksave.p0() + ! CHECK: %[[V_1:[0-9]+]] = llvm.intr.stacksave : !llvm.ptr ! CHECK: %[[V_2:[0-9]+]] = fir.load %arg0 : !fir.ref ! CHECK: %[[V_3:[0-9]+]] = arith.cmpi eq, %[[V_2]], %c1{{.*}} : i32 ! CHECK: cf.cond_br %[[V_3]], ^bb1, ^bb2 ! CHECK: ^bb1: // pred: ^bb0 - ! CHECK: fir.call @llvm.stackrestore.p0(%[[V_1]]) + ! CHECK: llvm.intr.stackrestore %[[V_1]] : !llvm.ptr ! CHECK: cf.br ^bb7 ! CHECK: ^bb2: // pred: ^bb0 ! CHECK: %[[V_4:[0-9]+]] = arith.cmpi eq, %[[V_2]], %c2{{.*}} : i32 ! CHECK: cf.cond_br %[[V_4]], ^bb3, ^bb4 ! CHECK: ^bb3: // pred: ^bb2 - ! CHECK: fir.call @llvm.stackrestore.p0(%[[V_1]]) + ! CHECK: llvm.intr.stackrestore %[[V_1]] : !llvm.ptr ! CHECK: cf.br ^bb8 ! CHECK: ^bb4: // pred: ^bb2 ! CHECK: %[[V_5:[0-9]+]] = arith.cmpi eq, %[[V_2]], %c3{{.*}} : i32 ! CHECK: cf.cond_br %[[V_5]], ^bb5, ^bb6 ! CHECK: ^bb5: // pred: ^bb4 - ! CHECK: fir.call @llvm.stackrestore.p0(%[[V_1]]) + ! CHECK: llvm.intr.stackrestore %[[V_1]] : !llvm.ptr ! CHECK: cf.br ^bb9 ! CHECK: ^bb6: // pred: ^bb4 - ! CHECK: fir.call @llvm.stackrestore.p0(%[[V_1]]) + ! CHECK: llvm.intr.stackrestore %[[V_1]] : !llvm.ptr ! CHECK: fir.store %c0{{.*}} to %[[V_0]] : !fir.ref ! CHECK: cf.br ^bb10 ! CHECK: ^bb7: // pred: ^bb1 diff --git a/flang/test/Lower/dummy-procedure-character.f90 b/flang/test/Lower/dummy-procedure-character.f90 index 9a2710f71e6bd7..a9a8a5a4172cf2 100644 --- a/flang/test/Lower/dummy-procedure-character.f90 +++ b/flang/test/Lower/dummy-procedure-character.f90 @@ -195,7 +195,7 @@ function bar10(n) ! CHECK: %[[C0:.*]] = arith.constant 0 : index ! CHECK: %[[COMPI:.*]] = arith.cmpi sgt, %[[VAL_5]], %[[C0]] : index ! CHECK: %[[SELECT:.*]] = arith.select %[[CMPI]], %[[VAL_5]], %[[C0]] : index -! CHECK: %[[VAL_6:.*]] = fir.call @llvm.stacksave.p0() {{.*}}: () -> !fir.ref +! CHECK: %[[VAL_6:.*]] = llvm.intr.stacksave : !llvm.ptr ! CHECK: %[[VAL_7:.*]] = fir.alloca !fir.char<1,?>(%[[SELECT]] : index) {bindc_name = ".result"} ! CHECK: %[[VAL_8:.*]] = fir.convert %[[WAL_1]] : (() -> ()) -> ((!fir.ref>, index, !fir.ref) -> !fir.boxchar<1>) ! CHECK: fir.call %[[VAL_8]](%[[VAL_7]], %[[SELECT]], %[[VAL_1]]) {{.*}}: (!fir.ref>, index, !fir.ref) -> !fir.boxchar<1> diff --git a/flang/test/Lower/explicit-interface-results-2.f90 b/flang/test/Lower/explicit-interface-results-2.f90 index a63ee5fc91794d..95aee84f4a6446 100644 --- a/flang/test/Lower/explicit-interface-results-2.f90 +++ b/flang/test/Lower/explicit-interface-results-2.f90 @@ -252,12 +252,12 @@ subroutine test_call_to_used_interface(dummy_proc) call takes_array(dummy_proc()) ! CHECK: %[[VAL_1:.*]] = arith.constant 100 : index ! CHECK: %[[VAL_2:.*]] = fir.alloca !fir.array<100xf32> {bindc_name = ".result"} -! CHECK: %[[VAL_3:.*]] = fir.call @llvm.stacksave.p0() {{.*}}: () -> !fir.ref +! CHECK: %[[VAL_3:.*]] = llvm.intr.stacksave : !llvm.ptr ! CHECK: %[[VAL_4:.*]] = fir.shape %[[VAL_1]] : (index) -> !fir.shape<1> ! CHECK: %[[VAL_5:.*]] = fir.box_addr %[[VAL_0]] : (!fir.boxproc<() -> ()>) -> (() -> !fir.array<100xf32>) ! CHECK: %[[VAL_6:.*]] = fir.call %[[VAL_5]]() {{.*}}: () -> !fir.array<100xf32> ! CHECK: fir.save_result %[[VAL_6]] to %[[VAL_2]](%[[VAL_4]]) : !fir.array<100xf32>, !fir.ref>, !fir.shape<1> ! CHECK: %[[VAL_7:.*]] = fir.convert %[[VAL_2]] : (!fir.ref>) -> !fir.ref> ! CHECK: fir.call @_QPtakes_array(%[[VAL_7]]) {{.*}}: (!fir.ref>) -> () -! CHECK: fir.call @llvm.stackrestore.p0(%[[VAL_3]]) {{.*}}: (!fir.ref) -> () +! CHECK: llvm.intr.stackrestore %[[VAL_3]] : !llvm.ptr end subroutine diff --git a/flang/test/Lower/forall/array-constructor.f90 b/flang/test/Lower/forall/array-constructor.f90 index ad21ed33fba2d4..4c8c756ea689c1 100644 --- a/flang/test/Lower/forall/array-constructor.f90 +++ b/flang/test/Lower/forall/array-constructor.f90 @@ -232,7 +232,7 @@ end subroutine ac2 ! CHECK: %[[C0:.*]] = arith.constant 0 : index ! CHECK: %[[CMPI:.*]] = arith.cmpi sgt, %[[VAL_80]], %[[C0]] : index ! CHECK: %[[SELECT:.*]] = arith.select %[[CMPI]], %[[VAL_80]], %[[C0]] : index -! CHECK: %[[VAL_81:.*]] = fir.call @llvm.stacksave.p0() {{.*}}: () -> !fir.ref +! CHECK: %[[VAL_81:.*]] = llvm.intr.stacksave : !llvm.ptr ! CHECK: %[[VAL_82:.*]] = fir.shape %[[SELECT]] : (index) -> !fir.shape<1> ! CHECK: %[[VAL_83:.*]] = fir.convert %[[VAL_74]] : (!fir.box>) -> !fir.box> ! CHECK: %[[VAL_84:.*]] = fir.call @_QFac2Pfunc(%[[VAL_83]]) {{.*}}: (!fir.box>) -> !fir.array<3xi32> @@ -250,7 +250,7 @@ end subroutine ac2 ! CHECK: %[[VAL_97:.*]] = fir.array_update %[[VAL_92]], %[[VAL_93]], %[[VAL_96]] : (!fir.array, i32, index) -> !fir.array ! CHECK: fir.result %[[VAL_97]] : !fir.array ! CHECK: } -! CHECK: fir.call @llvm.stackrestore.p0(%[[VAL_81]]) {{.*}}: (!fir.ref) -> () +! CHECK: llvm.intr.stackrestore %[[VAL_81]] : !llvm.ptr ! CHECK: fir.freemem %[[VAL_61]] : !fir.heap> ! CHECK: fir.freemem %[[VAL_57]] : !fir.heap> ! CHECK: fir.result %[[VAL_98:.*]] : !fir.array diff --git a/flang/test/Lower/host-associated-functions.f90 b/flang/test/Lower/host-associated-functions.f90 index d67a74fa399804..65045845f526d9 100644 --- a/flang/test/Lower/host-associated-functions.f90 +++ b/flang/test/Lower/host-associated-functions.f90 @@ -36,7 +36,7 @@ subroutine internal() ! CHECK: %[[C0:.*]] = arith.constant 0 : index ! CHECK: %[[CMPI:.*]] = arith.cmpi sgt, %[[VAL_16]], %[[C0]] : index ! CHECK: %[[SELECT:.*]] = arith.select %[[CMPI]], %[[VAL_16]], %[[C0]] : index - ! CHECK: %[[VAL_17:.*]] = fir.call @llvm.stacksave.p0() {{.*}}: () -> !fir.ref + ! CHECK: %[[VAL_17:.*]] = llvm.intr.stacksave : !llvm.ptr ! CHECK: %[[VAL_18:.*]] = fir.alloca !fir.char<1,?>(%[[SELECT]] : index) {bindc_name = ".result"} ! CHECK: %[[VAL_19:.*]] = fir.convert %[[VAL_13]] : (() -> ()) -> ((!fir.ref>, index) -> !fir.boxchar<1>) ! CHECK: %[[VAL_20:.*]] = fir.call %[[VAL_19]](%[[VAL_18]], %[[SELECT]]) {{.*}}: (!fir.ref>, index) -> !fir.boxchar<1> @@ -64,7 +64,7 @@ subroutine internal() ! CHECK: %[[VAL_9:.*]] = fir.extract_value %[[VAL_3]], [0 : index] : (tuple ()>, i64>) -> !fir.boxproc<() -> ()> ! CHECK: %[[VAL_10:.*]] = fir.box_addr %[[VAL_9]] : (!fir.boxproc<() -> ()>) -> (() -> ()) ! CHECK: %[[VAL_11:.*]] = fir.extract_value %[[VAL_3]], [1 : index] : (tuple ()>, i64>) -> i64 -! CHECK: %[[VAL_12:.*]] = fir.call @llvm.stacksave.p0() {{.*}}: () -> !fir.ref +! CHECK: %[[VAL_12:.*]] = llvm.intr.stacksave : !llvm.ptr ! CHECK: %[[VAL_13:.*]] = fir.alloca !fir.char<1,?>(%[[VAL_11]] : i64) {bindc_name = ".result"} ! CHECK: %[[VAL_14:.*]] = fir.convert %[[VAL_10]] : (() -> ()) -> ((!fir.ref>, index) -> !fir.boxchar<1>) ! CHECK: %[[VAL_15:.*]] = fir.convert %[[VAL_11]] : (i64) -> index @@ -124,7 +124,7 @@ subroutine internal() ! CHECK: %[[C0:.*]] = arith.constant 0 : index ! CHECK: %[[CMPI:.*]] = arith.cmpi sgt, %[[VAL_15]], %[[C0]] : index ! CHECK: %[[SELECT:.*]] = arith.select %[[CMPI]], %[[VAL_15]], %[[C0]] : index -! CHECK: %[[VAL_16:.*]] = fir.call @llvm.stacksave.p0() {{.*}}: () -> !fir.ref +! CHECK: %[[VAL_16:.*]] = llvm.intr.stacksave : !llvm.ptr ! CHECK: %[[VAL_17:.*]] = fir.alloca !fir.array, %[[SELECT]] {bindc_name = ".result"} print *, array_func() end subroutine diff --git a/flang/test/Lower/host-associated.f90 b/flang/test/Lower/host-associated.f90 index b0195108238d7c..67465f5a7073d4 100644 --- a/flang/test/Lower/host-associated.f90 +++ b/flang/test/Lower/host-associated.f90 @@ -515,12 +515,12 @@ end subroutine test_proc_dummy_other ! CHECK: %[[VAL_35:.*]] = fir.undefined tuple ()>, i64> ! CHECK: %[[VAL_36:.*]] = fir.insert_value %[[VAL_35]], %[[VAL_34]], [0 : index] : (tuple ()>, i64>, !fir.boxproc<() -> ()>) -> tuple ()>, i64> ! CHECK: %[[VAL_37:.*]] = fir.insert_value %[[VAL_36]], %[[VAL_8]], [1 : index] : (tuple ()>, i64>, i64) -> tuple ()>, i64> -! CHECK: %[[VAL_38:.*]] = fir.call @llvm.stacksave.p0() {{.*}}: () -> !fir.ref +! CHECK: %[[VAL_38:.*]] = llvm.intr.stacksave : !llvm.ptr ! CHECK: %[[VAL_39:.*]] = fir.call @_QPget_message(%[[VAL_11]], %[[VAL_9]], %[[VAL_37]]) {{.*}}: (!fir.ref>, index, tuple ()>, i64>) -> !fir.boxchar<1> ! CHECK: %[[VAL_40:.*]] = fir.convert %[[VAL_11]] : (!fir.ref>) -> !fir.ref ! CHECK: %[[VAL_41:.*]] = fir.convert %[[VAL_9]] : (index) -> i64 ! CHECK: %[[VAL_42:.*]] = fir.call @_FortranAioOutputAscii(%[[VAL_32]], %[[VAL_40]], %[[VAL_41]]) {{.*}}: (!fir.ref, !fir.ref, i64) -> i1 -! CHECK: fir.call @llvm.stackrestore.p0(%[[VAL_38]]) {{.*}}: (!fir.ref) -> () +! CHECK: llvm.intr.stackrestore %[[VAL_38]] : !llvm.ptr ! CHECK: %[[VAL_43:.*]] = fir.call @_FortranAioEndIoStatement(%[[VAL_32]]) {{.*}}: (!fir.ref) -> i32 ! CHECK: return ! CHECK: } @@ -577,7 +577,7 @@ end subroutine test_proc_dummy_other ! CHECK: %[[VAL_11:.*]] = fir.extract_value %[[VAL_2]], [0 : index] : (tuple ()>, i64>) -> !fir.boxproc<() -> ()> ! CHECK: %[[VAL_12:.*]] = fir.box_addr %[[VAL_11]] : (!fir.boxproc<() -> ()>) -> (() -> ()) ! CHECK: %[[VAL_13:.*]] = fir.extract_value %[[VAL_2]], [1 : index] : (tuple ()>, i64>) -> i64 -! CHECK: %[[VAL_14:.*]] = fir.call @llvm.stacksave.p0() {{.*}}: () -> !fir.ref +! CHECK: %[[VAL_14:.*]] = llvm.intr.stacksave : !llvm.ptr ! CHECK: %[[VAL_15:.*]] = fir.alloca !fir.char<1,?>(%[[VAL_13]] : i64) {bindc_name = ".result"} ! CHECK: %[[VAL_16:.*]] = fir.convert %[[VAL_12]] : (() -> ()) -> ((!fir.ref>, index) -> !fir.boxchar<1>) ! CHECK: %[[VAL_17:.*]] = fir.convert %[[VAL_13]] : (i64) -> index @@ -624,7 +624,7 @@ end subroutine test_proc_dummy_other ! CHECK: %[[VAL_48:.*]] = arith.subi %[[VAL_43]], %[[VAL_6]] : index ! CHECK: br ^bb4(%[[VAL_47]], %[[VAL_48]] : index, index) ! CHECK: ^bb6: -! CHECK: fir.call @llvm.stackrestore.p0(%[[VAL_14]]) {{.*}}: (!fir.ref) -> () +! CHECK: llvm.intr.stackrestore %[[VAL_14]] : !llvm.ptr ! CHECK: %[[VAL_49:.*]] = fir.emboxchar %[[VAL_0]], %[[VAL_3]] : (!fir.ref>, index) -> !fir.boxchar<1> ! CHECK: return %[[VAL_49]] : !fir.boxchar<1> ! CHECK: } diff --git a/flang/test/Lower/io-write.f90 b/flang/test/Lower/io-write.f90 index ee079eb540a5eb..234fcdabeaac8a 100644 --- a/flang/test/Lower/io-write.f90 +++ b/flang/test/Lower/io-write.f90 @@ -18,7 +18,7 @@ ! CHECK: %[[Const_0:.*]] = arith.constant 0 : index ! CHECK: %[[Val_7:.*]] = arith.cmpi sgt, %[[Val_6]], %[[Const_0]] : index ! CHECK: %[[Val_8:.*]] = arith.select %[[Val_7]], %[[Val_6]], %[[Const_0]] : index -! CHECK: %[[Val_9:.*]] = fir.call @llvm.stacksave.p0() {{.*}}: () -> !fir.ref +! CHECK: %[[Val_9:.*]] = llvm.intr.stacksave : !llvm.ptr ! CHECK: %[[Val_10:.*]] = fir.alloca !fir.char<1,?>(%[[Val_8]] : index) {bindc_name = ".result"} ! CHECK: %[[Val_11:.*]] = fir.call @_QFPgetstring(%[[Val_10]], %[[Val_8]], %[[Val_0]]) {{.*}}: (!fir.ref>, index, !fir.ref) -> !fir.boxchar<1> ! CHECK: %[[Val_12:.*]] = fir.convert %[[Val_10]] : (!fir.ref>) -> !fir.ref @@ -32,7 +32,7 @@ ! CHECK: %[[Val_18:.*]] = fir.call @_FortranAioBeginInternalFormattedOutput(%[[Val_2]], %[[Val_3]], %[[Val_12]], %[[Val_13]], ! %[[Val_14]], %[[Val_15]], %[[Const_0_i64_0]], %17, %{{.*}}) : (!fir.ref, i64, !fir.ref, i64, !fir.box, !fir.ref>, i64, !fir.ref, i32) -> !fir.ref ! CHECK: %[[Val_19:.*]] = fir.call @_FortranAioEndIoStatement(%18) {{.*}}: (!fir.ref) -> i32 -! CHECK: fir.call @llvm.stackrestore.p0(%[[Val_9]]) {{.*}}: (!fir.ref) -> () +! CHECK: llvm.intr.stackrestore %[[Val_9]] : !llvm.ptr if (string/="hi") stop 'FAIL' contains function getstring(n) result(r) diff --git a/flang/test/Transforms/stack-arrays.fir b/flang/test/Transforms/stack-arrays.fir index 45c22c15f79950..66cd2a5aa910b9 100644 --- a/flang/test/Transforms/stack-arrays.fir +++ b/flang/test/Transforms/stack-arrays.fir @@ -174,9 +174,9 @@ func.func @placement3() { // CHECK-NEXT: %[[C10:.*]] = arith.constant 10 : index // CHECK-NEXT: fir.do_loop // CHECK-NEXT: %[[SUM:.*]] = arith.addi %[[C1]], %[[C2]] : index -// CHECK-NEXT: %[[SP:.*]] = fir.call @llvm.stacksave.p0() : () -> !fir.ref +// CHECK-NEXT: %[[SP:.*]] = llvm.intr.stacksave : !llvm.ptr // CHECK-NEXT: %[[MEM:.*]] = fir.alloca !fir.array, %[[SUM]] -// CHECK-NEXT: fir.call @llvm.stackrestore.p0(%[[SP]]) +// CHECK-NEXT: llvm.intr.stackrestore %[[SP]] : !llvm.ptr // CHECK-NEXT: fir.result // CHECK-NEXT: } // CHECK-NEXT: return @@ -206,9 +206,9 @@ func.func @placement4(%arg0 : i1) { // CHECK-NEXT: cf.br ^bb1 // CHECK-NEXT: ^bb1: // CHECK-NEXT: %[[C3:.*]] = arith.constant 3 : index -// CHECK-NEXT: %[[SP:.*]] = fir.call @llvm.stacksave.p0() : () -> !fir.ref +// CHECK-NEXT: %[[SP:.*]] = llvm.intr.stacksave : !llvm.ptr // CHECK-NEXT: %[[MEM:.*]] = fir.alloca !fir.array, %[[C3]] -// CHECK-NEXT: fir.call @llvm.stackrestore.p0(%[[SP]]) : (!fir.ref) -> () +// CHECK-NEXT: llvm.intr.stackrestore %[[SP]] : !llvm.ptr // CHECK-NEXT: cf.cond_br %arg0, ^bb1, ^bb2 // CHECK-NEXT: ^bb2: // CHECK-NEXT: return @@ -393,9 +393,9 @@ func.func @placement_loop_declare() { // CHECK-NEXT: %[[C10:.*]] = arith.constant 10 : index // CHECK-NEXT: fir.do_loop // CHECK-NEXT: %[[SUM:.*]] = arith.addi %[[C1]], %[[C2]] : index -// CHECK-NEXT: %[[SP:.*]] = fir.call @llvm.stacksave.p0() : () -> !fir.ref +// CHECK-NEXT: %[[SP:.*]] = llvm.intr.stacksave : !llvm.ptr // CHECK-NEXT: %[[MEM:.*]] = fir.alloca !fir.array, %[[SUM]] -// CHECK: fir.call @llvm.stackrestore.p0(%[[SP]]) +// CHECK: llvm.intr.stackrestore %[[SP]] : !llvm.ptr // CHECK-NEXT: fir.result // CHECK-NEXT: } // CHECK-NEXT: return