You've already forked linux-packaging-mono
							
							
		
			
				
	
	
		
			216 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
			
		
		
	
	
			216 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			YAML
		
	
	
	
	
	
| # RUN: llc -mtriple=i686-- -run-pass machine-cp -verify-machineinstrs -o - %s | FileCheck %s
 | |
| 
 | |
| --- |
 | |
|   declare void @foo()
 | |
|   define void @copyprop_remove_kill0() { ret void }
 | |
|   define void @copyprop_remove_kill1() { ret void }
 | |
|   define void @copyprop_remove_kill2() { ret void }
 | |
|   define void @copyprop0() { ret void }
 | |
|   define void @copyprop1() { ret void }
 | |
|   define void @copyprop2() { ret void }
 | |
|   define void @nocopyprop0() { ret void }
 | |
|   define void @nocopyprop1() { ret void }
 | |
|   define void @nocopyprop2() { ret void }
 | |
|   define void @nocopyprop3() { ret void }
 | |
|   define void @nocopyprop4() { ret void }
 | |
|   define void @nocopyprop5() { ret void }
 | |
| ...
 | |
| ---
 | |
| # The second copy is redundant and will be removed, check that we also remove
 | |
| # the kill flag of intermediate instructions.
 | |
| # CHECK-LABEL: name: copyprop_remove_kill0
 | |
| # CHECK: bb.0:
 | |
| # CHECK-NEXT: %rax = COPY %rdi
 | |
| # CHECK-NEXT: NOOP implicit %rdi
 | |
| # CHECK-NOT: COPY
 | |
| # CHECK-NEXT: NOOP implicit %rax, implicit %rdi
 | |
| name: copyprop_remove_kill0
 | |
| body: |
 | |
|   bb.0:
 | |
|     %rax = COPY %rdi
 | |
|     NOOP implicit killed %rdi
 | |
|     %rdi = COPY %rax
 | |
|     NOOP implicit %rax, implicit %rdi
 | |
| ...
 | |
| ---
 | |
| # The second copy is redundant and will be removed, check that we also remove
 | |
| # the kill flag of intermediate instructions.
 | |
| # CHECK-LABEL: name: copyprop_remove_kill1
 | |
| # CHECK: bb.0:
 | |
| # CHECK-NEXT: %rax = COPY %rdi
 | |
| # CHECK-NEXT: NOOP implicit %edi
 | |
| # CHECK-NOT: COPY
 | |
| # CHECK-NEXT: NOOP implicit %rax, implicit %rdi
 | |
| name: copyprop_remove_kill1
 | |
| body: |
 | |
|   bb.0:
 | |
|     %rax = COPY %rdi
 | |
|     NOOP implicit killed %edi
 | |
|     %rdi = COPY %rax
 | |
|     NOOP implicit %rax, implicit %rdi
 | |
| ...
 | |
| ---
 | |
| # The second copy is redundant and will be removed, check that we also remove
 | |
| # the kill flag of intermediate instructions.
 | |
| # CHECK-LABEL: name: copyprop_remove_kill2
 | |
| # CHECK: bb.0:
 | |
| # CHECK-NEXT: %ax = COPY %di
 | |
| # CHECK-NEXT: NOOP implicit %rdi
 | |
| # CHECK-NOT: COPY
 | |
| # CHECK-NEXT: NOOP implicit %rax, implicit %rdi
 | |
| name: copyprop_remove_kill2
 | |
| body: |
 | |
|   bb.0:
 | |
|     %ax = COPY %di
 | |
|     NOOP implicit killed %rdi
 | |
|     %di = COPY %ax
 | |
|     NOOP implicit %rax, implicit %rdi
 | |
| ...
 | |
| ---
 | |
| # The second copy is redundant; the call preserves the source and dest register.
 | |
| # CHECK-LABEL: name: copyprop0
 | |
| # CHECK: bb.0:
 | |
| # CHECK-NEXT: %rax = COPY %rdi
 | |
| # CHECK-NEXT: CALL64pcrel32 @foo, csr_64_rt_mostregs
 | |
| # CHECK-NEXT: NOOP implicit %edi
 | |
| # CHECK-NOT: COPY
 | |
| # CHECK-NEXT: NOOP implicit %rax, implicit %rdi
 | |
| name: copyprop0
 | |
| body: |
 | |
|   bb.0:
 | |
|     %rax = COPY %rdi
 | |
|     CALL64pcrel32 @foo, csr_64_rt_mostregs
 | |
|     NOOP implicit killed %edi
 | |
|     %rdi = COPY %rax
 | |
|     NOOP implicit %rax, implicit %rdi
 | |
| ...
 | |
| ---
 | |
| # The 2nd copy is redundant; The call preserves the source and dest register.
 | |
| # CHECK-LABEL: name: copyprop1
 | |
| # CHECK: bb.0:
 | |
| # CHECK-NEXT: %rax = COPY %rdi
 | |
| # CHECK-NEXT: NOOP implicit %rax
 | |
| # CHECK-NEXT: NOOP implicit %rax, implicit %rdi
 | |
| name: copyprop1
 | |
| body: |
 | |
|   bb.0:
 | |
|     %rax = COPY %rdi
 | |
|     NOOP implicit killed %rax
 | |
|     %rax = COPY %rdi
 | |
|     NOOP implicit %rax, implicit %rdi
 | |
| ...
 | |
| ---
 | |
| # CHECK-LABEL: name: copyprop2
 | |
| # CHECK: bb.0:
 | |
| # CHECK-NEXT: %rax = COPY %rdi
 | |
| # CHECK-NEXT: NOOP implicit %ax
 | |
| # CHECK-NEXT: CALL64pcrel32 @foo, csr_64_rt_mostregs
 | |
| # CHECK-NOT: %rax = COPY %rdi
 | |
| # CHECK-NEXT: NOOP implicit %rax, implicit %rdi
 | |
| name: copyprop2
 | |
| body: |
 | |
|   bb.0:
 | |
|     %rax = COPY %rdi
 | |
|     NOOP implicit killed %ax
 | |
|     CALL64pcrel32 @foo, csr_64_rt_mostregs
 | |
|     %rax = COPY %rdi
 | |
|     NOOP implicit %rax, implicit %rdi
 | |
| ...
 | |
| ---
 | |
| # The second copy is not redundant if the source register (%rax) is clobbered
 | |
| # even if the dest (%rbp) is not.
 | |
| # CHECK-LABEL: name: nocopyprop0
 | |
| # CHECK: bb.0:
 | |
| # CHECK-NEXT: %rax = COPY %rbp
 | |
| # CHECK-NEXT: CALL64pcrel32 @foo, csr_64, implicit %rax, implicit %rbp
 | |
| # CHECK-NEXT: %rbp = COPY %rax
 | |
| # CHECK-NEXT: NOOP implicit %rax, implicit %rbp
 | |
| name: nocopyprop0
 | |
| body: |
 | |
|   bb.0:
 | |
|     %rax = COPY %rbp
 | |
|     CALL64pcrel32 @foo, csr_64, implicit %rax, implicit %rbp
 | |
|     %rbp = COPY %rax
 | |
|     NOOP implicit %rax, implicit %rbp
 | |
| ...
 | |
| ---
 | |
| # The second copy is not redundant if the dest register (%rax) is clobbered
 | |
| # even if the source (%rbp) is not.
 | |
| # CHECK-LABEL: name: nocopyprop1
 | |
| # CHECK: bb.0:
 | |
| # CHECK-NEXT: %rbp = COPY %rax
 | |
| # CHECK-NEXT: CALL64pcrel32 @foo, csr_64, implicit %rax, implicit %rbp
 | |
| # CHECK-NEXT: %rax = COPY %rbp
 | |
| # CHECK-NEXT: NOOP implicit %rax, implicit %rbp
 | |
| name: nocopyprop1
 | |
| body: |
 | |
|   bb.0:
 | |
|     %rbp = COPY %rax
 | |
|     CALL64pcrel32 @foo, csr_64, implicit %rax, implicit %rbp
 | |
|     %rax = COPY %rbp
 | |
|     NOOP implicit %rax, implicit %rbp
 | |
| ...
 | |
| ---
 | |
| # The second copy is not redundant if the source register (%rax) is clobbered
 | |
| # even if the dest (%rbp) is not.
 | |
| # CHECK-LABEL: name: nocopyprop2
 | |
| # CHECK: bb.0:
 | |
| # CHECK-NEXT: %rax = COPY %rbp
 | |
| # CHECK-NEXT: CALL64pcrel32 @foo, csr_64, implicit %rax, implicit %rbp
 | |
| # CHECK-NEXT: %rax = COPY %rbp
 | |
| # CHECK-NEXT: NOOP implicit %rax, implicit %rbp
 | |
| name: nocopyprop2
 | |
| body: |
 | |
|   bb.0:
 | |
|     %rax = COPY %rbp
 | |
|     CALL64pcrel32 @foo, csr_64, implicit %rax, implicit %rbp
 | |
|     %rax = COPY %rbp
 | |
|     NOOP implicit %rax, implicit %rbp
 | |
| ...
 | |
| ---
 | |
| # The second copy is not redundant if the dest register (%rax) is clobbered
 | |
| # even if the source (%rbp) is not.
 | |
| # CHECK-LABEL: name: nocopyprop3
 | |
| # CHECK: bb.0:
 | |
| # CHECK-NEXT: %rbp = COPY %rax
 | |
| # CHECK-NEXT: CALL64pcrel32 @foo, csr_64, implicit %rax, implicit %rbp
 | |
| # CHECK-NEXT: %rbp = COPY %rax
 | |
| # CHECK-NEXT: NOOP implicit %rax, implicit %rbp
 | |
| name: nocopyprop3
 | |
| body: |
 | |
|   bb.0:
 | |
|     %rbp = COPY %rax
 | |
|     CALL64pcrel32 @foo, csr_64, implicit %rax, implicit %rbp
 | |
|     %rbp = COPY %rax
 | |
|     NOOP implicit %rax, implicit %rbp
 | |
| ...
 | |
| ---
 | |
| # A reserved register may change its value so the 2nd copy is not redundant.
 | |
| # CHECK-LABEL: name: nocopyprop4
 | |
| # CHECK: bb.0:
 | |
| # CHECK-NEXT: %rax = COPY %rip
 | |
| # CHECK-NEXT: NOOP implicit %rax
 | |
| # CHECK-NEXT: %rax = COPY %rip
 | |
| # CHECK-NEXT: NOOP implicit %rax
 | |
| name: nocopyprop4
 | |
| body: |
 | |
|   bb.0:
 | |
|     %rax = COPY %rip
 | |
|     NOOP implicit %rax
 | |
|     %rax = COPY %rip
 | |
|     NOOP implicit %rax
 | |
| ...
 | |
| ---
 | |
| # Writing to a reserved register may have additional effects (slightly illegal
 | |
| # testcase because writing to %rip like this should make the instruction a jump)
 | |
| # CHECK-LABEL: name: nocopyprop5
 | |
| # CHECK: bb.0:
 | |
| # CHECK-NEXT: %rip = COPY %rax
 | |
| # CHECK-NEXT: %rip = COPY %rax
 | |
| name: nocopyprop5
 | |
| body: |
 | |
|   bb.0:
 | |
|     %rip = COPY %rax
 | |
|     %rip = COPY %rax
 | |
| ...
 |