[llvm] r326593 - [X86][x32] Save callee-save register used as base pointer for x32 ABI

Derek Schuff via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 2 09:46:39 PST 2018


Author: dschuff
Date: Fri Mar  2 09:46:39 2018
New Revision: 326593

URL: http://llvm.org/viewvc/llvm-project?rev=326593&view=rev
Log:
[X86][x32] Save callee-save register used as base pointer for x32 ABI

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

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

Modified: llvm/trunk/lib/Target/X86/X86FrameLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86FrameLowering.cpp?rev=326593&r1=326592&r2=326593&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86FrameLowering.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86FrameLowering.cpp Fri Mar  2 09:46:39 2018
@@ -2108,8 +2108,12 @@ void X86FrameLowering::determineCalleeSa
   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

Modified: llvm/trunk/test/CodeGen/X86/x86-64-baseptr.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/x86-64-baseptr.ll?rev=326593&r1=326592&r2=326593&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/x86-64-baseptr.ll (original)
+++ llvm/trunk/test/CodeGen/X86/x86-64-baseptr.ll Fri Mar  2 09:46:39 2018
@@ -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:




More information about the llvm-commits mailing list