brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.7 KiB · 21367aa Raw
251 lines · plain
1; RUN: llc < %s -mtriple=aarch64-apple-ios | FileCheck %s2; RUN: llc < %s -mtriple=aarch64-apple-ios -enable-shrink-wrap=true | FileCheck %s3; Shrink wrapping currently does not kick in because we have a TLS CALL4; in the entry block and it will clobber the link register.5 6; RUN: llc < %s -mtriple=aarch64-apple-ios -O0 -fast-isel | FileCheck --check-prefix=CHECK-O0 %s7 8%struct.S = type { i8 }9 10@sg = internal thread_local global %struct.S zeroinitializer, align 111@__dso_handle = external global i812@__tls_guard = internal thread_local unnamed_addr global i1 false13@sum1 = internal thread_local global i32 0, align 414 15declare ptr @_ZN1SC1Ev(ptr returned)16declare ptr @_ZN1SD1Ev(ptr returned)17declare i32 @_tlv_atexit(ptr, ptr, ptr)18 19define cxx_fast_tlscc nonnull ptr @_ZTW2sg() nounwind {20  %.b.i = load i1, ptr @__tls_guard, align 121  br i1 %.b.i, label %__tls_init.exit, label %init.i22 23init.i:24  store i1 true, ptr @__tls_guard, align 125  %call.i.i = tail call ptr @_ZN1SC1Ev(ptr nonnull @sg)26  %1 = tail call i32 @_tlv_atexit(ptr nonnull @_ZN1SD1Ev, ptr nonnull @sg, ptr nonnull @__dso_handle)27  br label %__tls_init.exit28 29__tls_init.exit:30  ret ptr @sg31}32 33; CHECK-LABEL: _ZTW2sg34; CHECK-NOT: stp d31, d3035; CHECK-NOT: stp d29, d2836; CHECK-NOT: stp d27, d2637; CHECK-NOT: stp d25, d2438; CHECK-NOT: stp d23, d2239; CHECK-NOT: stp d21, d2040; CHECK-NOT: stp d19, d1841; CHECK-NOT: stp d17, d1642; CHECK-NOT: stp d7, d643; CHECK-NOT: stp d5, d444; CHECK-NOT: stp d3, d245; CHECK-NOT: stp d1, d046; CHECK-NOT: stp x20, x1947; FIXME: The splitting logic in the register allocator fails to split along48;        control flow here, we used to get this right by accident before...49; CHECK-NOTXX: stp x14, x1350; CHECK-NOT: stp x12, x1151; CHECK-NOT: stp x10, x952; CHECK-NOT: stp x8, x753; CHECK-NOT: stp x6, x554; CHECK-NOT: stp x4, x355; CHECK-NOT: stp x2, x156; CHECK: blr57; CHECK: tbnz w{{.*}}, #0, [[BB_end:.?LBB0_[0-9]+]]58; CHECK: blr59; CHECK: tlv_atexit60; CHECK: [[BB_end]]:61; CHECK: blr62; CHECK-NOT: ldp x2, x163; CHECK-NOT: ldp x4, x364; CHECK-NOT: ldp x6, x565; CHECK-NOT: ldp x8, x766; CHECK-NOT: ldp x10, x967; CHECK-NOT: ldp x12, x1168; CHECK-NOTXX: ldp x14, x1369; CHECK-NOT: ldp x20, x1970; CHECK-NOT: ldp d1, d071; CHECK-NOT: ldp d3, d272; CHECK-NOT: ldp d5, d473; CHECK-NOT: ldp d7, d674; CHECK-NOT: ldp d17, d1675; CHECK-NOT: ldp d19, d1876; CHECK-NOT: ldp d21, d2077; CHECK-NOT: ldp d23, d2278; CHECK-NOT: ldp d25, d2479; CHECK-NOT: ldp d27, d2680; CHECK-NOT: ldp d29, d2881; CHECK-NOT: ldp d31, d3082 83; CHECK-O0-LABEL: _ZTW2sg84; CHECK-O0: stp d31, d3085; CHECK-O0: stp d29, d2886; CHECK-O0: stp d27, d2687; CHECK-O0: stp d25, d2488; CHECK-O0: stp d23, d2289; CHECK-O0: stp d21, d2090; CHECK-O0: stp d19, d1891; CHECK-O0: stp d17, d1692; CHECK-O0: stp d7, d693; CHECK-O0: stp d5, d494; CHECK-O0: stp d3, d295; CHECK-O0: stp d1, d096; CHECK-O0: str x1497; CHECK-O0: stp x13, x1298; CHECK-O0: stp x11, x1099; CHECK-O0: stp x8, x7100; CHECK-O0: stp x6, x5101; CHECK-O0: stp x4, x3102; CHECK-O0: stp x2, x1103; CHECK-O0: blr104; CHECK-O0: tbnz w{{.*}}, #0, [[BB_end:.?LBB0_[0-9]+]]105; CHECK-O0: blr106; CHECK-O0: tlv_atexit107; CHECK-O0: [[BB_end]]:108; CHECK-O0: blr109; CHECK-O0: ldp x2, x1110; CHECK-O0: ldp x4, x3111; CHECK-O0: ldp x6, x5112; CHECK-O0: ldp x8, x7113; CHECK-O0: ldp x11, x10114; CHECK-O0: ldp x13, x12115; CHECK-O0: ldr x14116; CHECK-O0: ldp d1, d0117; CHECK-O0: ldp d3, d2118; CHECK-O0: ldp d5, d4119; CHECK-O0: ldp d7, d6120; CHECK-O0: ldp d17, d16121; CHECK-O0: ldp d19, d18122; CHECK-O0: ldp d21, d20123; CHECK-O0: ldp d23, d22124; CHECK-O0: ldp d25, d24125; CHECK-O0: ldp d27, d26126; CHECK-O0: ldp d29, d28127; CHECK-O0: ldp d31, d30128 129; CHECK-LABEL: _ZTW4sum1130; CHECK-NOT: stp d31, d30131; CHECK-NOT: stp d29, d28132; CHECK-NOT: stp d27, d26133; CHECK-NOT: stp d25, d24134; CHECK-NOT: stp d23, d22135; CHECK-NOT: stp d21, d20136; CHECK-NOT: stp d19, d18137; CHECK-NOT: stp d17, d16138; CHECK-NOT: stp d7, d6139; CHECK-NOT: stp d5, d4140; CHECK-NOT: stp d3, d2141; CHECK-NOT: stp d1, d0142; CHECK-NOT: stp x20, x19143; CHECK-NOT: stp x14, x13144; CHECK-NOT: stp x12, x11145; CHECK-NOT: stp x10, x9146; CHECK-NOT: stp x8, x7147; CHECK-NOT: stp x6, x5148; CHECK-NOT: stp x4, x3149; CHECK-NOT: stp x2, x1150; CHECK: blr151 152; CHECK-O0-LABEL: _ZTW4sum1153; CHECK-O0-NOT: vstr154; CHECK-O0-NOT: vldr155define cxx_fast_tlscc nonnull ptr @_ZTW4sum1() nounwind {156  ret ptr @sum1157}158 159; Make sure at O0, we don't generate spilling/reloading of the CSRs.160; CHECK-O0-LABEL: tls_test2161; CHECK-O0-NOT: stp d31, d30162; CHECK-O0-NOT: stp d29, d28163; CHECK-O0-NOT: stp d27, d26164; CHECK-O0-NOT: stp d25, d24165; CHECK-O0-NOT: stp d23, d22166; CHECK-O0-NOT: stp d21, d20167; CHECK-O0-NOT: stp d19, d18168; CHECK-O0-NOT: stp d17, d16169; CHECK-O0-NOT: stp d7, d6170; CHECK-O0-NOT: stp d5, d4171; CHECK-O0-NOT: stp d3, d2172; CHECK-O0-NOT: stp d1, d0173; CHECK-O0-NOT: stp x20, x19174; CHECK-O0-NOT: stp x14, x13175; CHECK-O0-NOT: stp x12, x11176; CHECK-O0-NOT: stp x10, x9177; CHECK-O0-NOT: stp x8, x7178; CHECK-O0-NOT: stp x6, x5179; CHECK-O0-NOT: stp x4, x3180; CHECK-O0-NOT: stp x2, x1181; CHECK-O0: bl {{.*}}tls_helper182; CHECK-O0-NOT: ldp x2, x1183; CHECK-O0-NOT: ldp x4, x3184; CHECK-O0-NOT: ldp x6, x5185; CHECK-O0-NOT: ldp x8, x7186; CHECK-O0-NOT: ldp x10, x9187; CHECK-O0-NOT: ldp x12, x11188; CHECK-O0-NOT: ldp x14, x13189; CHECK-O0-NOT: ldp x20, x19190; CHECK-O0-NOT: ldp d1, d0191; CHECK-O0-NOT: ldp d3, d2192; CHECK-O0-NOT: ldp d5, d4193; CHECK-O0-NOT: ldp d7, d6194; CHECK-O0-NOT: ldp d17, d16195; CHECK-O0-NOT: ldp d19, d18196; CHECK-O0-NOT: ldp d21, d20197; CHECK-O0-NOT: ldp d23, d22198; CHECK-O0-NOT: ldp d25, d24199; CHECK-O0-NOT: ldp d27, d26200; CHECK-O0-NOT: ldp d29, d28201; CHECK-O0-NOT: ldp d31, d30202; CHECK-O0: ret203%class.C = type { i32 }204@tC = internal thread_local global %class.C zeroinitializer, align 4205declare cxx_fast_tlscc void @tls_helper()206define cxx_fast_tlscc ptr @tls_test2() #1 {207  call cxx_fast_tlscc void @tls_helper()208  ret ptr @tC209}210 211; Make sure we do not allow tail call when caller and callee have different212; calling conventions.213declare ptr @_ZN1CD1Ev(ptr readnone returned %this)214; CHECK-LABEL: tls_test215; CHECK: bl __tlv_atexit216define cxx_fast_tlscc void @__tls_test() {217entry:218  store i32 0, ptr @tC, align 4219  %0 = tail call i32 @_tlv_atexit(ptr @_ZN1CD1Ev, ptr @tC, ptr nonnull @__dso_handle) #1220  ret void221}222 223define cxx_fast_tlscc void @weird_prologue_regs(i32 %n) #1 {224; CHECK-LABEL: weird_prologue_regs:225; CHECK-NOT: str x9226; CHECK-NOT: stp{{.*}}x9{{.*}}[227; CHECK-NOT: str x19228; CHECK-NOT: stp{{.*}}x19{{.*}}[229 230; CHECK: sub x9, sp, #231; CHECK: and sp, x9, #0x232; CHECK: mov x19, sp233 234; CHECK-NOT: str x9235; CHECK-NOT: stp{{.*}}x9{{.*}}[236; CHECK-NOT: str x19237; CHECK-NOT: stp{{.*}}x19{{.*}}[238 239  %p0 = alloca i32, i32 200240  %p1 = alloca i32, align 32241  %p2 = alloca i32, i32 %n242  call void @callee(ptr %p0)243  call void @callee(ptr %p1)244  call void @callee(ptr %p2)245  ret void246}247declare void @callee(ptr)248 249attributes #0 = { nounwind "frame-pointer"="all" }250attributes #1 = { nounwind }251