[llvm] dc84cd3 - [BPF] Avoid stack argument fatal error with O0 optimization (#206398)

via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 29 10:54:20 PDT 2026


Author: yonghong-song
Date: 2026-06-29T10:54:14-07:00
New Revision: dc84cd36b0ba398874bfaf523fd2db933cb156de

URL: https://github.com/llvm/llvm-project/commit/dc84cd36b0ba398874bfaf523fd2db933cb156de
DIFF: https://github.com/llvm/llvm-project/commit/dc84cd36b0ba398874bfaf523fd2db933cb156de.diff

LOG: [BPF] Avoid stack argument fatal error with O0 optimization (#206398)

Upstream reported a compiler fatal error with stack arguments ([1]). The
source code:
```
  void f(int, int, int, int, int, int);
  int main(void)
  {
        f(0, 0, 0, 0, 0, 0);
        return 0;
  }
```
The compilation flag: `clang --target=bpf -O0 -c t.c`

The failure symptom:
```
  fatal error: error in backend: Unsupported instruction : <MCInst 338 <MCOperand Imm:-8> <MCOperand Reg:2>>
```
The failure reason is due to `BPF PreEmit Peephole Optimization`. It is
supposed to convert
```
  STORE_STACK_ARG_PSEUDO -8, killed $r1
```
to
```
  STD killed $r1, $r11, -8
```

Otherwise, the `BPF Assembly Printer` pass does not understand
`STORE_STACK_ARG_PSEUDO` and caused the crash.

To fix the issue, two things happened:
1. In `BPFTargetMachine.cpp`, remove `getOptLevel() !=
CodeGenOptLevel::None` checking. This is redundant as the same checking
(with `skipFunction())` in `BPFMIPeephole.cpp`. For `skipFunction()`, if
opt level is `None`, the function will be skipped.
2. In `BPFMIPeephole.cpp`, do `expandStackArgPseudos()` before
`skipFunction()` checking. This fixed the problem.

  [1] https://github.com/llvm/llvm-project/issues/205647

Added: 
    

Modified: 
    llvm/lib/Target/BPF/BPFMIPeephole.cpp
    llvm/lib/Target/BPF/BPFTargetMachine.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/BPF/BPFMIPeephole.cpp b/llvm/lib/Target/BPF/BPFMIPeephole.cpp
index 3e5924a6ac74c..637872ee2ebb8 100644
--- a/llvm/lib/Target/BPF/BPFMIPeephole.cpp
+++ b/llvm/lib/Target/BPF/BPFMIPeephole.cpp
@@ -329,19 +329,18 @@ struct BPFMIPreEmitPeephole : public MachineFunctionPass {
 
   // Main entry point for this pass.
   bool runOnMachineFunction(MachineFunction &MF) override {
-    if (skipFunction(MF.getFunction()))
-      return false;
-
     initialize(MF);
 
-    bool Changed;
-    Changed = eliminateRedundantMov();
+    bool Changed = expandStackArgPseudos();
+    if (skipFunction(MF.getFunction()))
+      return Changed;
+
+    Changed |= eliminateRedundantMov();
     if (SupportGotol)
-      Changed = adjustBranch() || Changed;
+      Changed |= adjustBranch();
     Changed |= insertMissingCallerSavedSpills();
     Changed |= removeMayGotoZero();
     Changed |= addExitAfterUnreachable();
-    Changed |= expandStackArgPseudos();
     return Changed;
   }
 };

diff  --git a/llvm/lib/Target/BPF/BPFTargetMachine.cpp b/llvm/lib/Target/BPF/BPFTargetMachine.cpp
index ad3df2c879fe7..a1ac20b841e39 100644
--- a/llvm/lib/Target/BPF/BPFTargetMachine.cpp
+++ b/llvm/lib/Target/BPF/BPFTargetMachine.cpp
@@ -185,9 +185,8 @@ void BPFPassConfig::addMachineSSAOptimization() {
 
 void BPFPassConfig::addPreEmitPass() {
   addPass(createBPFMIPreEmitCheckingPass());
-  if (getOptLevel() != CodeGenOptLevel::None)
-    if (!DisableMIPeephole)
-      addPass(createBPFMIPreEmitPeepholePass());
+  if (!DisableMIPeephole)
+    addPass(createBPFMIPreEmitPeepholePass());
 }
 
 bool BPFPassConfig::addIRTranslator() {


        


More information about the llvm-commits mailing list