[llvm] [Mips] Guard emission of CFI instructions by `MF.needsFrameMoves()` (PR #136108)
Sergei Barannikov via llvm-commits
llvm-commits at lists.llvm.org
Sun Apr 20 18:29:09 PDT 2025
https://github.com/s-barannikov updated https://github.com/llvm/llvm-project/pull/136108
>From 958fee1df13351e902a23045a69e3ede2f2929e6 Mon Sep 17 00:00:00 2001
From: Sergei Barannikov <barannikov88 at gmail.com>
Date: Thu, 17 Apr 2025 11:26:24 +0300
Subject: [PATCH] [Mips] Guard emission of CFI instructions by
`MF.needsFrameMoves()`
Don't emit CFI instructions when they will be skipped by AsmPrinter.
Also, use a helper class to simplify emission.
As a side effect, this seems to have unblocked delay slot filler
optimization on some tests, though it is not obvious to me whether
the transformations are legitimate.
Similar to #135845 and #136060.
---
llvm/lib/Target/Mips/Mips16FrameLowering.cpp | 33 ++------
llvm/lib/Target/Mips/MipsSEFrameLowering.cpp | 84 +++++++------------
llvm/test/CodeGen/Mips/analyzebranch.ll | 27 +++---
.../Mips/delay-slot-filler-bundled-insts.mir | 15 ++--
llvm/test/CodeGen/Mips/fpbr.ll | 12 +--
llvm/test/CodeGen/Mips/gprestore.ll | 12 +--
.../CodeGen/Mips/no-frame-pointer-elim.ll | 6 +-
7 files changed, 65 insertions(+), 124 deletions(-)
diff --git a/llvm/lib/Target/Mips/Mips16FrameLowering.cpp b/llvm/lib/Target/Mips/Mips16FrameLowering.cpp
index 576b93701f356..aa99891514aed 100644
--- a/llvm/lib/Target/Mips/Mips16FrameLowering.cpp
+++ b/llvm/lib/Target/Mips/Mips16FrameLowering.cpp
@@ -16,6 +16,7 @@
#include "MipsRegisterInfo.h"
#include "MipsSubtarget.h"
#include "llvm/ADT/BitVector.h"
+#include "llvm/CodeGen/CFIInstBuilder.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineFunction.h"
@@ -24,9 +25,6 @@
#include "llvm/CodeGen/MachineModuleInfo.h"
#include "llvm/CodeGen/TargetFrameLowering.h"
#include "llvm/IR/DebugLoc.h"
-#include "llvm/MC/MCContext.h"
-#include "llvm/MC/MCDwarf.h"
-#include "llvm/MC/MCRegisterInfo.h"
#include "llvm/Support/MathExtras.h"
#include <cstdint>
#include <vector>
@@ -52,32 +50,17 @@ void Mips16FrameLowering::emitPrologue(MachineFunction &MF,
// No need to allocate space on the stack.
if (StackSize == 0 && !MFI.adjustsStack()) return;
- const MCRegisterInfo *MRI = MF.getContext().getRegisterInfo();
-
// Adjust stack.
TII.makeFrame(Mips::SP, StackSize, MBB, MBBI);
- // emit ".cfi_def_cfa_offset StackSize"
- unsigned CFIIndex =
- MF.addFrameInst(MCCFIInstruction::cfiDefCfaOffset(nullptr, StackSize));
- BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
- .addCFIIndex(CFIIndex);
-
- const std::vector<CalleeSavedInfo> &CSI = MFI.getCalleeSavedInfo();
-
- if (!CSI.empty()) {
- const std::vector<CalleeSavedInfo> &CSI = MFI.getCalleeSavedInfo();
-
- for (const CalleeSavedInfo &I : CSI) {
- int64_t Offset = MFI.getObjectOffset(I.getFrameIdx());
- MCRegister Reg = I.getReg();
- unsigned DReg = MRI->getDwarfRegNum(Reg, true);
- unsigned CFIIndex = MF.addFrameInst(
- MCCFIInstruction::createOffset(nullptr, DReg, Offset));
- BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
- .addCFIIndex(CFIIndex);
- }
+ if (MF.needsFrameMoves()) {
+ CFIInstBuilder CFIBuilder(MBB, MBBI, MachineInstr::NoFlags);
+ CFIBuilder.buildDefCFAOffset(StackSize);
+
+ for (const CalleeSavedInfo &I : MFI.getCalleeSavedInfo())
+ CFIBuilder.buildOffset(I.getReg(), MFI.getObjectOffset(I.getFrameIdx()));
}
+
if (hasFP(MF))
BuildMI(MBB, MBBI, dl, TII.get(Mips::MoveR3216), Mips::S0)
.addReg(Mips::SP).setMIFlag(MachineInstr::FrameSetup);
diff --git a/llvm/lib/Target/Mips/MipsSEFrameLowering.cpp b/llvm/lib/Target/Mips/MipsSEFrameLowering.cpp
index e9ac94183066f..97210a54b9c3c 100644
--- a/llvm/lib/Target/Mips/MipsSEFrameLowering.cpp
+++ b/llvm/lib/Target/Mips/MipsSEFrameLowering.cpp
@@ -19,6 +19,7 @@
#include "llvm/ADT/BitVector.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/StringSwitch.h"
+#include "llvm/CodeGen/CFIInstBuilder.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineFrameInfo.h"
#include "llvm/CodeGen/MachineFunction.h"
@@ -33,8 +34,6 @@
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/IR/DebugLoc.h"
#include "llvm/IR/Function.h"
-#include "llvm/MC/MCDwarf.h"
-#include "llvm/MC/MCRegisterInfo.h"
#include "llvm/Support/CodeGen.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/MathExtras.h"
@@ -426,30 +425,27 @@ void MipsSEFrameLowering::emitPrologue(MachineFunction &MF,
// No need to allocate space on the stack.
if (StackSize == 0 && !MFI.adjustsStack()) return;
- const MCRegisterInfo *MRI = MF.getContext().getRegisterInfo();
+ CFIInstBuilder CFIBuilder(MBB, MBBI, MachineInstr::NoFlags);
+ bool NeedsDwarfCFI = MF.needsFrameMoves();
// Adjust stack.
TII.adjustStackPtr(SP, -StackSize, MBB, MBBI);
-
- // emit ".cfi_def_cfa_offset StackSize"
- unsigned CFIIndex =
- MF.addFrameInst(MCCFIInstruction::cfiDefCfaOffset(nullptr, StackSize));
- BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
- .addCFIIndex(CFIIndex);
+ if (NeedsDwarfCFI)
+ CFIBuilder.buildDefCFAOffset(StackSize);
if (MF.getFunction().hasFnAttribute("interrupt"))
emitInterruptPrologueStub(MF, MBB);
const std::vector<CalleeSavedInfo> &CSI = MFI.getCalleeSavedInfo();
- if (!CSI.empty()) {
- // Find the instruction past the last instruction that saves a callee-saved
- // register to the stack.
- for (unsigned i = 0; i < CSI.size(); ++i)
- ++MBBI;
+ // Find the instruction past the last instruction that saves a callee-saved
+ // register to the stack.
+ std::advance(MBBI, CSI.size());
+ CFIBuilder.setInsertPoint(MBBI);
- // Iterate over list of callee-saved registers and emit .cfi_offset
- // directives.
+ // Iterate over list of callee-saved registers and emit .cfi_offset
+ // directives.
+ if (NeedsDwarfCFI) {
for (const CalleeSavedInfo &I : CSI) {
int64_t Offset = MFI.getObjectOffset(I.getFrameIdx());
MCRegister Reg = I.getReg();
@@ -457,45 +453,26 @@ void MipsSEFrameLowering::emitPrologue(MachineFunction &MF,
// If Reg is a double precision register, emit two cfa_offsets,
// one for each of the paired single precision registers.
if (Mips::AFGR64RegClass.contains(Reg)) {
- unsigned Reg0 =
- MRI->getDwarfRegNum(RegInfo.getSubReg(Reg, Mips::sub_lo), true);
- unsigned Reg1 =
- MRI->getDwarfRegNum(RegInfo.getSubReg(Reg, Mips::sub_hi), true);
+ MCRegister Reg0 = RegInfo.getSubReg(Reg, Mips::sub_lo);
+ MCRegister Reg1 = RegInfo.getSubReg(Reg, Mips::sub_hi);
if (!STI.isLittle())
std::swap(Reg0, Reg1);
- unsigned CFIIndex = MF.addFrameInst(
- MCCFIInstruction::createOffset(nullptr, Reg0, Offset));
- BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
- .addCFIIndex(CFIIndex);
-
- CFIIndex = MF.addFrameInst(
- MCCFIInstruction::createOffset(nullptr, Reg1, Offset + 4));
- BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
- .addCFIIndex(CFIIndex);
+ CFIBuilder.buildOffset(Reg0, Offset);
+ CFIBuilder.buildOffset(Reg1, Offset + 4);
} else if (Mips::FGR64RegClass.contains(Reg)) {
- unsigned Reg0 = MRI->getDwarfRegNum(Reg, true);
- unsigned Reg1 = MRI->getDwarfRegNum(Reg, true) + 1;
+ MCRegister Reg0 = Reg;
+ MCRegister Reg1 = Reg + 1;
if (!STI.isLittle())
std::swap(Reg0, Reg1);
- unsigned CFIIndex = MF.addFrameInst(
- MCCFIInstruction::createOffset(nullptr, Reg0, Offset));
- BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
- .addCFIIndex(CFIIndex);
-
- CFIIndex = MF.addFrameInst(
- MCCFIInstruction::createOffset(nullptr, Reg1, Offset + 4));
- BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
- .addCFIIndex(CFIIndex);
+ CFIBuilder.buildOffset(Reg0, Offset);
+ CFIBuilder.buildOffset(Reg1, Offset + 4);
} else {
// Reg is either in GPR32 or FGR32.
- unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::createOffset(
- nullptr, MRI->getDwarfRegNum(Reg, true), Offset));
- BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
- .addCFIIndex(CFIIndex);
+ CFIBuilder.buildOffset(Reg, Offset);
}
}
}
@@ -511,13 +488,11 @@ void MipsSEFrameLowering::emitPrologue(MachineFunction &MF,
}
// Emit .cfi_offset directives for eh data registers.
- for (int I = 0; I < 4; ++I) {
- int64_t Offset = MFI.getObjectOffset(MipsFI->getEhDataRegFI(I));
- unsigned Reg = MRI->getDwarfRegNum(ABI.GetEhDataReg(I), true);
- unsigned CFIIndex = MF.addFrameInst(
- MCCFIInstruction::createOffset(nullptr, Reg, Offset));
- BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
- .addCFIIndex(CFIIndex);
+ if (NeedsDwarfCFI) {
+ for (int I = 0; I < 4; ++I) {
+ int64_t Offset = MFI.getObjectOffset(MipsFI->getEhDataRegFI(I));
+ CFIBuilder.buildOffset(ABI.GetEhDataReg(I), Offset);
+ }
}
}
@@ -527,11 +502,8 @@ void MipsSEFrameLowering::emitPrologue(MachineFunction &MF,
BuildMI(MBB, MBBI, dl, TII.get(MOVE), FP).addReg(SP).addReg(ZERO)
.setMIFlag(MachineInstr::FrameSetup);
- // emit ".cfi_def_cfa_register $fp"
- unsigned CFIIndex = MF.addFrameInst(MCCFIInstruction::createDefCfaRegister(
- nullptr, MRI->getDwarfRegNum(FP, true)));
- BuildMI(MBB, MBBI, dl, TII.get(TargetOpcode::CFI_INSTRUCTION))
- .addCFIIndex(CFIIndex);
+ if (NeedsDwarfCFI)
+ CFIBuilder.buildDefCFARegister(FP);
if (RegInfo.hasStackRealignment(MF)) {
// addiu $Reg, $zero, -MaxAlignment
diff --git a/llvm/test/CodeGen/Mips/analyzebranch.ll b/llvm/test/CodeGen/Mips/analyzebranch.ll
index f6bc32a2b7859..7a6dc8c3f9073 100644
--- a/llvm/test/CodeGen/Mips/analyzebranch.ll
+++ b/llvm/test/CodeGen/Mips/analyzebranch.ll
@@ -132,7 +132,7 @@ define double @foo(double %a, double %b) nounwind readnone {
; MIPS64R6-NEXT: mfc1 $1, $f1
; MIPS64R6-NEXT: andi $1, $1, 1
; MIPS64R6-NEXT: bnez $1, .LBB0_2
-; MIPS64R6-NEXT: mov.d $f0, $f12
+; MIPS64R6-NEXT: mov.d $f0, $f12
; MIPS64R6-NEXT: # %bb.1: # %if.else
; MIPS64R6-NEXT: dmtc1 $zero, $f0
; MIPS64R6-NEXT: cmp.ule.d $f1, $f13, $f0
@@ -167,11 +167,10 @@ define void @f1(float %f) nounwind {
; MIPS32-LABEL: f1:
; MIPS32: # %bb.0: # %entry
; MIPS32-NEXT: addiu $sp, $sp, -24
-; MIPS32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
; MIPS32-NEXT: mtc1 $zero, $f0
; MIPS32-NEXT: c.eq.s $f12, $f0
; MIPS32-NEXT: bc1f $BB1_2
-; MIPS32-NEXT: nop
+; MIPS32-NEXT: sw $ra, 20($sp)
; MIPS32-NEXT: # %bb.1: # %if.end
; MIPS32-NEXT: jal f2
; MIPS32-NEXT: nop
@@ -185,11 +184,10 @@ define void @f1(float %f) nounwind {
; MIPS32R2-LABEL: f1:
; MIPS32R2: # %bb.0: # %entry
; MIPS32R2-NEXT: addiu $sp, $sp, -24
-; MIPS32R2-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
; MIPS32R2-NEXT: mtc1 $zero, $f0
; MIPS32R2-NEXT: c.eq.s $f12, $f0
; MIPS32R2-NEXT: bc1f $BB1_2
-; MIPS32R2-NEXT: nop
+; MIPS32R2-NEXT: sw $ra, 20($sp)
; MIPS32R2-NEXT: # %bb.1: # %if.end
; MIPS32R2-NEXT: jal f2
; MIPS32R2-NEXT: nop
@@ -203,13 +201,12 @@ define void @f1(float %f) nounwind {
; MIPS32r6-LABEL: f1:
; MIPS32r6: # %bb.0: # %entry
; MIPS32r6-NEXT: addiu $sp, $sp, -24
-; MIPS32r6-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
; MIPS32r6-NEXT: mtc1 $zero, $f0
; MIPS32r6-NEXT: cmp.eq.s $f0, $f12, $f0
; MIPS32r6-NEXT: mfc1 $1, $f0
; MIPS32r6-NEXT: andi $1, $1, 1
-; MIPS32r6-NEXT: beqzc $1, $BB1_2
-; MIPS32r6-NEXT: nop
+; MIPS32r6-NEXT: beqz $1, $BB1_2
+; MIPS32r6-NEXT: sw $ra, 20($sp)
; MIPS32r6-NEXT: # %bb.1: # %if.end
; MIPS32r6-NEXT: jal f2
; MIPS32r6-NEXT: nop
@@ -223,11 +220,10 @@ define void @f1(float %f) nounwind {
; MIPS4-LABEL: f1:
; MIPS4: # %bb.0: # %entry
; MIPS4-NEXT: daddiu $sp, $sp, -16
-; MIPS4-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill
; MIPS4-NEXT: mtc1 $zero, $f0
; MIPS4-NEXT: c.eq.s $f12, $f0
; MIPS4-NEXT: bc1f .LBB1_2
-; MIPS4-NEXT: nop
+; MIPS4-NEXT: sd $ra, 8($sp)
; MIPS4-NEXT: # %bb.1: # %if.end
; MIPS4-NEXT: jal f2
; MIPS4-NEXT: nop
@@ -241,11 +237,10 @@ define void @f1(float %f) nounwind {
; MIPS64-LABEL: f1:
; MIPS64: # %bb.0: # %entry
; MIPS64-NEXT: daddiu $sp, $sp, -16
-; MIPS64-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill
; MIPS64-NEXT: mtc1 $zero, $f0
; MIPS64-NEXT: c.eq.s $f12, $f0
; MIPS64-NEXT: bc1f .LBB1_2
-; MIPS64-NEXT: nop
+; MIPS64-NEXT: sd $ra, 8($sp)
; MIPS64-NEXT: # %bb.1: # %if.end
; MIPS64-NEXT: jal f2
; MIPS64-NEXT: nop
@@ -259,11 +254,10 @@ define void @f1(float %f) nounwind {
; MIPS64R2-LABEL: f1:
; MIPS64R2: # %bb.0: # %entry
; MIPS64R2-NEXT: daddiu $sp, $sp, -16
-; MIPS64R2-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill
; MIPS64R2-NEXT: mtc1 $zero, $f0
; MIPS64R2-NEXT: c.eq.s $f12, $f0
; MIPS64R2-NEXT: bc1f .LBB1_2
-; MIPS64R2-NEXT: nop
+; MIPS64R2-NEXT: sd $ra, 8($sp)
; MIPS64R2-NEXT: # %bb.1: # %if.end
; MIPS64R2-NEXT: jal f2
; MIPS64R2-NEXT: nop
@@ -277,13 +271,12 @@ define void @f1(float %f) nounwind {
; MIPS64R6-LABEL: f1:
; MIPS64R6: # %bb.0: # %entry
; MIPS64R6-NEXT: daddiu $sp, $sp, -16
-; MIPS64R6-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill
; MIPS64R6-NEXT: mtc1 $zero, $f0
; MIPS64R6-NEXT: cmp.eq.s $f0, $f12, $f0
; MIPS64R6-NEXT: mfc1 $1, $f0
; MIPS64R6-NEXT: andi $1, $1, 1
-; MIPS64R6-NEXT: beqzc $1, .LBB1_2
-; MIPS64R6-NEXT: nop
+; MIPS64R6-NEXT: beqz $1, .LBB1_2
+; MIPS64R6-NEXT: sd $ra, 8($sp)
; MIPS64R6-NEXT: # %bb.1: # %if.end
; MIPS64R6-NEXT: jal f2
; MIPS64R6-NEXT: nop
diff --git a/llvm/test/CodeGen/Mips/delay-slot-filler-bundled-insts.mir b/llvm/test/CodeGen/Mips/delay-slot-filler-bundled-insts.mir
index 9cde85bd211a9..5b0a14450c3fa 100644
--- a/llvm/test/CodeGen/Mips/delay-slot-filler-bundled-insts.mir
+++ b/llvm/test/CodeGen/Mips/delay-slot-filler-bundled-insts.mir
@@ -7,12 +7,11 @@
# ASM: # %bb.0:
# ASM-NEXT: daddiu $sp, $sp, -16
-# ASM-NEXT: sd $ra, 8($sp)
## BUNDLE should be emitted in order:
# ASM-NEXT: daddiu $sp, $sp, -16
# ASM-NEXT: daddiu $sp, $sp, 16
# ASM-NEXT: beqz $4, .LBB0_2
-# ASM-NEXT: nop
+# ASM-NEXT: sd $ra, 8($sp)
--- |
target datalayout = "E-m:e-i8:8:32-i16:16:32-i64:64-n32:64-S128"
target triple = "mips64-unknown-freebsd"
@@ -87,15 +86,12 @@ body: |
; CHECK: bb.0.entry:
; CHECK: successors: %bb.2(0x30000000), %bb.1(0x50000000)
; CHECK: $sp_64 = DADDiu $sp_64, -16
- ; CHECK: CFI_INSTRUCTION def_cfa_offset 16
- ; CHECK: SD killed $ra_64, $sp_64, 8 :: (store (s64) into %stack.0)
- ; CHECK: CFI_INSTRUCTION offset $ra_64, -8
; CHECK: BUNDLE {
; CHECK: $sp_64 = DADDiu $sp_64, -16
; CHECK: $sp_64 = DADDiu $sp_64, 16
; CHECK: }
; CHECK: BEQ64 renamable $a0_64, $zero_64, %bb.2, implicit-def $at {
- ; CHECK: $zero = SLL $zero, 0
+ ; CHECK: SD killed $ra_64, $sp_64, 8 :: (store (s64) into %stack.0)
; CHECK: }
; CHECK: bb.1.if.then:
; CHECK: successors: %bb.3(0x80000000)
@@ -120,15 +116,14 @@ body: |
liveins: $a0_64, $ra_64
$sp_64 = DADDiu $sp_64, -16
- CFI_INSTRUCTION def_cfa_offset 16
- SD killed $ra_64, $sp_64, 8 :: (store (s64) into %stack.0)
- CFI_INSTRUCTION offset $ra_64, -8
; This BUNDLE instruction must not be split by the delay slot filler:
BUNDLE {
$sp_64 = DADDiu $sp_64, -16
$sp_64 = DADDiu $sp_64, 16
}
- BEQ64 renamable $a0_64, $zero_64, %bb.2, implicit-def $at
+ BEQ64 renamable $a0_64, $zero_64, %bb.2, implicit-def $at {
+ SD killed $ra_64, $sp_64, 8 :: (store (s64) into %stack.0)
+ }
bb.1.if.then:
successors: %bb.3(0x80000000)
diff --git a/llvm/test/CodeGen/Mips/fpbr.ll b/llvm/test/CodeGen/Mips/fpbr.ll
index 7193a426ab0d2..83de94ebd8200 100644
--- a/llvm/test/CodeGen/Mips/fpbr.ll
+++ b/llvm/test/CodeGen/Mips/fpbr.ll
@@ -20,7 +20,7 @@ entry:
; FIXME: We ought to be able to transform not+bnez -> beqz
; GPR: not $[[GPRCC]], $[[GPRCC]]
; 32-GPR: bnez $[[GPRCC]], $BB0_2
-; 64-GPR: bnezc $[[GPRCC]], .LBB0_2
+; 64-GPR: bnez $[[GPRCC]], .LBB0_2
%cmp = fcmp oeq float %f2, %f3
br i1 %cmp, label %if.then, label %if.else
@@ -55,7 +55,7 @@ entry:
; GPR: mfc1 $[[GPRCC:[0-9]+]], $[[FGRCC:f[0-9]+]]
; GPR-NOT: not $[[GPRCC]], $[[GPRCC]]
; 32-GPR: bnez $[[GPRCC]], $BB1_2
-; 64-GPR: bnezc $[[GPRCC]], .LBB1_2
+; 64-GPR: bnez $[[GPRCC]], .LBB1_2
%cmp = fcmp olt float %f2, %f3
br i1 %cmp, label %if.then, label %if.else
@@ -86,7 +86,7 @@ entry:
; GPR: mfc1 $[[GPRCC:[0-9]+]], $[[FGRCC:f[0-9]+]]
; GPR-NOT: not $[[GPRCC]], $[[GPRCC]]
; 32-GPR: beqz $[[GPRCC]], $BB2_2
-; 64-GPR: beqzc $[[GPRCC]], .LBB2_2
+; 64-GPR: beqz $[[GPRCC]], .LBB2_2
%cmp = fcmp ugt float %f2, %f3
br i1 %cmp, label %if.else, label %if.then
@@ -118,7 +118,7 @@ entry:
; FIXME: We ought to be able to transform not+bnez -> beqz
; GPR: not $[[GPRCC]], $[[GPRCC]]
; 32-GPR: bnez $[[GPRCC]], $BB3_2
-; 64-GPR: bnezc $[[GPRCC]], .LBB3_2
+; 64-GPR: bnez $[[GPRCC]], .LBB3_2
%cmp = fcmp oeq double %f2, %f3
br i1 %cmp, label %if.then, label %if.else
@@ -149,7 +149,7 @@ entry:
; GPR: mfc1 $[[GPRCC:[0-9]+]], $[[FGRCC:f[0-9]+]]
; GPR-NOT: not $[[GPRCC]], $[[GPRCC]]
; 32-GPR: bnez $[[GPRCC]], $BB4_2
-; 64-GPR: bnezc $[[GPRCC]], .LBB4_2
+; 64-GPR: bnez $[[GPRCC]], .LBB4_2
%cmp = fcmp olt double %f2, %f3
br i1 %cmp, label %if.then, label %if.else
@@ -180,7 +180,7 @@ entry:
; GPR: mfc1 $[[GPRCC:[0-9]+]], $[[FGRCC:f[0-9]+]]
; GPR-NOT: not $[[GPRCC]], $[[GPRCC]]
; 32-GPR: beqz $[[GPRCC]], $BB5_2
-; 64-GPR: beqzc $[[GPRCC]], .LBB5_2
+; 64-GPR: beqz $[[GPRCC]], .LBB5_2
%cmp = fcmp ugt double %f2, %f3
br i1 %cmp, label %if.else, label %if.then
diff --git a/llvm/test/CodeGen/Mips/gprestore.ll b/llvm/test/CodeGen/Mips/gprestore.ll
index 889685022264b..bc78151435e08 100644
--- a/llvm/test/CodeGen/Mips/gprestore.ll
+++ b/llvm/test/CodeGen/Mips/gprestore.ll
@@ -116,10 +116,10 @@ define void @f0() nounwind {
; O3O32-NEXT: lui $2, %hi(_gp_disp)
; O3O32-NEXT: addiu $2, $2, %lo(_gp_disp)
; O3O32-NEXT: addiu $sp, $sp, -32
-; O3O32-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill
-; O3O32-NEXT: sw $17, 24($sp) # 4-byte Folded Spill
; O3O32-NEXT: sw $16, 20($sp) # 4-byte Folded Spill
; O3O32-NEXT: addu $16, $2, $25
+; O3O32-NEXT: sw $ra, 28($sp) # 4-byte Folded Spill
+; O3O32-NEXT: sw $17, 24($sp) # 4-byte Folded Spill
; O3O32-NEXT: lw $25, %call16(f1)($16)
; O3O32-NEXT: jalr $25
; O3O32-NEXT: move $gp, $16
@@ -148,10 +148,10 @@ define void @f0() nounwind {
; O3N64-LABEL: f0:
; O3N64: # %bb.0: # %entry
; O3N64-NEXT: daddiu $sp, $sp, -32
-; O3N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
+; O3N64-NEXT: lui $1, %hi(%neg(%gp_rel(f0)))
; O3N64-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
+; O3N64-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
; O3N64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
-; O3N64-NEXT: lui $1, %hi(%neg(%gp_rel(f0)))
; O3N64-NEXT: daddu $1, $1, $25
; O3N64-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(f0)))
; O3N64-NEXT: ld $25, %call16(f1)($gp)
@@ -180,10 +180,10 @@ define void @f0() nounwind {
; O3N32-LABEL: f0:
; O3N32: # %bb.0: # %entry
; O3N32-NEXT: addiu $sp, $sp, -32
-; O3N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
+; O3N32-NEXT: lui $1, %hi(%neg(%gp_rel(f0)))
; O3N32-NEXT: sd $gp, 16($sp) # 8-byte Folded Spill
+; O3N32-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
; O3N32-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
-; O3N32-NEXT: lui $1, %hi(%neg(%gp_rel(f0)))
; O3N32-NEXT: addu $1, $1, $25
; O3N32-NEXT: addiu $gp, $1, %lo(%neg(%gp_rel(f0)))
; O3N32-NEXT: lw $25, %call16(f1)($gp)
diff --git a/llvm/test/CodeGen/Mips/no-frame-pointer-elim.ll b/llvm/test/CodeGen/Mips/no-frame-pointer-elim.ll
index d840fec8bf9ee..d57161483a8b0 100644
--- a/llvm/test/CodeGen/Mips/no-frame-pointer-elim.ll
+++ b/llvm/test/CodeGen/Mips/no-frame-pointer-elim.ll
@@ -12,9 +12,8 @@ define dso_local void @caller() nounwind "frame-pointer"="non-leaf" {
; STATIC-NEXT: daddiu $sp, $sp, -16
; STATIC-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill
; STATIC-NEXT: sd $fp, 0($sp) # 8-byte Folded Spill
-; STATIC-NEXT: move $fp, $sp
; STATIC-NEXT: jal callee
-; STATIC-NEXT: nop
+; STATIC-NEXT: move $fp, $sp
;
; PIC-LABEL: caller:
; PIC: # %bb.0: # %entry
@@ -22,7 +21,6 @@ define dso_local void @caller() nounwind "frame-pointer"="non-leaf" {
; PIC-NEXT: sd $ra, 24($sp) # 8-byte Folded Spill
; PIC-NEXT: sd $fp, 16($sp) # 8-byte Folded Spill
; PIC-NEXT: sd $gp, 8($sp) # 8-byte Folded Spill
-; PIC-NEXT: move $fp, $sp
; PIC-NEXT: lui $1, %hi(%neg(%gp_rel(caller)))
; PIC-NEXT: daddu $1, $1, $25
; PIC-NEXT: daddiu $gp, $1, %lo(%neg(%gp_rel(caller)))
@@ -30,7 +28,7 @@ define dso_local void @caller() nounwind "frame-pointer"="non-leaf" {
; PIC-NEXT: .reloc .Ltmp0, R_MIPS_JALR, callee
; PIC-NEXT: .Ltmp0:
; PIC-NEXT: jalr $25
-; PIC-NEXT: nop
+; PIC-NEXT: move $fp, $sp
entry:
tail call void @callee()
unreachable
More information about the llvm-commits
mailing list