194 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 42; RUN: llc -o - %s | FileCheck %s --check-prefix=NOPIC3; RUN: llc -o - %s -relocation-model=pic | FileCheck %s --check-prefix=PIC4; RUN: llc -o - %s -relocation-model=pic -enable-tlsdesc | FileCheck %s --check-prefix=TLSDESC5 6target triple = "x86_64--linux-gnu"7 8declare void @effect()9declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull)10 11@foo_local = dso_local thread_local(localexec) global i32 0, align 412 13define i32 @func_local_tls(i32 %arg0, i64 %arg1) nounwind {14; NOPIC-LABEL: func_local_tls:15; NOPIC: # %bb.0: # %entry16; NOPIC-NEXT: pushq %rbp17; NOPIC-NEXT: pushq %rbx18; NOPIC-NEXT: pushq %rax19; NOPIC-NEXT: movl %fs:foo_local@TPOFF, %ebp20; NOPIC-NEXT: testl %edi, %edi21; NOPIC-NEXT: movl %ebp, %eax22; NOPIC-NEXT: jne .LBB0_223; NOPIC-NEXT: # %bb.1: # %if.then24; NOPIC-NEXT: movq %rsi, %rbx25; NOPIC-NEXT: callq effect@PLT26; NOPIC-NEXT: movl %fs:foo_local@TPOFF+168(,%rbx,4), %eax27; NOPIC-NEXT: .LBB0_2: # %if.end28; NOPIC-NEXT: addl %ebp, %eax29; NOPIC-NEXT: addq $8, %rsp30; NOPIC-NEXT: popq %rbx31; NOPIC-NEXT: popq %rbp32; NOPIC-NEXT: retq33;34; PIC-LABEL: func_local_tls:35; PIC: # %bb.0: # %entry36; PIC-NEXT: pushq %rbp37; PIC-NEXT: pushq %r1438; PIC-NEXT: pushq %rbx39; PIC-NEXT: movl %fs:.Lfoo_local$local@TPOFF, %ebp40; PIC-NEXT: testl %edi, %edi41; PIC-NEXT: movl %ebp, %eax42; PIC-NEXT: jne .LBB0_243; PIC-NEXT: # %bb.1: # %if.then44; PIC-NEXT: movq %rsi, %rbx45; PIC-NEXT: movq %fs:0, %rax46; PIC-NEXT: leaq .Lfoo_local$local@TPOFF(%rax), %r1447; PIC-NEXT: callq effect@PLT48; PIC-NEXT: movl 168(%r14,%rbx,4), %eax49; PIC-NEXT: .LBB0_2: # %if.end50; PIC-NEXT: addl %ebp, %eax51; PIC-NEXT: popq %rbx52; PIC-NEXT: popq %r1453; PIC-NEXT: popq %rbp54; PIC-NEXT: retq55;56; TLSDESC-LABEL: func_local_tls:57; TLSDESC: # %bb.0: # %entry58; TLSDESC-NEXT: pushq %rbp59; TLSDESC-NEXT: pushq %r1460; TLSDESC-NEXT: pushq %rbx61; TLSDESC-NEXT: movl %fs:.Lfoo_local$local@TPOFF, %ebp62; TLSDESC-NEXT: testl %edi, %edi63; TLSDESC-NEXT: movl %ebp, %eax64; TLSDESC-NEXT: jne .LBB0_265; TLSDESC-NEXT: # %bb.1: # %if.then66; TLSDESC-NEXT: movq %rsi, %rbx67; TLSDESC-NEXT: movq %fs:0, %rax68; TLSDESC-NEXT: leaq .Lfoo_local$local@TPOFF(%rax), %r1469; TLSDESC-NEXT: callq effect@PLT70; TLSDESC-NEXT: movl 168(%r14,%rbx,4), %eax71; TLSDESC-NEXT: .LBB0_2: # %if.end72; TLSDESC-NEXT: addl %ebp, %eax73; TLSDESC-NEXT: popq %rbx74; TLSDESC-NEXT: popq %r1475; TLSDESC-NEXT: popq %rbp76; TLSDESC-NEXT: retq77entry:78 %addr = tail call ptr @llvm.threadlocal.address.p0(ptr @foo_local)79 %load0 = load i32, ptr %addr, align 480 %cond = icmp eq i32 %arg0, 081 br i1 %cond, label %if.then, label %if.end82 83if.then:84 tail call void @effect()85 %x = add i64 %arg1, 4286 %addr1 = getelementptr inbounds i32, ptr %addr, i64 %x87 %load1 = load i32, ptr %addr1, align 488 br label %if.end89 90if.end:91 %phi = phi i32 [ %load1, %if.then ], [ %load0, %entry ]92 %ret = add i32 %phi, %load093 ret i32 %ret94}95 96@foo_nonlocal = thread_local global i32 0, align 497 98define i32 @func_nonlocal_tls(i32 %arg0, i64 %arg1) nounwind {99; NOPIC-LABEL: func_nonlocal_tls:100; NOPIC: # %bb.0: # %entry101; NOPIC-NEXT: pushq %rbp102; NOPIC-NEXT: pushq %r14103; NOPIC-NEXT: pushq %rbx104; NOPIC-NEXT: movq foo_nonlocal@GOTTPOFF(%rip), %r14105; NOPIC-NEXT: movl %fs:(%r14), %ebp106; NOPIC-NEXT: testl %edi, %edi107; NOPIC-NEXT: movl %ebp, %eax108; NOPIC-NEXT: jne .LBB1_2109; NOPIC-NEXT: # %bb.1: # %if.then110; NOPIC-NEXT: movq %rsi, %rbx111; NOPIC-NEXT: callq effect@PLT112; NOPIC-NEXT: movl %fs:168(%r14,%rbx,4), %eax113; NOPIC-NEXT: .LBB1_2: # %if.end114; NOPIC-NEXT: addl %ebp, %eax115; NOPIC-NEXT: popq %rbx116; NOPIC-NEXT: popq %r14117; NOPIC-NEXT: popq %rbp118; NOPIC-NEXT: retq119;120; PIC-LABEL: func_nonlocal_tls:121; PIC: # %bb.0: # %entry122; PIC-NEXT: pushq %rbp123; PIC-NEXT: pushq %r15124; PIC-NEXT: pushq %r14125; PIC-NEXT: pushq %rbx126; PIC-NEXT: pushq %rax127; PIC-NEXT: movq %rsi, %rbx128; PIC-NEXT: movl %edi, %ebp129; PIC-NEXT: data16130; PIC-NEXT: leaq foo_nonlocal@TLSGD(%rip), %rdi131; PIC-NEXT: data16132; PIC-NEXT: data16133; PIC-NEXT: rex64134; PIC-NEXT: callq __tls_get_addr@PLT135; PIC-NEXT: movq %rax, %r14136; PIC-NEXT: movl (%rax), %r15d137; PIC-NEXT: testl %ebp, %ebp138; PIC-NEXT: movl %r15d, %eax139; PIC-NEXT: jne .LBB1_2140; PIC-NEXT: # %bb.1: # %if.then141; PIC-NEXT: callq effect@PLT142; PIC-NEXT: movl 168(%r14,%rbx,4), %eax143; PIC-NEXT: .LBB1_2: # %if.end144; PIC-NEXT: addl %r15d, %eax145; PIC-NEXT: addq $8, %rsp146; PIC-NEXT: popq %rbx147; PIC-NEXT: popq %r14148; PIC-NEXT: popq %r15149; PIC-NEXT: popq %rbp150; PIC-NEXT: retq151;152; TLSDESC-LABEL: func_nonlocal_tls:153; TLSDESC: # %bb.0: # %entry154; TLSDESC-NEXT: pushq %rbp155; TLSDESC-NEXT: pushq %r14156; TLSDESC-NEXT: pushq %rbx157; TLSDESC-NEXT: leaq foo_nonlocal@tlsdesc(%rip), %rax158; TLSDESC-NEXT: callq *foo_nonlocal@tlscall(%rax)159; TLSDESC-NEXT: movl %fs:(%rax), %ebp160; TLSDESC-NEXT: testl %edi, %edi161; TLSDESC-NEXT: movl %ebp, %ecx162; TLSDESC-NEXT: jne .LBB1_2163; TLSDESC-NEXT: # %bb.1: # %if.then164; TLSDESC-NEXT: movq %rsi, %rbx165; TLSDESC-NEXT: addq %fs:0, %rax166; TLSDESC-NEXT: movq %rax, %r14167; TLSDESC-NEXT: callq effect@PLT168; TLSDESC-NEXT: movl 168(%r14,%rbx,4), %ecx169; TLSDESC-NEXT: .LBB1_2: # %if.end170; TLSDESC-NEXT: addl %ebp, %ecx171; TLSDESC-NEXT: movl %ecx, %eax172; TLSDESC-NEXT: popq %rbx173; TLSDESC-NEXT: popq %r14174; TLSDESC-NEXT: popq %rbp175; TLSDESC-NEXT: retq176entry:177 %addr = tail call ptr @llvm.threadlocal.address.p0(ptr @foo_nonlocal)178 %load0 = load i32, ptr %addr, align 4179 %cond = icmp eq i32 %arg0, 0180 br i1 %cond, label %if.then, label %if.end181 182if.then:183 tail call void @effect()184 %x = add i64 %arg1, 42185 %addr1 = getelementptr inbounds i32, ptr %addr, i64 %x186 %load1 = load i32, ptr %addr1, align 4187 br label %if.end188 189if.end:190 %phi = phi i32 [ %load1, %if.then ], [ %load0, %entry ]191 %ret = add i32 %phi, %load0192 ret i32 %ret193}194