mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-02 00:16:25 +00:00
0558b04f57
This reverts commit r262370. It turns out there is code out there that does sequences of allocas greater than 4K: http://crbug.com/591404 The goal of this change was to improve the code size of inalloca call sequences, but we got tangled up in the mess of dynamic allocas. Instead, we should come back later with a separate MI pass that uses dominance to optimize the full sequence. This should also be able to remove the often unneeded stacksave/stackrestore pairs around the call. llvm-svn: 262505
69 lines
2.3 KiB
LLVM
69 lines
2.3 KiB
LLVM
; RUN: llc < %s | FileCheck %s
|
|
|
|
; Based on this C++:
|
|
; struct A {
|
|
; int x;
|
|
; A();
|
|
; A(const A &a);
|
|
; ~A();
|
|
; };
|
|
; extern "C" void takes_two(A a1, A a2);
|
|
; extern "C" void passes_two() { takes_two(A(), A()); }
|
|
|
|
target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32"
|
|
target triple = "i686--windows-msvc"
|
|
|
|
%struct.A = type { i32 }
|
|
|
|
define void @passes_two() #0 personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
|
|
entry:
|
|
%argmem = alloca inalloca <{ %struct.A, %struct.A }>, align 4
|
|
%0 = getelementptr inbounds <{ %struct.A, %struct.A }>, <{ %struct.A, %struct.A }>* %argmem, i32 0, i32 1
|
|
%call = call x86_thiscallcc %struct.A* @"\01??0A@@QAE@XZ"(%struct.A* %0)
|
|
%1 = getelementptr inbounds <{ %struct.A, %struct.A }>, <{ %struct.A, %struct.A }>* %argmem, i32 0, i32 0
|
|
%call1 = invoke x86_thiscallcc %struct.A* @"\01??0A@@QAE@XZ"(%struct.A* %1)
|
|
to label %invoke.cont unwind label %ehcleanup
|
|
|
|
invoke.cont: ; preds = %entry
|
|
call void @takes_two(<{ %struct.A, %struct.A }>* inalloca nonnull %argmem)
|
|
ret void
|
|
|
|
ehcleanup: ; preds = %entry
|
|
%2 = cleanuppad within none []
|
|
call x86_thiscallcc void @"\01??1A@@QAE@XZ"(%struct.A* %0) [ "funclet"(token %2) ]
|
|
cleanupret from %2 unwind to caller
|
|
}
|
|
|
|
; CHECK: _passes_two:
|
|
; CHECK: pushl %ebp
|
|
; CHECK: movl %esp, %ebp
|
|
; CHECK: subl ${{[0-9]+}}, %esp
|
|
; CHECK: movl $8, %eax
|
|
; CHECK: calll __chkstk
|
|
; CHECK: calll "??0A@@QAE@XZ"
|
|
; CHECK: calll "??0A@@QAE@XZ"
|
|
; CHECK: calll _takes_two
|
|
; ESP must be restored via EBP due to "dynamic" alloca.
|
|
; CHECK: leal -{{[0-9]+}}(%ebp), %esp
|
|
; CHECK: popl %ebp
|
|
; CHECK: retl
|
|
|
|
; CHECK: "?dtor$2@?0?passes_two@4HA":
|
|
; CHECK: pushl %ebp
|
|
; CHECK: subl $8, %esp
|
|
; CHECK: addl $12, %ebp
|
|
; CHECK: {{movl|leal}} -{{[0-9]+}}(%ebp), %ecx
|
|
; CHECK: calll "??1A@@QAE@XZ"
|
|
; CHECK: addl $8, %esp
|
|
; CHECK: retl
|
|
|
|
declare void @takes_two(<{ %struct.A, %struct.A }>* inalloca) #0
|
|
|
|
declare x86_thiscallcc %struct.A* @"\01??0A@@QAE@XZ"(%struct.A* returned) #0
|
|
|
|
declare i32 @__CxxFrameHandler3(...)
|
|
|
|
declare x86_thiscallcc void @"\01??1A@@QAE@XZ"(%struct.A*) #0
|
|
|
|
attributes #0 = { "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no-infs-fp-math"="false" "no-nans-fp-math"="false" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" }
|