mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-26 21:20:37 +00:00
X86: Disable generation of rep;movsl when %esi is used as a base pointer.
This happens when there is both stack realignment and a dynamic alloca in the function. If we overwrite %esi (rep;movsl uses fixed registers) we'll lose the base pointer and the next register spill will write into oblivion. Fixes PR15249 and unbreaks firefox on i386/freebsd. Mozilla uses dynamic allocas and freebsd a 4 byte stack alignment. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@175057 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0f80f7bfd7
commit
f09e02f01a
@ -202,6 +202,14 @@ X86SelectionDAGInfo::EmitTargetCodeForMemcpy(SelectionDAG &DAG, DebugLoc dl,
|
||||
SrcPtrInfo.getAddrSpace() >= 256)
|
||||
return SDValue();
|
||||
|
||||
// ESI might be used as a base pointer, in that case we can't simply overwrite
|
||||
// the register. Fall back to generic code.
|
||||
const X86RegisterInfo *TRI =
|
||||
static_cast<const X86RegisterInfo *>(DAG.getTarget().getRegisterInfo());
|
||||
if (TRI->hasBasePointer(DAG.getMachineFunction()) &&
|
||||
TRI->getBaseRegister() == X86::ESI)
|
||||
return SDValue();
|
||||
|
||||
MVT AVT;
|
||||
if (Align & 1)
|
||||
AVT = MVT::i8;
|
||||
|
18
test/CodeGen/X86/stack-align-memcpy.ll
Normal file
18
test/CodeGen/X86/stack-align-memcpy.ll
Normal file
@ -0,0 +1,18 @@
|
||||
; RUN: llc < %s -force-align-stack -mtriple i386-apple-darwin -mcpu=i486 | FileCheck %s
|
||||
|
||||
%struct.foo = type { [88 x i8] }
|
||||
|
||||
; PR15249
|
||||
; We can't use rep;movsl here because it clobbers the base pointer in %esi.
|
||||
define void @test1(%struct.foo* nocapture %x, i32 %y) nounwind {
|
||||
%dynalloc = alloca i8, i32 %y, align 1
|
||||
call void @bar(i8* %dynalloc, %struct.foo* align 4 byval %x)
|
||||
ret void
|
||||
|
||||
; CHECK: test1:
|
||||
; CHECK: andl $-16, %esp
|
||||
; CHECK: movl %esp, %esi
|
||||
; CHECK-NOT: rep;movsl
|
||||
}
|
||||
|
||||
declare void @bar(i8* nocapture, %struct.foo* align 4 byval) nounwind
|
Loading…
Reference in New Issue
Block a user