Index: llvm/trunk/lib/Target/X86/X86FrameLowering.cpp =================================================================== --- llvm/trunk/lib/Target/X86/X86FrameLowering.cpp +++ llvm/trunk/lib/Target/X86/X86FrameLowering.cpp @@ -2108,8 +2108,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: llvm/trunk/test/CodeGen/X86/x86-64-baseptr.ll =================================================================== --- llvm/trunk/test/CodeGen/X86/x86-64-baseptr.ll +++ llvm/trunk/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 @@ -52,7 +53,8 @@ ; X32ABI-NEXT: movl %edx, %esp ; X32ABI-NEXT: negl %eax ; X32ABI-NEXT: movl $0, (%ecx,%eax) -; X32ABI-NEXT: movl %ebp, %esp +; X32ABI-NEXT: leal -8(%ebp), %esp +; X32ABI-NEXT: popq %rbx ; X32ABI-NEXT: popq %rbp ; X32ABI-NEXT: retq entry: