Skip to content

Comments

[flang] Fix -fno-omit-frame-pointer#180507

Merged
kawashima-fj merged 2 commits intollvm:mainfrom
kawashima-fj:bugfix/flang-omit-fp
Feb 12, 2026
Merged

[flang] Fix -fno-omit-frame-pointer#180507
kawashima-fj merged 2 commits intollvm:mainfrom
kawashima-fj:bugfix/flang-omit-fp

Conversation

@kawashima-fj
Copy link
Member

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

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
@llvmbot llvmbot added flang:driver flang Flang issues not falling into any other category flang:fir-hlfir labels Feb 9, 2026
@llvmbot
Copy link
Member

llvmbot commented Feb 9, 2026

@llvm/pr-subscribers-flang-driver

@llvm/pr-subscribers-flang-codegen

Author: KAWASHIMA Takahiro (kawashima-fj)

Changes

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 --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" }
 

@kawashima-fj
Copy link
Member Author

This is a regression in LLVM 22. I'll request a backport once this PR is merged.

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.

Thanks, this looks good.

We could maybe reuse the llvm to mlir::LLVM enum conversion from #include "mlir/Dialect/LLVMIR/LLVMConversionEnumsToLLVM.inc" (auto generated header) that produces defined ::mlir::LLVM::framePointerKind::FramePointerKind convertFramePointerKindFromLLVM(::llvm::FramePointerKind value).

This would avoid having flang to maintain this switches when new values are added. however, I am not completely sure it is a good idea to include those headers directly in flang, so your patch is good and we can try to reuse this later.

@kawashima-fj kawashima-fj merged commit e2297da into llvm:main Feb 12, 2026
10 checks passed
@kawashima-fj kawashima-fj deleted the bugfix/flang-omit-fp branch February 13, 2026 00:10
@kawashima-fj kawashima-fj added this to the LLVM 22.x Release milestone Feb 13, 2026
@kawashima-fj
Copy link
Member Author

/cherry-pick e2297da

@llvmbot
Copy link
Member

llvmbot commented Feb 13, 2026

/pull-request #181277

kevinwkt pushed a commit to kevinwkt/llvm-project that referenced this pull request Feb 16, 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
c-rhodes pushed a commit to llvmbot/llvm-project that referenced this pull request Feb 16, 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)
manasij7479 pushed a commit to manasij7479/llvm-project that referenced this pull request Feb 18, 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

flang:codegen 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.

[Flang][AArch64][Regression] Frame pointer register (x29) not emitted in LLVM 22.1.0-rc1

3 participants