; RUN: llc -mtriple aarch64-windows %s -o - | FileCheck %s @tlsVar = thread_local global i32 0 @tlsVar8 = thread_local global i8 0 @tlsVar64 = thread_local global i64 0 define i32 @getVar() { %1 = load i32, i32* @tlsVar ret i32 %1 } define i32* @getPtr() { ret i32* @tlsVar } define void @setVar(i32 %val) { store i32 %val, i32* @tlsVar ret void } define i8 @getVar8() { %1 = load i8, i8* @tlsVar8 ret i8 %1 } define i64 @getVar64() { %1 = load i64, i64* @tlsVar64 ret i64 %1 } ; CHECK-LABEL: getVar ; CHECK: adrp [[TLS_INDEX_ADDR:x[0-9]+]], _tls_index ; CHECK: ldr w[[TLS_INDEX:[0-9]+]], {{\[}}[[TLS_INDEX_ADDR]], _tls_index] ; CHECK: ldr [[TLS_POINTER:x[0-9]+]], [x18, #88] ; CHECK: ldr [[TLS:x[0-9]+]], {{\[}}[[TLS_POINTER]], x[[TLS_INDEX]], lsl #3] ; CHECK: add [[TLS]], [[TLS]], :secrel_hi12:tlsVar ; CHECK: ldr w0, {{\[}}[[TLS]], :secrel_lo12:tlsVar{{\]}} ; CHECK-LABEL: getPtr ; CHECK: adrp [[TLS_INDEX_ADDR:x[0-9]+]], _tls_index ; CHECK: ldr w[[TLS_INDEX:[0-9]+]], {{\[}}[[TLS_INDEX_ADDR]], _tls_index] ; CHECK: ldr [[TLS_POINTER:x[0-9]+]], [x18, #88] ; CHECK: ldr [[TLS:x[0-9]+]], {{\[}}[[TLS_POINTER]], x[[TLS_INDEX]], lsl #3] ; CHECK: add [[TLS]], [[TLS]], :secrel_hi12:tlsVar ; CHECK: add x0, [[TLS]], :secrel_lo12:tlsVar ; CHECK-LABEL: setVar ; CHECK: adrp [[TLS_INDEX_ADDR:x[0-9]+]], _tls_index ; CHECK: ldr w[[TLS_INDEX:[0-9]+]], {{\[}}[[TLS_INDEX_ADDR]], _tls_index] ; CHECK: ldr [[TLS_POINTER:x[0-9]+]], [x18, #88] ; CHECK: ldr [[TLS:x[0-9]+]], {{\[}}[[TLS_POINTER]], x[[TLS_INDEX]], lsl #3] ; CHECK: add [[TLS]], [[TLS]], :secrel_hi12:tlsVar ; CHECK: str w0, {{\[}}[[TLS]], :secrel_lo12:tlsVar{{\]}} ; CHECK-LABEL: getVar8 ; CHECK: add [[TLS:x[0-9]+]], [[TLS]], :secrel_hi12:tlsVar8 ; CHECK: ldrb w0, {{\[}}[[TLS]], :secrel_lo12:tlsVar8{{\]}} ; CHECK-LABEL: getVar64 ; CHECK: add [[TLS:x[0-9]+]], [[TLS]], :secrel_hi12:tlsVar64 ; CHECK: ldr x0, {{\[}}[[TLS]], :secrel_lo12:tlsVar64{{\]}}