1; RUN: llc < %s -march=x86 -mtriple=i386-linux-gnu -relocation-model=pic | FileCheck -check-prefix=X32 %s 2; RUN: llc < %s -march=x86-64 -mtriple=x86_64-linux-gnu -relocation-model=pic | FileCheck -check-prefix=X64 %s 3 4@i = thread_local global i32 15 5@j = internal thread_local global i32 42 6@k = internal thread_local global i32 42 7 8define i32 @f1() { 9entry: 10 %tmp1 = load i32, i32* @i 11 ret i32 %tmp1 12} 13 14; X32-LABEL: f1: 15; X32: leal i@TLSGD(,%ebx), %eax 16; X32: calll ___tls_get_addr@PLT 17 18; X64-LABEL: f1: 19; X64: leaq i@TLSGD(%rip), %rdi 20; X64: callq __tls_get_addr@PLT 21 22 23@i2 = external thread_local global i32 24 25define i32* @f2() { 26entry: 27 ret i32* @i 28} 29 30; X32-LABEL: f2: 31; X32: leal i@TLSGD(,%ebx), %eax 32; X32: calll ___tls_get_addr@PLT 33 34; X64-LABEL: f2: 35; X64: leaq i@TLSGD(%rip), %rdi 36; X64: callq __tls_get_addr@PLT 37 38 39 40define i32 @f3() { 41entry: 42 %tmp1 = load i32, i32* @i ; <i32> [#uses=1] 43 ret i32 %tmp1 44} 45 46; X32-LABEL: f3: 47; X32: leal i@TLSGD(,%ebx), %eax 48; X32: calll ___tls_get_addr@PLT 49 50; X64-LABEL: f3: 51; X64: leaq i@TLSGD(%rip), %rdi 52; X64: callq __tls_get_addr@PLT 53 54 55define i32* @f4() nounwind { 56entry: 57 ret i32* @i 58} 59 60; X32-LABEL: f4: 61; X32: leal i@TLSGD(,%ebx), %eax 62; X32: calll ___tls_get_addr@PLT 63 64; X64-LABEL: f4: 65; X64: leaq i@TLSGD(%rip), %rdi 66; X64: callq __tls_get_addr@PLT 67 68 69define i32 @f5() nounwind { 70entry: 71 %0 = load i32, i32* @j, align 4 72 %1 = load i32, i32* @k, align 4 73 %add = add nsw i32 %0, %1 74 ret i32 %add 75} 76 77; X32-LABEL: f5: 78; X32: leal {{[jk]}}@TLSLDM(%ebx) 79; X32: calll ___tls_get_addr@PLT 80; X32: movl {{[jk]}}@DTPOFF(%e 81; X32: addl {{[jk]}}@DTPOFF(%e 82 83; X64-LABEL: f5: 84; X64: leaq {{[jk]}}@TLSLD(%rip), %rdi 85; X64: callq __tls_get_addr@PLT 86; X64: movl {{[jk]}}@DTPOFF(%r 87; X64: addl {{[jk]}}@DTPOFF(%r 88