Index: lib/Target/X86/X86FrameLowering.cpp =================================================================== --- lib/Target/X86/X86FrameLowering.cpp +++ lib/Target/X86/X86FrameLowering.cpp @@ -2087,8 +2087,12 @@ TargetFrameLowering::determineCalleeSaves(MF, SavedRegs, RS); // Spill the BasePtr if it's used. - if (TRI->hasBasePointer(MF)) - SavedRegs.set(TRI->getBaseRegister()); + if (TRI->hasBasePointer(MF)){ + unsigned BasePtr = TRI->getBaseRegister(); + if (STI.isTarget64BitILP32()) + BasePtr = getX86SubSuperRegister(BasePtr, 64); + SavedRegs.set(BasePtr); + } } static bool Index: test/CodeGen/X86/x86-64-baseptr.ll =================================================================== --- test/CodeGen/X86/x86-64-baseptr.ll +++ test/CodeGen/X86/x86-64-baseptr.ll @@ -39,6 +39,7 @@ ; X32ABI: # %bb.0: # %entry ; X32ABI-NEXT: pushq %rbp ; X32ABI-NEXT: movl %esp, %ebp +; X32ABI-NEXT: pushq %rbx ; X32ABI-NEXT: andl $-32, %esp ; X32ABI-NEXT: subl $32, %esp ; X32ABI-NEXT: movl %esp, %ebx