Skip to content

release/22.x: [flang] Fix -fno-omit-frame-pointer (#180507)#181277

Merged
c-rhodes merged 1 commit intollvm:release/22.xfrom
llvmbot:issue180507
Feb 16, 2026
Merged

release/22.x: [flang] Fix -fno-omit-frame-pointer (#180507)#181277
c-rhodes merged 1 commit intollvm:release/22.xfrom
llvmbot:issue180507

Conversation

@llvmbot
Copy link
Member

@llvmbot llvmbot commented Feb 13, 2026

Backport e2297da

Requested by: @kawashima-fj

@llvmbot
Copy link
Member Author

llvmbot commented Feb 13, 2026

@jeanPerier What do you think about merging this PR to the release branch?

@llvmbot llvmbot requested a review from jeanPerier February 13, 2026 00:21
@llvmbot llvmbot added flang:driver flang Flang issues not falling into any other category flang:fir-hlfir labels Feb 13, 2026
@llvmbot llvmbot temporarily deployed to main-branch-only February 13, 2026 00:21 — with GitHub Actions Inactive
@llvmbot llvmbot temporarily deployed to main-branch-only February 13, 2026 00:21 — with GitHub Actions Inactive
@llvmbot llvmbot temporarily deployed to main-branch-only February 13, 2026 00:21 — with GitHub Actions Inactive
@llvmbot
Copy link
Member Author

llvmbot commented Feb 13, 2026

@llvm/pr-subscribers-flang-fir-hlfir

Author: None (llvmbot)

Changes

Backport e2297da

Requested by: @kawashima-fj


Full diff: https://github.com/llvm/llvm-project/pull/181277.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 --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" }
 

@llvmbot
Copy link
Member Author

llvmbot commented Feb 13, 2026

@llvm/pr-subscribers-flang-driver

Author: None (llvmbot)

Changes

Backport e2297da

Requested by: @kawashima-fj


Full diff: https://github.com/llvm/llvm-project/pull/181277.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 --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" }
 

Copy link
Contributor

@jeanPerier jeanPerier left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good

@github-project-automation github-project-automation bot moved this from Needs Triage to Needs Merge in LLVM Release Status Feb 13, 2026
The PR llvm#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 llvm#180118

(cherry picked from commit e2297da)
@c-rhodes c-rhodes merged commit 2350d0f into llvm:release/22.x Feb 16, 2026
@github-project-automation github-project-automation bot moved this from Needs Merge to Done in LLVM Release Status Feb 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

flang:driver flang:fir-hlfir flang Flang issues not falling into any other category

Projects

Development

Successfully merging this pull request may close these issues.

4 participants