[X86][x32] Save callee-save register used as base pointer for x32 ABI
authorDerek Schuff <dschuff@google.com>
Fri, 2 Mar 2018 17:46:39 +0000 (17:46 +0000)
committerDerek Schuff <dschuff@google.com>
Fri, 2 Mar 2018 17:46:39 +0000 (17:46 +0000)
For the x32 ABI, since the base pointer register (EBX) is a callee save register
it should be saved before use.

This fixes https://bugs.llvm.org/show_bug.cgi?id=36011

Differential Revision: https://reviews.llvm.org/D42358

Patch by Pratik Bhatu

llvm-svn: 326593

llvm/lib/Target/X86/X86FrameLowering.cpp
llvm/test/CodeGen/X86/x86-64-baseptr.ll

index 545248ac100d40b29e71c6546e010839b4b005dc..34febe679dbe307047d3b180641f48e3fcd17917 100644 (file)
@@ -2108,8 +2108,12 @@ void X86FrameLowering::determineCalleeSaves(MachineFunction &MF,
   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 2c31a7a5cbce0db1c466ee0600bac9279103e58d..30855e60e1d8e162db7b05580bda276e0420e1fe 100644 (file)
@@ -39,6 +39,7 @@ define void @base() #0 {
 ; 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 @@ define void @base() #0 {
 ; 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: