diff --git a/lib/Target/X86/X86FastISel.cpp b/lib/Target/X86/X86FastISel.cpp index 91ecdf10c99..92381085c0e 100644 --- a/lib/Target/X86/X86FastISel.cpp +++ b/lib/Target/X86/X86FastISel.cpp @@ -37,6 +37,7 @@ #include "llvm/IR/Instructions.h" #include "llvm/IR/IntrinsicInst.h" #include "llvm/IR/Operator.h" +#include "llvm/MC/MCAsmInfo.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Target/TargetOptions.h" using namespace llvm; @@ -2136,6 +2137,10 @@ bool X86FastISel::fastLowerIntrinsicCall(const IntrinsicInst *II) { switch (II->getIntrinsicID()) { default: return false; case Intrinsic::frameaddress: { + MachineFunction *MF = FuncInfo.MF; + if (MF->getTarget().getMCAsmInfo()->usesWindowsCFI()) + return false; + Type *RetTy = II->getCalledFunction()->getReturnType(); MVT VT; @@ -2153,11 +2158,11 @@ bool X86FastISel::fastLowerIntrinsicCall(const IntrinsicInst *II) { // This needs to be set before we call getPtrSizedFrameRegister, otherwise // we get the wrong frame register. - MachineFrameInfo *MFI = FuncInfo.MF->getFrameInfo(); + MachineFrameInfo *MFI = MF->getFrameInfo(); MFI->setFrameAddressIsTaken(true); const X86RegisterInfo *RegInfo = Subtarget->getRegisterInfo(); - unsigned FrameReg = RegInfo->getPtrSizedFrameRegister(*(FuncInfo.MF)); + unsigned FrameReg = RegInfo->getPtrSizedFrameRegister(*MF); assert(((FrameReg == X86::RBP && VT == MVT::i64) || (FrameReg == X86::EBP && VT == MVT::i32)) && "Invalid Frame Register!"); diff --git a/test/CodeGen/X86/frameaddr.ll b/test/CodeGen/X86/frameaddr.ll index d795c5749a0..27eac634078 100644 --- a/test/CodeGen/X86/frameaddr.ll +++ b/test/CodeGen/X86/frameaddr.ll @@ -1,5 +1,6 @@ ; RUN: llc < %s -march=x86 | FileCheck %s --check-prefix=CHECK-32 ; RUN: llc < %s -march=x86 -fast-isel -fast-isel-abort | FileCheck %s --check-prefix=CHECK-32 +; RUN: llc < %s -mtriple=x86_64-pc-win32 -fast-isel | FileCheck %s --check-prefix=CHECK-W64 ; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s --check-prefix=CHECK-64 ; RUN: llc < %s -mtriple=x86_64-unknown -fast-isel -fast-isel-abort | FileCheck %s --check-prefix=CHECK-64 ; RUN: llc < %s -mtriple=x86_64-gnux32 | FileCheck %s --check-prefix=CHECK-X32ABI @@ -15,6 +16,12 @@ entry: ; CHECK-32-NEXT: movl %ebp, %eax ; CHECK-32-NEXT: pop ; CHECK-32-NEXT: ret +; CHECK-W64-LABEL: test1 +; CHECK-W64: push +; CHECK-W64-NEXT: leaq (%rsp), %rbp +; CHECK-W64-NEXT: leaq (%rbp), %rax +; CHECK-W64-NEXT: pop +; CHECK-W64-NEXT: ret ; CHECK-64-LABEL: test1 ; CHECK-64: push ; CHECK-64-NEXT: movq %rsp, %rbp @@ -44,6 +51,12 @@ entry: ; CHECK-32-NEXT: movl (%eax), %eax ; CHECK-32-NEXT: pop ; CHECK-32-NEXT: ret +; CHECK-W64-LABEL: test2 +; CHECK-W64: push +; CHECK-W64-NEXT: leaq (%rsp), %rbp +; CHECK-W64-NEXT: leaq (%rbp), %rax +; CHECK-W64-NEXT: pop +; CHECK-W64-NEXT: ret ; CHECK-64-LABEL: test2 ; CHECK-64: push ; CHECK-64-NEXT: movq %rsp, %rbp