From 9960d684bffb67992b6a4fb8606de21ceab21d74 Mon Sep 17 00:00:00 2001 From: Michael Kuperstein Date: Tue, 15 Dec 2015 18:50:32 +0000 Subject: [PATCH] [X86] MOVPC32r should only emit CFI adjustments when needed We only want to emit CFI adjustments when actually using DWARF. This fixes PR25828. Differential Revision: http://reviews.llvm.org/D15522 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@255664 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86MCInstLower.cpp | 9 +++++---- test/CodeGen/X86/pr25828.ll | 30 ++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 test/CodeGen/X86/pr25828.ll diff --git a/lib/Target/X86/X86MCInstLower.cpp b/lib/Target/X86/X86MCInstLower.cpp index af386807cd7..d0c03d6ab7c 100644 --- a/lib/Target/X86/X86MCInstLower.cpp +++ b/lib/Target/X86/X86MCInstLower.cpp @@ -1145,11 +1145,12 @@ void X86AsmPrinter::EmitInstruction(const MachineInstr *MI) { bool hasFP = FrameLowering->hasFP(*MF); // TODO: This is needed only if we require precise CFA. - bool NeedsDwarfCFI = - (MMI->hasDebugInfo() || MF->getFunction()->needsUnwindTableEntry()); + bool HasActiveDwarfFrame = OutStreamer->getNumFrameInfos() && + !OutStreamer->getDwarfFrameInfos().back().End; + int stackGrowth = -RI->getSlotSize(); - if (NeedsDwarfCFI && !hasFP) { + if (HasActiveDwarfFrame && !hasFP) { OutStreamer->EmitCFIAdjustCfaOffset(-stackGrowth); } @@ -1160,7 +1161,7 @@ void X86AsmPrinter::EmitInstruction(const MachineInstr *MI) { EmitAndCountInstruction(MCInstBuilder(X86::POP32r) .addReg(MI->getOperand(0).getReg())); - if (NeedsDwarfCFI && !hasFP) { + if (HasActiveDwarfFrame && !hasFP) { OutStreamer->EmitCFIAdjustCfaOffset(stackGrowth); } return; diff --git a/test/CodeGen/X86/pr25828.ll b/test/CodeGen/X86/pr25828.ll new file mode 100644 index 00000000000..8fbabc7d0c6 --- /dev/null +++ b/test/CodeGen/X86/pr25828.ll @@ -0,0 +1,30 @@ +; RUN: llc < %s -mtriple=i686-pc-windows-msvc -relocation-model=pic | FileCheck %s +; MOVPC32r should not generate CFI under windows + +; CHECK-LABEL: _foo: +; CHECK-NOT: .cfi_adjust_cfa_offset +define void @foo(i8) { +entry-block: + switch i8 %0, label %bb2 [ + i8 1, label %bb1 + i8 2, label %bb2 + i8 3, label %bb3 + i8 4, label %bb4 + i8 5, label %bb5 + ] + +bb1: + ret void + +bb2: + ret void + +bb3: + ret void + +bb4: + ret void + +bb5: + ret void +} -- 2.34.1