Summary: In this implementation, LiveIntervalAnalysis invents a few register masks on basic block boundaries that preserve no registers. The nice thing about this is that it prevents the prologue inserter from thinking it needs to spill all XMM CSRs, because it doesn't see any explicit physreg defs in the MI. Reviewers: MatzeB, qcolombet, JosephTremoulet, majnemer Subscribers: MatzeB, llvm-commits Differential Revision: http://reviews.llvm.org/D14407 llvm-svn: 252318
28 lines
628 B
LLVM
28 lines
628 B
LLVM
; RUN: llc -mtriple=x86_64-pc-windows-msvc -code-model=large -o - < %s | FileCheck %s
|
|
|
|
declare i32 @__CxxFrameHandler3(...)
|
|
|
|
declare void @bar()
|
|
|
|
define void @foo() personality i32 (...)* @__CxxFrameHandler3 {
|
|
entry:
|
|
invoke void @bar()
|
|
to label %exit unwind label %cleanup
|
|
cleanup:
|
|
%c = cleanuppad []
|
|
call void @bar()
|
|
cleanupret %c unwind to caller
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; CHECK: foo: # @foo
|
|
; CHECK: movabsq $bar, %[[reg:[^ ]*]]
|
|
; CHECK: callq *%[[reg]]
|
|
; CHECK: retq
|
|
|
|
; CHECK: "?dtor$2@?0?foo@4HA":
|
|
; CHECK: movabsq $bar, %[[reg:[^ ]*]]
|
|
; CHECK: callq *%[[reg]]
|
|
; CHECK: retq # CLEANUPRET
|