mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-28 19:06:06 +00:00

Supports TLS local-dynamic on AIX, generates below sequence of code: ``` .tc foo[TC],foo[TL]@ld # Variable offset, ld relocation specifier .tc mh[TC],mh[TC]@ml # Module handle for the caller lwz 3,mh[TC]\(2\) $$ For 64-bit: ld 3,mh[TC]\(2\) bla .__tls_get_mod # Modifies r0,r3,r4,r5,r11,lr,cr0 #r3 = &TLS for module lwz 4,foo[TC]\(2\) $$ For 64-bit: ld 4,foo[TC]\(2\) add 5,3,4 # Compute &foo .rename mh[TC], "\_$TLSML" # Symbol for the module handle must have the name "_$TLSML" ``` --------- Co-authored-by: tingwang <tingwang@tingwangs-MBP.lan> Co-authored-by: tingwang <tingwang@tingwangs-MacBook-Pro.local>
397 lines
20 KiB
LLVM
397 lines
20 KiB
LLVM
; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mattr=-altivec -mtriple powerpc64-ibm-aix-xcoff \
|
|
; RUN: --code-model=small < %s | FileCheck %s --check-prefixes=SMALL64,SMALL
|
|
; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mattr=-altivec -mtriple powerpc64-ibm-aix-xcoff \
|
|
; RUN: --code-model=large < %s | FileCheck %s --check-prefixes=LARGE64,LARGE
|
|
; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mattr=-altivec -mtriple powerpc-ibm-aix-xcoff \
|
|
; RUN: --code-model=small < %s | FileCheck %s --check-prefixes=SMALL32,SMALL
|
|
; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mattr=-altivec -mtriple powerpc-ibm-aix-xcoff \
|
|
; RUN: --code-model=large < %s | FileCheck %s --check-prefixes=LARGE32,LARGE
|
|
; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mattr=-altivec -mtriple powerpc64-ibm-aix-xcoff \
|
|
; RUN: --code-model=small -O0 < %s | FileCheck %s --check-prefixes=WITHDUP
|
|
; RUN: llc -verify-machineinstrs -mcpu=pwr7 -mattr=-altivec -mtriple powerpc64-ibm-aix-xcoff \
|
|
; RUN: --code-model=small -O1 < %s | FileCheck %s --check-prefixes=NODUP
|
|
|
|
@TGInit = thread_local(localdynamic) global i32 42, align 4
|
|
@TGUninit = thread_local(localdynamic) global i32 0, align 4
|
|
@TIInit = internal thread_local(localdynamic) global i32 42, align 4
|
|
@TIUninit = internal thread_local(localdynamic) global i32 0, align 4
|
|
@TWInit = weak thread_local(localdynamic) global i32 42, align 4
|
|
@TWUninit = weak thread_local(localdynamic) global i32 0, align 4
|
|
@x = thread_local(localdynamic) global i32 42, align 4
|
|
@y = thread_local(localdynamic) global i32 42, align 4
|
|
|
|
define i32 @loadTGInit() {
|
|
; SMALL-LABEL: loadTGInit:
|
|
; SMALL64: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
|
|
; SMALL32: lwz [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
|
|
; SMALL: bla .__tls_get_mod[PR]
|
|
; SMALL64: ld [[OffsetR:[0-9]+]], [[TGInitL:L..C[0-9]+]](2)
|
|
; SMALL32: lwz [[OffsetR:[0-9]+]], [[TGInitL:L..C[0-9]+]](2)
|
|
; SMALL: lwzx [[TGInitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
|
|
;
|
|
; LARGE-LABEL: loadTGInit:
|
|
; LARGE64: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
|
|
; LARGE: addis [[OffsetHR:[0-9]+]], [[TGInitL:L..C[0-9]+]]@u(2)
|
|
; LARGE32: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
|
|
; LARGE64: ld [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
|
|
; LARGE32: lwz [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
|
|
; LARGE: bla .__tls_get_mod[PR]
|
|
; LARGE64: ld [[OffsetR:[0-9]+]], [[TGInitL:L..C[0-9]+]]@l([[OffsetHR]])
|
|
; LARGE32: lwz [[OffsetR:[0-9]+]], [[TGInitL:L..C[0-9]+]]@l([[OffsetHR]])
|
|
; LARGE: lwzx [[TGInitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
|
|
entry:
|
|
%0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @TGInit)
|
|
%1 = load i32, ptr %0, align 4
|
|
ret i32 %1
|
|
}
|
|
|
|
define void @storeTGInit(i32 noundef signext %i) {
|
|
; SMALL-LABEL: storeTGInit:
|
|
; SMALL64: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
|
|
; SMALL32: lwz [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
|
|
; SMALL: bla .__tls_get_mod[PR]
|
|
; SMALL64: ld [[OffsetR:[0-9]+]], [[TGInitL:L..C[0-9]+]](2)
|
|
; SMALL32: lwz [[OffsetR:[0-9]+]], [[TGInitL:L..C[0-9]+]](2)
|
|
; SMALL: stwx [[TGInitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
|
|
;
|
|
; LARGE-LABEL: storeTGInit:
|
|
; LARGE64: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
|
|
; LARGE: addis [[OffsetHR:[0-9]+]], [[TGInitL:L..C[0-9]+]]@u(2)
|
|
; LARGE32: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
|
|
; LARGE64: ld [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
|
|
; LARGE32: lwz [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
|
|
; LARGE: bla .__tls_get_mod[PR]
|
|
; LARGE64: ld [[OffsetR:[0-9]+]], [[TGInitL:L..C[0-9]+]]@l([[OffsetHR]])
|
|
; LARGE32: lwz [[OffsetR:[0-9]+]], [[TGInitL:L..C[0-9]+]]@l([[OffsetHR]])
|
|
; LARGE: stwx [[TGInitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
|
|
entry:
|
|
%0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @TGInit)
|
|
store i32 %i, ptr %0, align 4
|
|
ret void
|
|
}
|
|
|
|
define i32 @loadTGUninit() {
|
|
; SMALL-LABEL: loadTGUninit:
|
|
; SMALL64: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
|
|
; SMALL32: lwz [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
|
|
; SMALL: bla .__tls_get_mod[PR]
|
|
; SMALL64: ld [[OffsetR:[0-9]+]], [[TGUninitL:L..C[0-9]+]](2)
|
|
; SMALL32: lwz [[OffsetR:[0-9]+]], [[TGUninitL:L..C[0-9]+]](2)
|
|
; SMALL: lwzx [[TGInitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
|
|
;
|
|
; LARGE-LABEL: loadTGUninit:
|
|
; LARGE64: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
|
|
; LARGE: addis [[OffsetHR:[0-9]+]], [[TGUninitL:L..C[0-9]+]]@u(2)
|
|
; LARGE32: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
|
|
; LARGE64: ld [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
|
|
; LARGE32: lwz [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
|
|
; LARGE: bla .__tls_get_mod[PR]
|
|
; LARGE64: ld [[OffsetR:[0-9]+]], [[TGUninitL:L..C[0-9]+]]@l([[OffsetHR]])
|
|
; LARGE32: lwz [[OffsetR:[0-9]+]], [[TGUninitL:L..C[0-9]+]]@l([[OffsetHR]])
|
|
; LARGE: lwzx [[TGUninitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
|
|
entry:
|
|
%0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @TGUninit)
|
|
%1 = load i32, ptr %0, align 4
|
|
ret i32 %1
|
|
}
|
|
|
|
define void @storeTGUninit(i32 noundef signext %i) {
|
|
; SMALL-LABEL: storeTGUninit:
|
|
; SMALL64: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
|
|
; SMALL32: lwz [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
|
|
; SMALL: bla .__tls_get_mod[PR]
|
|
; SMALL64: ld [[OffsetR:[0-9]+]], [[TGUninitL:L..C[0-9]+]](2)
|
|
; SMALL32: lwz [[OffsetR:[0-9]+]], [[TGUninitL:L..C[0-9]+]](2)
|
|
; SMALL: stwx [[TGUninitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
|
|
;
|
|
; LARGE-LABEL: storeTGUninit:
|
|
; LARGE64: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
|
|
; LARGE: addis [[OffsetHR:[0-9]+]], [[TGUninitL:L..C[0-9]+]]@u(2)
|
|
; LARGE32: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
|
|
; LARGE64: ld [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
|
|
; LARGE32: lwz [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
|
|
; LARGE: bla .__tls_get_mod[PR]
|
|
; LARGE64: ld [[OffsetR:[0-9]+]], [[TGUninitL:L..C[0-9]+]]@l([[OffsetHR]])
|
|
; LARGE32: lwz [[OffsetR:[0-9]+]], [[TGUninitL:L..C[0-9]+]]@l([[OffsetHR]])
|
|
; LARGE: stwx [[TGUninitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
|
|
entry:
|
|
%0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @TGUninit)
|
|
store i32 %i, ptr %0, align 4
|
|
ret void
|
|
}
|
|
|
|
define i32 @loadTIInit() {
|
|
; SMALL-LABEL: loadTIInit:
|
|
; SMALL64: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
|
|
; SMALL32: lwz [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
|
|
; SMALL: bla .__tls_get_mod[PR]
|
|
; SMALL64: ld [[OffsetR:[0-9]+]], [[TIInitL:L..C[0-9]+]](2)
|
|
; SMALL32: lwz [[OffsetR:[0-9]+]], [[TIInitL:L..C[0-9]+]](2)
|
|
; SMALL: lwzx [[TIInitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
|
|
;
|
|
; LARGE-LABEL: loadTIInit:
|
|
; LARGE64: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
|
|
; LARGE: addis [[OffsetHR:[0-9]+]], [[TIInitL:L..C[0-9]+]]@u(2)
|
|
; LARGE32: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
|
|
; LARGE64: ld [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
|
|
; LARGE32: lwz [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
|
|
; LARGE: bla .__tls_get_mod[PR]
|
|
; LARGE64: ld [[OffsetR:[0-9]+]], [[TIInitL:L..C[0-9]+]]@l([[OffsetHR]])
|
|
; LARGE32: lwz [[OffsetR:[0-9]+]], [[TIInitL:L..C[0-9]+]]@l([[OffsetHR]])
|
|
; LARGE: lwzx [[TIInitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
|
|
entry:
|
|
%0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @TIInit)
|
|
%1 = load i32, ptr %0, align 4
|
|
ret i32 %1
|
|
}
|
|
|
|
define void @storeTIInit(i32 noundef signext %i) {
|
|
; SMALL-LABEL: storeTIInit:
|
|
; SMALL64: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
|
|
; SMALL32: lwz [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
|
|
; SMALL: bla .__tls_get_mod[PR]
|
|
; SMALL64: ld [[OffsetR:[0-9]+]], [[TIInitL:L..C[0-9]+]](2)
|
|
; SMALL32: lwz [[OffsetR:[0-9]+]], [[TIInitL:L..C[0-9]+]](2)
|
|
; SMALL: stwx [[TIInitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
|
|
;
|
|
; LARGE-LABEL: storeTIInit:
|
|
; LARGE64: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
|
|
; LARGE: addis [[OffsetHR:[0-9]+]], [[TIInitL:L..C[0-9]+]]@u(2)
|
|
; LARGE32: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
|
|
; LARGE64: ld [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
|
|
; LARGE32: lwz [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
|
|
; LARGE: bla .__tls_get_mod[PR]
|
|
; LARGE64: ld [[OffsetR:[0-9]+]], [[TIInitL:L..C[0-9]+]]@l([[OffsetHR]])
|
|
; LARGE32: lwz [[OffsetR:[0-9]+]], [[TIInitL:L..C[0-9]+]]@l([[OffsetHR]])
|
|
; LARGE: stwx [[TIInitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
|
|
entry:
|
|
%0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @TIInit)
|
|
store i32 %i, ptr %0, align 4
|
|
ret void
|
|
}
|
|
|
|
define i32 @loadTIUninit() {
|
|
; SMALL-LABEL: loadTIUninit:
|
|
; SMALL64: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
|
|
; SMALL32: lwz [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
|
|
; SMALL: bla .__tls_get_mod[PR]
|
|
; SMALL64: ld [[OffsetR:[0-9]+]], [[TIUninitL:L..C[0-9]+]](2)
|
|
; SMALL32: lwz [[OffsetR:[0-9]+]], [[TIUninitL:L..C[0-9]+]](2)
|
|
; SMALL: lwzx [[TIUninitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
|
|
;
|
|
; LARGE-LABEL: loadTIUninit:
|
|
; LARGE64: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
|
|
; LARGE: addis [[OffsetHR:[0-9]+]], [[TIUninitL:L..C[0-9]+]]@u(2)
|
|
; LARGE32: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
|
|
; LARGE64: ld [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
|
|
; LARGE32: lwz [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
|
|
; LARGE: bla .__tls_get_mod[PR]
|
|
; LARGE64: ld [[OffsetR:[0-9]+]], [[TIUninitL:L..C[0-9]+]]@l([[OffsetHR]])
|
|
; LARGE32: lwz [[OffsetR:[0-9]+]], [[TIUninitL:L..C[0-9]+]]@l([[OffsetHR]])
|
|
; LARGE: lwzx [[TIUninitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
|
|
entry:
|
|
%0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @TIUninit)
|
|
%1 = load i32, ptr %0, align 4
|
|
ret i32 %1
|
|
}
|
|
|
|
define void @storeTIUninit(i32 noundef signext %i) {
|
|
; SMALL-LABEL: storeTIUninit:
|
|
; SMALL64: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
|
|
; SMALL32: lwz [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
|
|
; SMALL: bla .__tls_get_mod[PR]
|
|
; SMALL64: ld [[OffsetR:[0-9]+]], [[TIUninitL:L..C[0-9]+]](2)
|
|
; SMALL32: lwz [[OffsetR:[0-9]+]], [[TIUninitL:L..C[0-9]+]](2)
|
|
; SMALL: stwx [[TIUninitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
|
|
;
|
|
; LARGE-LABEL: storeTIUninit:
|
|
; LARGE64: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
|
|
; LARGE: addis [[OffsetHR:[0-9]+]], [[TIUninitL:L..C[0-9]+]]@u(2)
|
|
; LARGE32: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
|
|
; LARGE64: ld [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
|
|
; LARGE32: lwz [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
|
|
; LARGE: bla .__tls_get_mod[PR]
|
|
; LARGE64: ld [[OffsetR:[0-9]+]], [[TIUninitL:L..C[0-9]+]]@l([[OffsetHR]])
|
|
; LARGE32: lwz [[OffsetR:[0-9]+]], [[TIUninitL:L..C[0-9]+]]@l([[OffsetHR]])
|
|
; LARGE: stwx [[TIUninitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
|
|
entry:
|
|
%0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @TIUninit)
|
|
store i32 %i, ptr %0, align 4
|
|
ret void
|
|
}
|
|
|
|
define i32 @loadTWInit() {
|
|
; SMALL-LABEL: loadTWInit:
|
|
; SMALL64: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
|
|
; SMALL32: lwz [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
|
|
; SMALL: bla .__tls_get_mod[PR]
|
|
; SMALL64: ld [[OffsetR:[0-9]+]], [[TWInitL:L..C[0-9]+]](2)
|
|
; SMALL32: lwz [[OffsetR:[0-9]+]], [[TWInitL:L..C[0-9]+]](2)
|
|
; SMALL: lwzx [[TWInitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
|
|
;
|
|
; LARGE-LABEL: loadTWInit:
|
|
; LARGE64: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
|
|
; LARGE: addis [[OffsetHR:[0-9]+]], [[TWInitL:L..C[0-9]+]]@u(2)
|
|
; LARGE32: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
|
|
; LARGE64: ld [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
|
|
; LARGE32: lwz [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
|
|
; LARGE: bla .__tls_get_mod[PR]
|
|
; LARGE64: ld [[OffsetR:[0-9]+]], [[TWInitL:L..C[0-9]+]]@l([[OffsetHR]])
|
|
; LARGE32: lwz [[OffsetR:[0-9]+]], [[TWInitL:L..C[0-9]+]]@l([[OffsetHR]])
|
|
; LARGE: lwzx [[TWInitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
|
|
entry:
|
|
%0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @TWInit)
|
|
%1 = load i32, ptr %0, align 4
|
|
ret i32 %1
|
|
}
|
|
|
|
define void @storeTWInit(i32 noundef signext %i) {
|
|
; SMALL-LABEL: storeTWInit:
|
|
; SMALL64: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
|
|
; SMALL32: lwz [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
|
|
; SMALL: bla .__tls_get_mod[PR]
|
|
; SMALL64: ld [[OffsetR:[0-9]+]], [[TWInitL:L..C[0-9]+]](2)
|
|
; SMALL32: lwz [[OffsetR:[0-9]+]], [[TWInitL:L..C[0-9]+]](2)
|
|
; SMALL: stwx [[TWInitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
|
|
;
|
|
; LARGE-LABEL: storeTWInit:
|
|
; LARGE64: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
|
|
; LARGE: addis [[OffsetHR:[0-9]+]], [[TWInitL:L..C[0-9]+]]@u(2)
|
|
; LARGE32: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
|
|
; LARGE64: ld [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
|
|
; LARGE32: lwz [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
|
|
; LARGE: bla .__tls_get_mod[PR]
|
|
; LARGE64: ld [[OffsetR:[0-9]+]], [[TWInitL:L..C[0-9]+]]@l([[OffsetHR]])
|
|
; LARGE32: lwz [[OffsetR:[0-9]+]], [[TWInitL:L..C[0-9]+]]@l([[OffsetHR]])
|
|
; LARGE: stwx [[TWInitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
|
|
entry:
|
|
%0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @TWInit)
|
|
store i32 %i, ptr %0, align 4
|
|
ret void
|
|
}
|
|
|
|
define i32 @loadTWUninit() {
|
|
; SMALL-LABEL: loadTWUninit:
|
|
; SMALL64: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
|
|
; SMALL32: lwz [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
|
|
; SMALL: bla .__tls_get_mod[PR]
|
|
; SMALL64: ld [[OffsetR:[0-9]+]], [[TWUninitL:L..C[0-9]+]](2)
|
|
; SMALL32: lwz [[OffsetR:[0-9]+]], [[TWUninitL:L..C[0-9]+]](2)
|
|
; SMALL: lwzx [[TWUninitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
|
|
;
|
|
; LARGE-LABEL: loadTWUninit:
|
|
; LARGE64: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
|
|
; LARGE: addis [[OffsetHR:[0-9]+]], [[TWUninitL:L..C[0-9]+]]@u(2)
|
|
; LARGE32: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
|
|
; LARGE64: ld [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
|
|
; LARGE32: lwz [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
|
|
; LARGE: bla .__tls_get_mod[PR]
|
|
; LARGE64: ld [[OffsetR:[0-9]+]], [[TWUninitL:L..C[0-9]+]]@l([[OffsetHR]])
|
|
; LARGE32: lwz [[OffsetR:[0-9]+]], [[TWUninitL:L..C[0-9]+]]@l([[OffsetHR]])
|
|
; LARGE: lwzx [[TWUninitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
|
|
entry:
|
|
%0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @TWUninit)
|
|
%1 = load i32, ptr %0, align 4
|
|
ret i32 %1
|
|
}
|
|
|
|
define void @storeTWUninit(i32 noundef signext %i) {
|
|
; SMALL-LABEL: storeTWUninit:
|
|
; SMALL64: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
|
|
; SMALL32: lwz [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
|
|
; SMALL: bla .__tls_get_mod[PR]
|
|
; SMALL64: ld [[OffsetR:[0-9]+]], [[TWUninitL:L..C[0-9]+]](2)
|
|
; SMALL32: lwz [[OffsetR:[0-9]+]], [[TWUninitL:L..C[0-9]+]](2)
|
|
; SMALL: stwx [[TWUninitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
|
|
;
|
|
; LARGE-LABEL: storeTWUninit:
|
|
; LARGE64: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
|
|
; LARGE: addis [[OffsetHR:[0-9]+]], [[TWUninitL:L..C[0-9]+]]@u(2)
|
|
; LARGE32: addis [[ModuleHandleHR:[0-9]+]], [[ModuleHandleL:L..C[0-9]+]]@u(2)
|
|
; LARGE64: ld [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
|
|
; LARGE32: lwz [[ModuleHandleR:3]], [[ModuleHandleL]]@l([[ModuleHandleHR]])
|
|
; LARGE: bla .__tls_get_mod[PR]
|
|
; LARGE64: ld [[OffsetR:[0-9]+]], [[TWUninitL:L..C[0-9]+]]@l([[OffsetHR]])
|
|
; LARGE32: lwz [[OffsetR:[0-9]+]], [[TWUninitL:L..C[0-9]+]]@l([[OffsetHR]])
|
|
; LARGE: stwx [[TWUninitValR:[0-9]+]], [[ModuleHandleR]], [[OffsetR]]
|
|
entry:
|
|
%0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @TWUninit)
|
|
store i32 %i, ptr %0, align 4
|
|
ret void
|
|
}
|
|
|
|
define i32 @DedupTlsGetMod() #0 {
|
|
; WITHDUP-LABEL: DedupTlsGetMod:
|
|
; WITHDUP: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
|
|
; WITHDUP-NEXT: bla .__tls_get_mod[PR]
|
|
; WITHDUP-NEXT: ld [[OffsetXR:[0-9]+]], [[X:L..C[0-9]+]](2)
|
|
; WITHDUP: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
|
|
; WITHDUP-NEXT: bla .__tls_get_mod[PR]
|
|
; WITHDUP: ld [[OffsetYR:[0-9]+]], [[Y:L..C[0-9]+]](2)
|
|
; WITHDUP-LABEL: L..DedupTlsGetMod0:
|
|
;
|
|
; NODUP-LABEL: DedupTlsGetMod:
|
|
; NODUP: ld [[ModuleHandleR:3]], [[ModuleHandleL:L..C[0-9]+]](2)
|
|
; NODUP-NEXT: bla .__tls_get_mod[PR]
|
|
; NODUP-NEXT: ld [[OffsetXR:[0-9]+]], [[X:L..C[0-9]+]](2)
|
|
; NODUP-NEXT: ld [[OffsetYR:[0-9]+]], [[Y:L..C[0-9]+]](2)
|
|
; NODUP-NEXT: lwzx [[XValR:[0-9]+]], [[ModuleHandleR]], [[OffsetXR]]
|
|
; NODUP-NEXT: lwzx [[YValR:[0-9]+]], [[ModuleHandleR]], [[OffsetYR]]
|
|
; NODUP-LABEL: L..DedupTlsGetMod0:
|
|
entry:
|
|
%retval = alloca i32, align 4
|
|
store i32 0, ptr %retval, align 4
|
|
%0 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @x)
|
|
%1 = load i32, ptr %0, align 4
|
|
%2 = call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @y)
|
|
%3 = load i32, ptr %2, align 4
|
|
%add = add nsw i32 %1, %3
|
|
ret i32 %add
|
|
}
|
|
|
|
; SMALL: .extern .__tls_get_mod[PR]
|
|
; LARGE: .extern .__tls_get_mod[PR]
|
|
; SMALL-NOT: .extern _Renamed..5f24__TLSML[TC]
|
|
; LARGE-NOT: .extern _Renamed..5f24__TLSML[TC]
|
|
|
|
; SMALL: [[ModuleHandleL]]:
|
|
; SMALL-NEXT: .tc _Renamed..5f24__TLSML[TC],_Renamed..5f24__TLSML[TC]@ml
|
|
; SMALL-NEXT: .rename _Renamed..5f24__TLSML[TC],"_$TLSML"
|
|
; SMALL: [[TGInitL]]:
|
|
; SMALL-NEXT: .tc TGInit[TC],TGInit[TL]@ld
|
|
; SMALL: [[TGUninitL]]:
|
|
; SMALL-NEXT: .tc TGUninit[TC],TGUninit[TL]@ld
|
|
; SMALL: [[TIInitL]]:
|
|
; SMALL-NEXT: .tc TIInit[TC],TIInit[TL]@ld
|
|
; SMALL: [[TIUninitL]]:
|
|
; SMALL-NEXT: .tc TIUninit[TC],TIUninit[UL]@ld
|
|
; SMALL: [[TWInitL]]:
|
|
; SMALL-NEXT: .tc TWInit[TC],TWInit[TL]@ld
|
|
; SMALL: [[TWUninitL]]:
|
|
; SMALL-NEXT: .tc TWUninit[TC],TWUninit[TL]@ld
|
|
|
|
; LARGE64: [[ModuleHandleL]]:
|
|
; LARGE64-NEXT: .tc _Renamed..5f24__TLSML[TC],_Renamed..5f24__TLSML[TC]@ml
|
|
; LARGE64-NEXT: .rename _Renamed..5f24__TLSML[TC],"_$TLSML"
|
|
; LARGE64: [[TGInitL]]:
|
|
; LARGE64-NEXT: .tc TGInit[TE],TGInit[TL]@ld
|
|
;
|
|
; LARGE32: [[TGInitL]]:
|
|
; LARGE32-NEXT: .tc TGInit[TE],TGInit[TL]@ld
|
|
; LARGE32: [[ModuleHandleL]]:
|
|
; LARGE32-NEXT: .tc _Renamed..5f24__TLSML[TC],_Renamed..5f24__TLSML[TC]@ml
|
|
; LARGE32-NEXT: .rename _Renamed..5f24__TLSML[TC],"_$TLSML"
|
|
;
|
|
; LARGE: [[TGUninitL]]:
|
|
; LARGE-NEXT: .tc TGUninit[TE],TGUninit[TL]@ld
|
|
; LARGE: [[TIInitL]]:
|
|
; LARGE-NEXT: .tc TIInit[TE],TIInit[TL]@ld
|
|
; LARGE: [[TIUninitL]]:
|
|
; LARGE-NEXT: .tc TIUninit[TE],TIUninit[UL]@ld
|
|
; LARGE: [[TWInitL]]:
|
|
; LARGE-NEXT: .tc TWInit[TE],TWInit[TL]@ld
|
|
; LARGE: [[TWUninitL]]:
|
|
; LARGE-NEXT: .tc TWUninit[TE],TWUninit[TL]@ld
|
|
|
|
declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull)
|