diff options
author | Manman Ren <manman.ren@gmail.com> | 2016-03-18 23:38:49 +0000 |
---|---|---|
committer | Manman Ren <manman.ren@gmail.com> | 2016-03-18 23:38:49 +0000 |
commit | 2828c57b6f40a6d8a42ea6b72aedf39e58325764 (patch) | |
tree | 1dee52f3327a31a0e905d7b528a1cfb4d85f7571 /llvm/test/CodeGen/X86/cxx_tlscc64.ll | |
parent | 5e5d046a4f677a5099d01666f1411f1c0df2a036 (diff) | |
download | bcm5719-llvm-2828c57b6f40a6d8a42ea6b72aedf39e58325764.tar.gz bcm5719-llvm-2828c57b6f40a6d8a42ea6b72aedf39e58325764.zip |
[CXX_FAST_TLS] fix issues with O0 on ARM, AArch64 and X86.
Since at O0, explicit copies via SplitCSR may not be removed even if
they are unnecessary, we choose not to use SplitCSR at O0.
llvm-svn: 263855
Diffstat (limited to 'llvm/test/CodeGen/X86/cxx_tlscc64.ll')
-rw-r--r-- | llvm/test/CodeGen/X86/cxx_tlscc64.ll | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/llvm/test/CodeGen/X86/cxx_tlscc64.ll b/llvm/test/CodeGen/X86/cxx_tlscc64.ll index 6c8e45e42d1..149384549e9 100644 --- a/llvm/test/CodeGen/X86/cxx_tlscc64.ll +++ b/llvm/test/CodeGen/X86/cxx_tlscc64.ll @@ -39,6 +39,27 @@ declare i32 @_tlv_atexit(void (i8*)*, i8*, i8*) ; CHECK-NOT: popq %r9 ; CHECK-NOT: popq %r10 ; CHECK-NOT: popq %r11 + +; CHECK-O0-LABEL: _ZTW2sg +; CHECK-O0: pushq %r11 +; CHECK-O0: pushq %r10 +; CHECK-O0: pushq %r9 +; CHECK-O0: pushq %r8 +; CHECK-O0: pushq %rsi +; CHECK-O0: pushq %rdx +; CHECK-O0: pushq %rcx +; CHECK-O0: callq +; CHECK-O0: jne +; CHECK-O0: callq +; CHECK-O0: tlv_atexit +; CHECK-O0: callq +; CHECK-O0: popq %rcx +; CHECK-O0: popq %rdx +; CHECK-O0: popq %rsi +; CHECK-O0: popq %r8 +; CHECK-O0: popq %r9 +; CHECK-O0: popq %r10 +; CHECK-O0: popq %r11 define cxx_fast_tlscc nonnull %struct.S* @_ZTW2sg() nounwind { %.b.i = load i1, i1* @__tls_guard, align 1 br i1 %.b.i, label %__tls_init.exit, label %init.i @@ -63,6 +84,24 @@ __tls_init.exit: ; CHECK-NOT: pushq %rcx ; CHECK-NOT: pushq %rbx ; CHECK: callq +; CHECK-O0-LABEL: _ZTW4sum1 +; CHECK-O0-NOT: pushq %r11 +; CHECK-O0-NOT: pushq %r10 +; CHECK-O0-NOT: pushq %r9 +; CHECK-O0-NOT: pushq %r8 +; CHECK-O0-NOT: pushq %rsi +; CHECK-O0-NOT: pushq %rdx +; CHECK-O0-NOT: pushq %rcx +; CHECK-O0-NOT: pushq %rbx +; CHECK-O0-NOT: movq %r11 +; CHECK-O0-NOT: movq %r10 +; CHECK-O0-NOT: movq %r9 +; CHECK-O0-NOT: movq %r8 +; CHECK-O0-NOT: movq %rsi +; CHECK-O0-NOT: movq %rdx +; CHECK-O0-NOT: movq %rcx +; CHECK-O0-NOT: movq %rbx +; CHECK-O0: callq define cxx_fast_tlscc nonnull i32* @_ZTW4sum1() nounwind { ret i32* @sum1 } @@ -76,4 +115,28 @@ define cxx_fast_tlscc i32* @_ZTW4sum2() #0 { ret i32* @sum1 } +; Make sure at O0, we don't generate spilling/reloading of the CSRs. +; CHECK-O0-LABEL: tls_test2 +; CHECK-O0-NOT: pushq %r11 +; CHECK-O0-NOT: pushq %r10 +; CHECK-O0-NOT: pushq %r9 +; CHECK-O0-NOT: pushq %r8 +; CHECK-O0-NOT: pushq %rsi +; CHECK-O0-NOT: pushq %rdx +; CHECK-O0: callq {{.*}}tls_helper +; CHECK-O0-NOT: popq %rdx +; CHECK-O0-NOT: popq %rsi +; CHECK-O0-NOT: popq %r8 +; CHECK-O0-NOT: popq %r9 +; CHECK-O0-NOT: popq %r10 +; CHECK-O0-NOT: popq %r11 +; CHECK-O0: ret +%class.C = type { i32 } +@tC = internal thread_local global %class.C zeroinitializer, align 4 +declare cxx_fast_tlscc void @tls_helper() +define cxx_fast_tlscc %class.C* @tls_test2() #1 { + call cxx_fast_tlscc void @tls_helper() + ret %class.C* @tC +} attributes #0 = { nounwind "no-frame-pointer-elim"="true" } +attributes #1 = { nounwind } |