[flang-commits] [flang] [flang] Fix -fno-omit-frame-pointer (PR #180507)

via flang-commits flang-commits at lists.llvm.org
Mon Feb 9 03:24:48 PST 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-flang-codegen

Author: KAWASHIMA Takahiro (kawashima-fj)

<details>
<summary>Changes</summary>

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

---
Full diff: https://github.com/llvm/llvm-project/pull/180507.diff


3 Files Affected:

- (modified) flang/include/flang/Optimizer/Transforms/Passes.td (+2-1) 
- (modified) flang/lib/Optimizer/Passes/Pipelines.cpp (+3) 
- (modified) flang/test/Driver/func-attr.f90 (+5) 


``````````diff
diff --git a/flang/include/flang/Optimizer/Transforms/Passes.td b/flang/include/flang/Optimizer/Transforms/Passes.td
index 090a1ce24fd8b..25c3fd9c955ed 100644
--- a/flang/include/flang/Optimizer/Transforms/Passes.td
+++ b/flang/include/flang/Optimizer/Transforms/Passes.td
@@ -426,7 +426,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 6812347a8d39b..676f0c4de7e7a 100644
--- a/flang/lib/Optimizer/Passes/Pipelines.cpp
+++ b/flang/lib/Optimizer/Passes/Pipelines.cpp
@@ -394,6 +394,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" }
 

``````````

</details>


https://github.com/llvm/llvm-project/pull/180507


More information about the flang-commits mailing list