brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.0 KiB · d0c835f Raw
153 lines · plain
1; RUN: llc < %s -mtriple=armv7k-apple-watchos2.0 | FileCheck %s2; RUN: llc < %s -mtriple=armv7k-apple-watchos2.0 -enable-shrink-wrap=true | FileCheck %s3; RUN: llc < %s -mtriple=armv7-apple-ios8.0 | FileCheck %s4; RUN: llc < %s -mtriple=armv7-apple-ios8.0 -enable-shrink-wrap=true | FileCheck %s5 6; RUN: llc < %s -mtriple=armv7k-apple-watchos2.0 -O0 | FileCheck --check-prefix=CHECK-O0 --check-prefix=WATCH-O0 %s7; RUN: llc < %s -mtriple=armv7-apple-ios8.0 -O0 | FileCheck --check-prefix=CHECK-O0 --check-prefix=IOS-O0 %s8 9; RUN: llc < %s -mtriple=thumbv7-apple-ios8.0 | FileCheck --check-prefix=THUMB %s10 11%struct.S = type { i8 }12 13@sg = internal thread_local global %struct.S zeroinitializer, align 114@__dso_handle = external global i815@__tls_guard = internal thread_local unnamed_addr global i1 false16@sum1 = internal thread_local global i32 0, align 417 18%class.C = type { i32 }19@tC = internal thread_local global %class.C zeroinitializer, align 420 21declare ptr @_ZN1SC1Ev(ptr returned)22declare ptr @_ZN1SD1Ev(ptr returned)23declare i32 @_tlv_atexit(ptr, ptr, ptr)24 25; Make sure Epilog does not overwrite an explicitly-handled CSR in CXX_FAST_TLS.26; THUMB-LABEL: _ZTW2sg27; THUMB: push {{.*}}lr28; THUMB: blx29; THUMB: bne{{(.w)?}} [[TH_end:.?LBB0_[0-9]+]]30; THUMB: blx31; THUMB: tlv_atexit32; THUMB: [[TH_end]]:33; THUMB: blx34; THUMB: r435; THUMB: pop {{.*}}r436define cxx_fast_tlscc nonnull ptr @_ZTW2sg() nounwind "frame-pointer"="all" {37  %.b.i = load i1, ptr @__tls_guard, align 138  br i1 %.b.i, label %__tls_init.exit, label %init.i39 40init.i:41  store i1 true, ptr @__tls_guard, align 142  %call.i.i = tail call ptr @_ZN1SC1Ev(ptr nonnull @sg)43  %1 = tail call i32 @_tlv_atexit(ptr nonnull @_ZN1SD1Ev, ptr nonnull @sg, ptr nonnull @__dso_handle)44  br label %__tls_init.exit45 46__tls_init.exit:47  ret ptr @sg48}49 50; CHECK-LABEL: _ZTW2sg51; CHECK: push {r4, r5, r7, lr}52; CHECK: push {r11, r12}53; CHECK-NOT: vpush {d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31}54; CHECK-NOT: vpush {d0, d1, d2, d3, d4, d5, d6, d7}55; CHECK: blx56; CHECK: bne [[BB_end:.?LBB0_[0-9]+]]57; CHECK: blx58; CHECK: tlv_atexit59; CHECK: [[BB_end]]:60; CHECK: blx61; CHECK-NOT: vpop {d0, d1, d2, d3, d4, d5, d6, d7}62; CHECK-NOT: vpop {d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31}63; CHECK-NOT: pop {r9, r12}64; CHECK-NOT: pop {r1, r2, r3, r4, r7, pc}65; CHECK: pop {r4, r5, r7, pc}66 67; CHECK-O0-LABEL: _ZTW2sg68; WATCH-O0: push {r1, r2, r3, r6, r7, lr}69; IOS-O0: push {r1, r2, r3, r7, lr}70; CHECK-O0: push {r9, r12}71; CHECK-O0: vpush {d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31}72; CHECK-O0: vpush {d0, d1, d2, d3, d4, d5, d6, d7}73; CHECK-O0: blx74; CHECK-O0: bne [[BB_end:.?LBB0_[0-9]+]]75; CHECK-O0: blx76; CHECK-O0: tlv_atexit77; CHECK-O0: [[BB_end]]:78; CHECK-O0: blx79; CHECK-O0: vpop {d0, d1, d2, d3, d4, d5, d6, d7}80; CHECK-O0: vpop {d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31}81; CHECK-O0: pop {r9, r12}82; WATCH-O0: pop {r1, r2, r3, r6, r7, pc}83; IOS-O0: pop {r1, r2, r3, r7, pc}84 85; CHECK-LABEL: _ZTW4sum186; CHECK-NOT: push {r1, r2, r3, r4, r7, lr}87; CHECK-NOT: push {r9, r12}88; CHECK-NOT: vpush {d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31}89; CHECK-NOT: vpush {d0, d1, d2, d3, d4, d5, d6, d7}90; CHECK: blx91 92; CHECK-O0-LABEL: _ZTW4sum193; CHECK-O0-NOT: vpush94; CHECK-O0-NOT: vstr95; CHECK-O0-NOT: vpop96; CHECK-O0-NOT: vldr97; CHECK-O0: pop98define cxx_fast_tlscc nonnull ptr @_ZTW4sum1() nounwind "frame-pointer"="all" {99  ret ptr @sum1100}101 102; Make sure at O0, we don't generate spilling/reloading of the CSRs.103; CHECK-O0-LABEL: tls_test2104; CHECK-O0: push105; CHECK-O0-NOT: vpush106; CHECK-O0-NOT: vstr107; CHECK-O0: tls_helper108; CHECK-O0-NOT: vpop109; CHECK-O0-NOT: vldr110; CHECK-O0: pop111declare cxx_fast_tlscc void @tls_helper()112define cxx_fast_tlscc ptr @tls_test2() #1 "frame-pointer"="all" {113  call cxx_fast_tlscc void @tls_helper()114  ret ptr @tC115}116 117; Make sure we do not allow tail call when caller and callee have different118; calling conventions.119declare ptr @_ZN1CD1Ev(ptr readnone returned %this)120; CHECK-LABEL: tls_test121; CHECK: bl __tlv_atexit122define cxx_fast_tlscc void @__tls_test() "frame-pointer"="all" {123entry:124  store i32 0, ptr @tC, align 4125  %0 = tail call i32 @_tlv_atexit(ptr @_ZN1CD1Ev, ptr @tC, ptr nonnull @__dso_handle) #1126  ret void127}128 129declare void @somefunc()130define cxx_fast_tlscc void @test_ccmismatch_notail() "frame-pointer"="all" {131; A tail call is not possible here because somefunc does not preserve enough132; registers.133; CHECK-LABEL: test_ccmismatch_notail:134; CHECK-NOT: b _somefunc135; CHECK: bl _somefunc136  tail call void @somefunc()137  ret void138}139 140declare cxx_fast_tlscc void @some_fast_tls_func()141define void @test_ccmismatch_tail() "frame-pointer"="all" {142; We can perform a tail call here because some_fast_tls_func preserves all143; necessary registers (and more).144; CHECK-LABEL: test_ccmismatch_tail:145; CHECK-NOT: bl _some_fast_tls_func146; CHECK: b _some_fast_tls_func147  tail call cxx_fast_tlscc void @some_fast_tls_func()148  ret void149}150 151attributes #0 = { nounwind "frame-pointer"="all" }152attributes #1 = { nounwind }153