106 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mtriple=sparc -relocation-model=pic < %s | FileCheck --check-prefix=SPARC %s3; RUN: llc -mtriple=sparc64 -relocation-model=pic < %s | FileCheck --check-prefix=SPARC64 %s4 5@x = external thread_local global i86 7;; Test that we don't over-allocate stack space when calling __tls_get_addr8;; with the call frame pseudos able to be eliminated.9define ptr @no_alloca() nounwind {10; SPARC-LABEL: no_alloca:11; SPARC: ! %bb.0: ! %entry12; SPARC-NEXT: save %sp, -96, %sp13; SPARC-NEXT: .Ltmp0:14; SPARC-NEXT: call .Ltmp115; SPARC-NEXT: .Ltmp2:16; SPARC-NEXT: sethi %hi(_GLOBAL_OFFSET_TABLE_+(.Ltmp2-.Ltmp0)), %i017; SPARC-NEXT: .Ltmp1:18; SPARC-NEXT: or %i0, %lo(_GLOBAL_OFFSET_TABLE_+(.Ltmp1-.Ltmp0)), %i019; SPARC-NEXT: add %i0, %o7, %i020; SPARC-NEXT: sethi %tgd_hi22(x), %i121; SPARC-NEXT: add %i1, %tgd_lo10(x), %i122; SPARC-NEXT: add %i0, %i1, %o0, %tgd_add(x)23; SPARC-NEXT: call __tls_get_addr, %tgd_call(x)24; SPARC-NEXT: nop25; SPARC-NEXT: ret26; SPARC-NEXT: restore %g0, %o0, %o027;28; SPARC64-LABEL: no_alloca:29; SPARC64: ! %bb.0: ! %entry30; SPARC64-NEXT: save %sp, -128, %sp31; SPARC64-NEXT: .Ltmp0:32; SPARC64-NEXT: rd %pc, %o733; SPARC64-NEXT: .Ltmp2:34; SPARC64-NEXT: sethi %hi(_GLOBAL_OFFSET_TABLE_+(.Ltmp2-.Ltmp0)), %i035; SPARC64-NEXT: .Ltmp1:36; SPARC64-NEXT: or %i0, %lo(_GLOBAL_OFFSET_TABLE_+(.Ltmp1-.Ltmp0)), %i037; SPARC64-NEXT: add %i0, %o7, %i038; SPARC64-NEXT: sethi %tgd_hi22(x), %i139; SPARC64-NEXT: add %i1, %tgd_lo10(x), %i140; SPARC64-NEXT: add %i0, %i1, %o0, %tgd_add(x)41; SPARC64-NEXT: call __tls_get_addr, %tgd_call(x)42; SPARC64-NEXT: nop43; SPARC64-NEXT: ret44; SPARC64-NEXT: restore %g0, %o0, %o045entry:46 %0 = call ptr @llvm.threadlocal.address.p0(ptr @x)47 ret ptr %048}49 50;; Test that %sp is valid for the call to __tls_get_addr. We store to a dynamic51;; alloca in order to prevent eliminating any call frame pseudos from the call.52define ptr @dynamic_alloca(i64 %n) nounwind {53; SPARC-LABEL: dynamic_alloca:54; SPARC: ! %bb.0: ! %entry55; SPARC-NEXT: save %sp, -96, %sp56; SPARC-NEXT: .Ltmp3:57; SPARC-NEXT: call .Ltmp458; SPARC-NEXT: .Ltmp5:59; SPARC-NEXT: sethi %hi(_GLOBAL_OFFSET_TABLE_+(.Ltmp5-.Ltmp3)), %i060; SPARC-NEXT: .Ltmp4:61; SPARC-NEXT: or %i0, %lo(_GLOBAL_OFFSET_TABLE_+(.Ltmp4-.Ltmp3)), %i062; SPARC-NEXT: add %i0, %o7, %i063; SPARC-NEXT: sethi %tgd_hi22(x), %i264; SPARC-NEXT: add %i2, %tgd_lo10(x), %i265; SPARC-NEXT: add %i0, %i2, %o0, %tgd_add(x)66; SPARC-NEXT: call __tls_get_addr, %tgd_call(x)67; SPARC-NEXT: nop68; SPARC-NEXT: add %i1, 7, %i069; SPARC-NEXT: and %i0, -8, %i070; SPARC-NEXT: sub %sp, %i0, %i071; SPARC-NEXT: add %i0, -8, %sp72; SPARC-NEXT: mov 1, %i173; SPARC-NEXT: stb %i1, [%i0+88]74; SPARC-NEXT: ret75; SPARC-NEXT: restore %g0, %o0, %o076;77; SPARC64-LABEL: dynamic_alloca:78; SPARC64: ! %bb.0: ! %entry79; SPARC64-NEXT: save %sp, -128, %sp80; SPARC64-NEXT: .Ltmp3:81; SPARC64-NEXT: rd %pc, %o782; SPARC64-NEXT: .Ltmp5:83; SPARC64-NEXT: sethi %hi(_GLOBAL_OFFSET_TABLE_+(.Ltmp5-.Ltmp3)), %i184; SPARC64-NEXT: .Ltmp4:85; SPARC64-NEXT: or %i1, %lo(_GLOBAL_OFFSET_TABLE_+(.Ltmp4-.Ltmp3)), %i186; SPARC64-NEXT: add %i1, %o7, %i187; SPARC64-NEXT: sethi %tgd_hi22(x), %i288; SPARC64-NEXT: add %i2, %tgd_lo10(x), %i289; SPARC64-NEXT: add %i1, %i2, %o0, %tgd_add(x)90; SPARC64-NEXT: call __tls_get_addr, %tgd_call(x)91; SPARC64-NEXT: nop92; SPARC64-NEXT: add %i0, 15, %i093; SPARC64-NEXT: and %i0, -16, %i094; SPARC64-NEXT: sub %sp, %i0, %i095; SPARC64-NEXT: mov %i0, %sp96; SPARC64-NEXT: mov 1, %i197; SPARC64-NEXT: stb %i1, [%i0+2175]98; SPARC64-NEXT: ret99; SPARC64-NEXT: restore %g0, %o0, %o0100entry:101 %0 = call ptr @llvm.threadlocal.address.p0(ptr @x)102 %1 = alloca i8, i64 %n103 store i8 1, ptr %1104 ret ptr %0105}106