brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.0 KiB · 0ca1da2 Raw
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