You've already forked linux-packaging-mono
							
							
		
			
	
	
		
			66 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			LLVM
		
	
	
	
	
	
		
		
			
		
	
	
			66 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			LLVM
		
	
	
	
	
	
|   | ; RUN: llc < %s -mtriple=x86_64-pc-mingw32 | FileCheck %s -check-prefix=WIN64
 | ||
|  | 
 | ||
|  | declare void @bar() | ||
|  | declare void @baz() | ||
|  | declare i32 @personality(...) | ||
|  | 
 | ||
|  | ; Check for 'nop' between the last call and the epilogue.
 | ||
|  | define void @foo1() personality i32 (...)* @personality { | ||
|  | 
 | ||
|  |     invoke void @bar() | ||
|  |         to label %normal | ||
|  |         unwind label %catch | ||
|  | 
 | ||
|  | normal: | ||
|  |     ret void | ||
|  | 
 | ||
|  | catch: | ||
|  |     %1 = landingpad { i8*, i32 } cleanup | ||
|  |     resume { i8*, i32 } %1 | ||
|  | } | ||
|  | ; WIN64-LABEL: foo1:
 | ||
|  | ; WIN64: .seh_proc foo1
 | ||
|  | ; WIN64: callq bar
 | ||
|  | ; WIN64: nop
 | ||
|  | ; WIN64: addq ${{[0-9]+}}, %rsp
 | ||
|  | ; WIN64: retq
 | ||
|  | ; Check for 'ud2' after noreturn call
 | ||
|  | ; WIN64: callq _Unwind_Resume
 | ||
|  | ; WIN64-NEXT: ud2
 | ||
|  | ; WIN64: .seh_endproc
 | ||
|  | 
 | ||
|  | 
 | ||
|  | ; Check it still works when blocks are reordered.
 | ||
|  | @something = global i32 0 | ||
|  | define void @foo2(i1 zeroext %cond ) { | ||
|  |     br i1 %cond, label %a, label %b, !prof !0 | ||
|  | a: | ||
|  |     call void @bar() | ||
|  |     br label %done | ||
|  | b: | ||
|  |     call void @baz() | ||
|  |     store i32 0, i32* @something | ||
|  |     br label %done | ||
|  | done: | ||
|  |     ret void | ||
|  | } | ||
|  | !0 = !{!"branch_weights", i32 100, i32 0} | ||
|  | ; WIN64-LABEL: foo2:
 | ||
|  | ; WIN64: callq bar
 | ||
|  | ; WIN64: nop
 | ||
|  | ; WIN64: addq ${{[0-9]+}}, %rsp
 | ||
|  | ; WIN64: retq
 | ||
|  | 
 | ||
|  | 
 | ||
|  | ; Check nop is not emitted when call is not adjacent to epilogue.
 | ||
|  | define i32 @foo3() { | ||
|  |     call void @bar() | ||
|  |     ret i32 0 | ||
|  | } | ||
|  | ; WIN64-LABEL: foo3:
 | ||
|  | ; WIN64: callq bar
 | ||
|  | ; WIN64: xorl
 | ||
|  | ; WIN64-NOT: nop
 | ||
|  | ; WIN64: addq ${{[0-9]+}}, %rsp
 | ||
|  | ; WIN64: retq
 |