mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-30 16:17:05 +00:00 
			
		
		
		
	See full discussion in http://reviews.llvm.org/D7491. We now hide the add-immediate and call instructions together in a separate pseudo-op, which is tagged to define GPR3 and clobber the call-killed registers. The PPCTLSDynamicCall pass prior to RA now expands this op into the two separate addi and call ops, with explicit definitions of GPR3 on both instructions, and explicit clobbers on the call instruction. The pass is now marked as requiring and preserving the LiveIntervals and SlotIndexes analyses, and fixes these up after the replacement sequences are introduced. Self-hosting has been verified on LE P8 and BE P7 with various optimization levels, etc. It has also been verified with the --no-tls-optimize flag workaround removed. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228725 91177308-0d34-0410-b5e6-96231b3b80d8
		
			
				
	
	
		
			32 lines
		
	
	
		
			989 B
		
	
	
	
		
			LLVM
		
	
	
	
	
	
			
		
		
	
	
			32 lines
		
	
	
		
			989 B
		
	
	
	
		
			LLVM
		
	
	
	
	
	
| ; RUN: llc -march=ppc64 -mcpu=pwr7 -O2 -relocation-model=pic < %s | FileCheck %s
 | |
| 
 | |
| target datalayout = "e-m:e-i64:64-n32:64"
 | |
| target triple = "powerpc64le-unknown-linux-gnu"
 | |
| 
 | |
| ; Test back-to-back stores of TLS variables to ensure call sequences no
 | |
| ; longer overlap.
 | |
| 
 | |
| @__once_callable = external thread_local global i8**
 | |
| @__once_call = external thread_local global void ()*
 | |
| 
 | |
| define i64 @call_once(i64 %flag, i8* %ptr) {
 | |
| entry:
 | |
|   %var = alloca i8*, align 8
 | |
|   store i8* %ptr, i8** %var, align 8
 | |
|   store i8** %var, i8*** @__once_callable, align 8
 | |
|   store void ()* @__once_call_impl, void ()** @__once_call, align 8
 | |
|   ret i64 %flag
 | |
| }
 | |
| 
 | |
| ; CHECK-LABEL: call_once:
 | |
| ; CHECK: addi 3, {{[0-9]+}}, __once_callable@got@tlsgd@l
 | |
| ; CHECK: bl __tls_get_addr(__once_callable@tlsgd)
 | |
| ; CHECK-NEXT: nop
 | |
| ; CHECK: std {{[0-9]+}}, 0(3)
 | |
| ; CHECK: addi 3, {{[0-9]+}}, __once_call@got@tlsgd@l
 | |
| ; CHECK: bl __tls_get_addr(__once_call@tlsgd)
 | |
| ; CHECK-NEXT: nop
 | |
| ; CHECK: std {{[0-9]+}}, 0(3)
 | |
| 
 | |
| declare void @__once_call_impl()
 |