1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 20:23:11 +01:00
llvm-mirror/test/CodeGen/PowerPC/cxx_tlscc64.ll
Sean Fertile 3cacc63c8a [PowerPC] Remove support for SplitCSR.
SplitCSR was only suppored for functions with CXX_FAST_TLS calling
convention. Clang only emits that calling convention for Darwin which is
no longer supported by the PowerPC backend. Another IR producer could
use the calling convention, but considering the calling convention is
meant to be an optimization and the codegen for SplitCSR can be
attrocious on Power (see the modifed lit test) it is best to remove it
and codegen CXX_FAST_TLS same as the C calling convention.

Differential Revision: https://reviews.llvm.org/D79018
2020-05-14 10:32:17 -04:00

80 lines
2.7 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
; RUN: llc -relocation-model=static -verify-machineinstrs < %s --enable-shrink-wrap=false -mtriple=powerpc64le-unknown-linux-gnu | FileCheck %s
%struct.S = type { i8 }
@sg = internal thread_local global %struct.S zeroinitializer, align 1
@__dso_handle = external global i8
@__tls_guard = internal thread_local unnamed_addr global i1 false
@sum1 = internal thread_local global i32 0, align 4
declare void @_ZN1SC1Ev(%struct.S*)
declare void @_ZN1SD1Ev(%struct.S*)
declare i32 @_tlv_atexit(void (i8*)*, i8*, i8*)
define cxx_fast_tlscc nonnull %struct.S* @_ZTW2sg() nounwind {
; CHECK-LABEL: _ZTW2sg:
; CHECK: # %bb.0:
; CHECK-NEXT: mflr 0
; CHECK-NEXT: std 30, -16(1) # 8-byte Folded Spill
; CHECK-NEXT: std 0, 16(1)
; CHECK-NEXT: stdu 1, -48(1)
; CHECK-NEXT: addis 3, 13, __tls_guard@tprel@ha
; CHECK-NEXT: lbz 4, __tls_guard@tprel@l(3)
; CHECK-NEXT: andi. 4, 4, 1
; CHECK-NEXT: bc 12, 1, .LBB0_2
; CHECK-NEXT: # %bb.1: # %init.i
; CHECK-NEXT: li 4, 1
; CHECK-NEXT: stb 4, __tls_guard@tprel@l(3)
; CHECK-NEXT: addis 3, 13, sg@tprel@ha
; CHECK-NEXT: addi 30, 3, sg@tprel@l
; CHECK-NEXT: mr 3, 30
; CHECK-NEXT: bl _ZN1SC1Ev
; CHECK-NEXT: nop
; CHECK-NEXT: addis 3, 2, .LC0@toc@ha
; CHECK-NEXT: addis 4, 2, .LC1@toc@ha
; CHECK-NEXT: ld 3, .LC0@toc@l(3)
; CHECK-NEXT: ld 5, .LC1@toc@l(4)
; CHECK-NEXT: mr 4, 30
; CHECK-NEXT: bl _tlv_atexit
; CHECK-NEXT: nop
; CHECK-NEXT: .LBB0_2: # %__tls_init.exit
; CHECK-NEXT: addis 3, 13, sg@tprel@ha
; CHECK-NEXT: addi 3, 3, sg@tprel@l
; CHECK-NEXT: addi 1, 1, 48
; CHECK-NEXT: ld 0, 16(1)
; CHECK-NEXT: ld 30, -16(1) # 8-byte Folded Reload
; CHECK-NEXT: mtlr 0
; CHECK-NEXT: blr
%.b.i = load i1, i1* @__tls_guard, align 1
br i1 %.b.i, label %__tls_init.exit, label %init.i
init.i:
store i1 true, i1* @__tls_guard, align 1
tail call void @_ZN1SC1Ev(%struct.S* nonnull @sg) #2
%1 = tail call i32 @_tlv_atexit(void (i8*)* nonnull bitcast (void (%struct.S*)* @_ZN1SD1Ev to void (i8*)*), i8* nonnull getelementptr inbounds (%struct.S, %struct.S* @sg, i64 0, i32 0), i8* nonnull @__dso_handle) #2
br label %__tls_init.exit
__tls_init.exit:
ret %struct.S* @sg
}
define cxx_fast_tlscc nonnull i32* @_ZTW4sum1() nounwind {
; CHECK-LABEL: _ZTW4sum1:
; CHECK: # %bb.0:
; CHECK-NEXT: addis 3, 13, sum1@tprel@ha
; CHECK-NEXT: addi 3, 3, sum1@tprel@l
; CHECK-NEXT: blr
ret i32* @sum1
}
define cxx_fast_tlscc i32* @_ZTW4sum2() #0 {
; CHECK-LABEL: _ZTW4sum2:
; CHECK: # %bb.0:
; CHECK-NEXT: addis 3, 13, sum1@tprel@ha
; CHECK-NEXT: addi 3, 3, sum1@tprel@l
; CHECK-NEXT: blr
ret i32* @sum1
}
attributes #0 = { nounwind "frame-pointer"="all" }