; 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)