[llvm-branch-commits] [flang] release/22.x: [flang] Fix -fno-omit-frame-pointer (#180507) (PR #181277)
Cullen Rhodes via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Feb 16 00:57:57 PST 2026
https://github.com/c-rhodes updated https://github.com/llvm/llvm-project/pull/181277
>From 2350d0f399261deebea5ad6c30f3f579968d23a1 Mon Sep 17 00:00:00 2001
From: KAWASHIMA Takahiro <t-kawashima at fujitsu.com>
Date: Thu, 12 Feb 2026 10:24:47 +0900
Subject: [PATCH] [flang] Fix -fno-omit-frame-pointer (#180507)
The PR #163775 added `FramePointerKind::NonLeafNoReserve`. However it
seems it forgot to update some codes in Flang. By this bug,
`frame-pointer` attribute in IR was not set even if
`-fno-omit-frame-pointer` is specified.
Fixes #180118
(cherry picked from commit e2297da21660a0c9f3db90c3effd18f6c17e38e9)
---
flang/include/flang/Optimizer/Transforms/Passes.td | 3 ++-
flang/lib/Optimizer/Passes/Pipelines.cpp | 3 +++
flang/test/Driver/func-attr.f90 | 5 +++++
3 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/flang/include/flang/Optimizer/Transforms/Passes.td b/flang/include/flang/Optimizer/Transforms/Passes.td
index b40ef0aa0b319..d9f52025fe104 100644
--- a/flang/include/flang/Optimizer/Transforms/Passes.td
+++ b/flang/include/flang/Optimizer/Transforms/Passes.td
@@ -417,7 +417,8 @@ def FunctionAttr : Pass<"function-attr", "mlir::func::FuncOp"> {
clEnumValN(mlir::LLVM::framePointerKind::FramePointerKind::None, "None", ""),
clEnumValN(mlir::LLVM::framePointerKind::FramePointerKind::NonLeaf, "NonLeaf", ""),
clEnumValN(mlir::LLVM::framePointerKind::FramePointerKind::All, "All", ""),
- clEnumValN(mlir::LLVM::framePointerKind::FramePointerKind::Reserved, "Reserved", "")
+ clEnumValN(mlir::LLVM::framePointerKind::FramePointerKind::Reserved, "Reserved", ""),
+ clEnumValN(mlir::LLVM::framePointerKind::FramePointerKind::NonLeafNoReserve, "NonLeafNoReserve", "")
)}]>,
Option<"instrumentFunctionEntry", "instrument-function-entry",
"std::string", /*default=*/"",
diff --git a/flang/lib/Optimizer/Passes/Pipelines.cpp b/flang/lib/Optimizer/Passes/Pipelines.cpp
index cdac494c97e3a..1682890115c64 100644
--- a/flang/lib/Optimizer/Passes/Pipelines.cpp
+++ b/flang/lib/Optimizer/Passes/Pipelines.cpp
@@ -387,6 +387,9 @@ void createDefaultFIRCodeGenPassPipeline(mlir::PassManager &pm,
framePointerKind = mlir::LLVM::framePointerKind::FramePointerKind::All;
else if (config.FramePointerKind == llvm::FramePointerKind::Reserved)
framePointerKind = mlir::LLVM::framePointerKind::FramePointerKind::Reserved;
+ else if (config.FramePointerKind == llvm::FramePointerKind::NonLeafNoReserve)
+ framePointerKind =
+ mlir::LLVM::framePointerKind::FramePointerKind::NonLeafNoReserve;
else
framePointerKind = mlir::LLVM::framePointerKind::FramePointerKind::None;
diff --git a/flang/test/Driver/func-attr.f90 b/flang/test/Driver/func-attr.f90
index e8cab4fca2226..78bde6d46b1f7 100644
--- a/flang/test/Driver/func-attr.f90
+++ b/flang/test/Driver/func-attr.f90
@@ -4,6 +4,7 @@
! RUN: %flang_fc1 -triple aarch64-none-none -mframe-pointer=none -emit-llvm -o - %s 2>&1| FileCheck %s --check-prefix=CHECK-NONEFP
! RUN: %flang_fc1 -triple aarch64-none-none -mframe-pointer=non-leaf -emit-llvm -o - %s 2>&1| FileCheck %s --check-prefix=CHECK-NONLEAFFP
+! RUN: %flang_fc1 -triple aarch64-none-none -mframe-pointer=non-leaf-no-reserve -emit-llvm -o - %s 2>&1| FileCheck %s --check-prefix=CHECK-NONLEAFNORESERVEFP
! RUN: %flang_fc1 -triple aarch64-none-none -mframe-pointer=reserved -emit-llvm -o - %s 2>&1| FileCheck %s --check-prefix=CHECK-RESERVEDFP
! RUN: %flang_fc1 -triple aarch64-none-none -mframe-pointer=all -emit-llvm -o - %s 2>&1| FileCheck %s --check-prefix=CHECK-ALLFP
! RUN: not %flang_fc1 -triple aarch64-none-none -mframe-pointer=wrongval -emit-llvm -o - %s 2>&1| FileCheck %s --check-prefix=CHECK-WRONGVALUEFP
@@ -13,6 +14,9 @@
! CHECK-NONLEAFFP-LABEL: @func_()
! CHECK-NONLEAFFP-SAME: #0
+! CHECK-NONLEAFNORESERVEFP-LABEL: @func_()
+! CHECK-NONLEAFNORESERVEFP-SAME: #0
+
! CHECK-ALLFP-LABEL: @func_()
! CHECK-ALLFP-SAME: #0
@@ -21,6 +25,7 @@ end subroutine func
! CHECK-NONEFP-NOT: attributes #0 = { "frame-pointer"="{{.*}}" }
! CHECK-NONLEAFFP: attributes #0 = { "frame-pointer"="non-leaf" }
+! CHECK-NONLEAFNORESERVEFP: attributes #0 = { "frame-pointer"="non-leaf-no-reserve" }
! CHECK-RESERVEDFP: attributes #0 = { "frame-pointer"="reserved" }
! CHECK-ALLFP: attributes #0 = { "frame-pointer"="all" }
More information about the llvm-branch-commits
mailing list