1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86-64 -mtriple=x86_64-linux-gnu -relocation-model=pic | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker@x = internal thread_local global i32 0, align 4 4*9880d681SAndroid Build Coastguard Worker@y = internal thread_local global i32 0, align 4 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; get_x and get_y are here to prevent x and y to be optimized away as 0 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdefine i32* @get_x() { 9*9880d681SAndroid Build Coastguard Workerentry: 10*9880d681SAndroid Build Coastguard Worker ret i32* @x 11*9880d681SAndroid Build Coastguard Worker; FIXME: This function uses a single thread-local variable, 12*9880d681SAndroid Build Coastguard Worker; so we might want to fall back to general-dynamic here. 13*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: get_x: 14*9880d681SAndroid Build Coastguard Worker; CHECK: leaq x@TLSLD(%rip), %rdi 15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: callq __tls_get_addr@PLT 16*9880d681SAndroid Build Coastguard Worker; CHECK: x@DTPOFF 17*9880d681SAndroid Build Coastguard Worker} 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerdefine i32* @get_y() { 20*9880d681SAndroid Build Coastguard Workerentry: 21*9880d681SAndroid Build Coastguard Worker ret i32* @y 22*9880d681SAndroid Build Coastguard Worker} 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerdefine i32 @f(i32 %i) { 25*9880d681SAndroid Build Coastguard Workerentry: 26*9880d681SAndroid Build Coastguard Worker %cmp = icmp eq i32 %i, 1 27*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %return, label %if.else 28*9880d681SAndroid Build Coastguard Worker; This bb does not access TLS, so should not call __tls_get_addr. 29*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: f: 30*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: __tls_get_addr 31*9880d681SAndroid Build Coastguard Worker; CHECK: je 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker 34*9880d681SAndroid Build Coastguard Workerif.else: 35*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* @x, align 4 36*9880d681SAndroid Build Coastguard Worker %cmp1 = icmp eq i32 %i, 2 37*9880d681SAndroid Build Coastguard Worker br i1 %cmp1, label %if.then2, label %return 38*9880d681SAndroid Build Coastguard Worker; Now we call __tls_get_addr. 39*9880d681SAndroid Build Coastguard Worker; CHECK: # %if.else 40*9880d681SAndroid Build Coastguard Worker; CHECK: leaq x@TLSLD(%rip), %rdi 41*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: callq __tls_get_addr@PLT 42*9880d681SAndroid Build Coastguard Worker; CHECK: x@DTPOFF 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerif.then2: 46*9880d681SAndroid Build Coastguard Worker %1 = load i32, i32* @y, align 4 47*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %1, %0 48*9880d681SAndroid Build Coastguard Worker br label %return 49*9880d681SAndroid Build Coastguard Worker; This accesses TLS, but is dominated by the previous block, 50*9880d681SAndroid Build Coastguard Worker; so should not have to call __tls_get_addr again. 51*9880d681SAndroid Build Coastguard Worker; CHECK: # %if.then2 52*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: __tls_get_addr 53*9880d681SAndroid Build Coastguard Worker; CHECK: y@DTPOFF 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workerreturn: 57*9880d681SAndroid Build Coastguard Worker %retval.0 = phi i32 [ %add, %if.then2 ], [ 5, %entry ], [ %0, %if.else ] 58*9880d681SAndroid Build Coastguard Worker ret i32 %retval.0 59*9880d681SAndroid Build Coastguard Worker} 60