1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 20:51:52 +01:00
llvm-mirror/test/CodeGen/X86/late-address-taken.ll
Francis Visoiu Mistrih 9008ed7f02 [ShrinkWrap] Add optimization remarks to the shrink-wrapping pass
Start by emitting remarks for very basic unsupported cases such as
irreducible CFGs and EHFunclets. The end goal is to be able to cover all
the cases where we give up with an explanation.

llvm-svn: 333972
2018-06-05 00:27:24 +00:00

75 lines
2.6 KiB
LLVM

; RUN: llc -mtriple=x86_64-pc-windows-msvc < %s -enable-shrink-wrap=false | FileCheck %s
; Make sure shrink-wrapping does not break the lowering of exception handling.
; RUN: llc -mtriple=x86_64-pc-windows-msvc < %s -enable-shrink-wrap=true -pass-remarks-output=%t | FileCheck %s
; RUN: cat %t | FileCheck %s --check-prefix=REMARKS
; Repro cases from PR25168
; test @catchret - catchret target is not address-taken until PEI
; splits it into lea/mov followed by ret. Make sure the MBB is
; handled, both by tempting BranchFolding to merge it with %early_out
; and delete it, and by checking that we emit a proper reference
; to it in the LEA
declare void @ProcessCLRException()
declare void @f()
define void @catchret(i1 %b) personality void ()* @ProcessCLRException {
entry:
br i1 %b, label %body, label %early_out
early_out:
ret void
body:
invoke void @f()
to label %exit unwind label %catch.pad
catch.pad:
%cs1 = catchswitch within none [label %catch.body] unwind to caller
catch.body:
%catch = catchpad within %cs1 [i32 33554467]
catchret from %catch to label %exit
exit:
ret void
}
; CHECK-LABEL: catchret: # @catchret
; CHECK: [[Exit:^[^ :]+]]: # Block address taken
; CHECK-NEXT: # %exit
; CHECK: # %catch.body
; CHECK: .seh_endprolog
; CHECK: leaq [[Exit]](%rip), %rax
; CHECK: retq # CATCHRET
; REMARKS: Pass: shrink-wrap
; REMARKS-NEXT: Name: UnsupportedEHFunclets
; REMARKS-NEXT: Function: catchret
; REMARKS-NEXT: Args:
; REMARKS-NEXT: - String: EH Funclets are not supported yet.
; test @setjmp - similar to @catchret, but the MBB in question
; is the one generated when the setjmp's block is split
@buf = internal global [5 x i8*] zeroinitializer
declare i8* @llvm.frameaddress(i32) nounwind readnone
declare i8* @llvm.stacksave() nounwind
declare i32 @llvm.eh.sjlj.setjmp(i8*) nounwind
declare void @llvm.eh.sjlj.longjmp(i8*) nounwind
define void @setjmp(i1 %b) nounwind {
entry:
br i1 %b, label %early_out, label %sj
early_out:
ret void
sj:
%fp = call i8* @llvm.frameaddress(i32 0)
store i8* %fp, i8** getelementptr inbounds ([5 x i8*], [5 x i8*]* @buf, i64 0, i64 0), align 16
%sp = call i8* @llvm.stacksave()
store i8* %sp, i8** getelementptr inbounds ([5 x i8*], [5 x i8*]* @buf, i64 0, i64 2), align 16
call i32 @llvm.eh.sjlj.setjmp(i8* bitcast ([5 x i8*]* @buf to i8*))
ret void
}
; CHECK-LABEL: setjmp: # @setjmp
; CHECK: # %sj
; CHECK: leaq [[Label:\..+]](%rip), %[[Reg:.+]]{{$}}
; CHECK-NEXT: movq %[[Reg]], buf
; CHECK: {{^}}[[Label]]: # Block address taken
; CHECK-NEXT: # %sj