287 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -relocation-model=pic < %s \3; RUN: | FileCheck -check-prefix=RV32-PIC %s4; RUN: llc -mtriple=riscv32 -relocation-model=pic < %s -enable-tlsdesc \5; RUN: | FileCheck -check-prefix=RV32-PIC-TLSDESC %s6; RUN: llc -mtriple=riscv64 -relocation-model=pic < %s \7; RUN: | FileCheck -check-prefix=RV64-PIC %s8; RUN: llc -mtriple=riscv64 -relocation-model=pic -enable-tlsdesc < %s \9; RUN: | FileCheck -check-prefix=RV64-PIC-TLSDESC %s10; RUN: llc -mtriple=riscv32 < %s | FileCheck -check-prefix=RV32-NOPIC %s11; RUN: llc -mtriple=riscv32 < %s -enable-tlsdesc | FileCheck -check-prefix=RV32-NOPIC-TLSDESC %s12; RUN: llc -mtriple=riscv64 < %s | FileCheck -check-prefix=RV64-NOPIC %s13; RUN: llc -mtriple=riscv64 < %s -enable-tlsdesc | FileCheck -check-prefix=RV64-NOPIC-TLSDESC %s14 15; Check that TLS symbols are lowered correctly based on the specified16; model. Make sure they're external to avoid them all being optimised to Local17; Exec for the executable.18 19@unspecified = external thread_local global i3220@ld = external thread_local(localdynamic) global i3221@ie = external thread_local(initialexec) global i3222@le = external thread_local(localexec) global i3223 24 25; No model specified26 27define ptr @f1() nounwind {28; RV32-PIC-LABEL: f1:29; RV32-PIC: # %bb.0: # %entry30; RV32-PIC-NEXT: addi sp, sp, -1631; RV32-PIC-NEXT: sw ra, 12(sp) # 4-byte Folded Spill32; RV32-PIC-NEXT: .Lpcrel_hi0:33; RV32-PIC-NEXT: auipc a0, %tls_gd_pcrel_hi(unspecified)34; RV32-PIC-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi0)35; RV32-PIC-NEXT: call __tls_get_addr36; RV32-PIC-NEXT: lw ra, 12(sp) # 4-byte Folded Reload37; RV32-PIC-NEXT: addi sp, sp, 1638; RV32-PIC-NEXT: ret39;40; RV64-PIC-LABEL: f1:41; RV64-PIC: # %bb.0: # %entry42; RV64-PIC-NEXT: addi sp, sp, -1643; RV64-PIC-NEXT: sd ra, 8(sp) # 8-byte Folded Spill44; RV64-PIC-NEXT: .Lpcrel_hi0:45; RV64-PIC-NEXT: auipc a0, %tls_gd_pcrel_hi(unspecified)46; RV64-PIC-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi0)47; RV64-PIC-NEXT: call __tls_get_addr48; RV64-PIC-NEXT: ld ra, 8(sp) # 8-byte Folded Reload49; RV64-PIC-NEXT: addi sp, sp, 1650; RV64-PIC-NEXT: ret51;52; RV32-NOPIC-LABEL: f1:53; RV32-NOPIC: # %bb.0: # %entry54; RV32-NOPIC-NEXT: .Lpcrel_hi0:55; RV32-NOPIC-NEXT: auipc a0, %tls_ie_pcrel_hi(unspecified)56; RV32-NOPIC-NEXT: lw a0, %pcrel_lo(.Lpcrel_hi0)(a0)57; RV32-NOPIC-NEXT: add a0, a0, tp58; RV32-NOPIC-NEXT: ret59;60; RV64-NOPIC-LABEL: f1:61; RV64-NOPIC: # %bb.0: # %entry62; RV64-NOPIC-NEXT: .Lpcrel_hi0:63; RV64-NOPIC-NEXT: auipc a0, %tls_ie_pcrel_hi(unspecified)64; RV64-NOPIC-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi0)(a0)65; RV64-NOPIC-NEXT: add a0, a0, tp66; RV64-NOPIC-NEXT: ret67;68; RV32-PIC-TLSDESC-LABEL: f1:69; RV32-PIC-TLSDESC: # %bb.0: # %entry70; RV32-PIC-TLSDESC-NEXT: .Ltlsdesc_hi0:71; RV32-PIC-TLSDESC-NEXT: auipc a0, %tlsdesc_hi(unspecified)72; RV32-PIC-TLSDESC-NEXT: lw a1, %tlsdesc_load_lo(.Ltlsdesc_hi0)(a0)73; RV32-PIC-TLSDESC-NEXT: addi a0, a0, %tlsdesc_add_lo(.Ltlsdesc_hi0)74; RV32-PIC-TLSDESC-NEXT: jalr t0, 0(a1), %tlsdesc_call(.Ltlsdesc_hi0)75; RV32-PIC-TLSDESC-NEXT: add a0, a0, tp76; RV32-PIC-TLSDESC-NEXT: ret77;78; RV64-PIC-TLSDESC-LABEL: f1:79; RV64-PIC-TLSDESC: # %bb.0: # %entry80; RV64-PIC-TLSDESC-NEXT: .Ltlsdesc_hi0:81; RV64-PIC-TLSDESC-NEXT: auipc a0, %tlsdesc_hi(unspecified)82; RV64-PIC-TLSDESC-NEXT: ld a1, %tlsdesc_load_lo(.Ltlsdesc_hi0)(a0)83; RV64-PIC-TLSDESC-NEXT: addi a0, a0, %tlsdesc_add_lo(.Ltlsdesc_hi0)84; RV64-PIC-TLSDESC-NEXT: jalr t0, 0(a1), %tlsdesc_call(.Ltlsdesc_hi0)85; RV64-PIC-TLSDESC-NEXT: add a0, a0, tp86; RV64-PIC-TLSDESC-NEXT: ret87;88; RV32-NOPIC-TLSDESC-LABEL: f1:89; RV32-NOPIC-TLSDESC: # %bb.0: # %entry90; RV32-NOPIC-TLSDESC-NEXT: .Lpcrel_hi0:91; RV32-NOPIC-TLSDESC-NEXT: auipc a0, %tls_ie_pcrel_hi(unspecified)92; RV32-NOPIC-TLSDESC-NEXT: lw a0, %pcrel_lo(.Lpcrel_hi0)(a0)93; RV32-NOPIC-TLSDESC-NEXT: add a0, a0, tp94; RV32-NOPIC-TLSDESC-NEXT: ret95;96; RV64-NOPIC-TLSDESC-LABEL: f1:97; RV64-NOPIC-TLSDESC: # %bb.0: # %entry98; RV64-NOPIC-TLSDESC-NEXT: .Lpcrel_hi0:99; RV64-NOPIC-TLSDESC-NEXT: auipc a0, %tls_ie_pcrel_hi(unspecified)100; RV64-NOPIC-TLSDESC-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi0)(a0)101; RV64-NOPIC-TLSDESC-NEXT: add a0, a0, tp102; RV64-NOPIC-TLSDESC-NEXT: ret103entry:104 ret ptr @unspecified105}106 107 108; localdynamic specified109 110define ptr @f2() nounwind {111; RV32-PIC-LABEL: f2:112; RV32-PIC: # %bb.0: # %entry113; RV32-PIC-NEXT: addi sp, sp, -16114; RV32-PIC-NEXT: sw ra, 12(sp) # 4-byte Folded Spill115; RV32-PIC-NEXT: .Lpcrel_hi1:116; RV32-PIC-NEXT: auipc a0, %tls_gd_pcrel_hi(ld)117; RV32-PIC-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi1)118; RV32-PIC-NEXT: call __tls_get_addr119; RV32-PIC-NEXT: lw ra, 12(sp) # 4-byte Folded Reload120; RV32-PIC-NEXT: addi sp, sp, 16121; RV32-PIC-NEXT: ret122;123; RV64-PIC-LABEL: f2:124; RV64-PIC: # %bb.0: # %entry125; RV64-PIC-NEXT: addi sp, sp, -16126; RV64-PIC-NEXT: sd ra, 8(sp) # 8-byte Folded Spill127; RV64-PIC-NEXT: .Lpcrel_hi1:128; RV64-PIC-NEXT: auipc a0, %tls_gd_pcrel_hi(ld)129; RV64-PIC-NEXT: addi a0, a0, %pcrel_lo(.Lpcrel_hi1)130; RV64-PIC-NEXT: call __tls_get_addr131; RV64-PIC-NEXT: ld ra, 8(sp) # 8-byte Folded Reload132; RV64-PIC-NEXT: addi sp, sp, 16133; RV64-PIC-NEXT: ret134;135; RV32-NOPIC-LABEL: f2:136; RV32-NOPIC: # %bb.0: # %entry137; RV32-NOPIC-NEXT: .Lpcrel_hi1:138; RV32-NOPIC-NEXT: auipc a0, %tls_ie_pcrel_hi(ld)139; RV32-NOPIC-NEXT: lw a0, %pcrel_lo(.Lpcrel_hi1)(a0)140; RV32-NOPIC-NEXT: add a0, a0, tp141; RV32-NOPIC-NEXT: ret142;143; RV64-NOPIC-LABEL: f2:144; RV64-NOPIC: # %bb.0: # %entry145; RV64-NOPIC-NEXT: .Lpcrel_hi1:146; RV64-NOPIC-NEXT: auipc a0, %tls_ie_pcrel_hi(ld)147; RV64-NOPIC-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi1)(a0)148; RV64-NOPIC-NEXT: add a0, a0, tp149; RV64-NOPIC-NEXT: ret150entry:151 ret ptr @ld152}153 154 155; initialexec specified156 157define ptr @f3() nounwind {158; RV32-PIC-LABEL: f3:159; RV32-PIC: # %bb.0: # %entry160; RV32-PIC-NEXT: .Lpcrel_hi2:161; RV32-PIC-NEXT: auipc a0, %tls_ie_pcrel_hi(ie)162; RV32-PIC-NEXT: lw a0, %pcrel_lo(.Lpcrel_hi2)(a0)163; RV32-PIC-NEXT: add a0, a0, tp164; RV32-PIC-NEXT: ret165;166; RV64-PIC-LABEL: f3:167; RV64-PIC: # %bb.0: # %entry168; RV64-PIC-NEXT: .Lpcrel_hi2:169; RV64-PIC-NEXT: auipc a0, %tls_ie_pcrel_hi(ie)170; RV64-PIC-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi2)(a0)171; RV64-PIC-NEXT: add a0, a0, tp172; RV64-PIC-NEXT: ret173;174; RV32-NOPIC-LABEL: f3:175; RV32-NOPIC: # %bb.0: # %entry176; RV32-NOPIC-NEXT: .Lpcrel_hi2:177; RV32-NOPIC-NEXT: auipc a0, %tls_ie_pcrel_hi(ie)178; RV32-NOPIC-NEXT: lw a0, %pcrel_lo(.Lpcrel_hi2)(a0)179; RV32-NOPIC-NEXT: add a0, a0, tp180; RV32-NOPIC-NEXT: ret181;182; RV64-NOPIC-LABEL: f3:183; RV64-NOPIC: # %bb.0: # %entry184; RV64-NOPIC-NEXT: .Lpcrel_hi2:185; RV64-NOPIC-NEXT: auipc a0, %tls_ie_pcrel_hi(ie)186; RV64-NOPIC-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi2)(a0)187; RV64-NOPIC-NEXT: add a0, a0, tp188; RV64-NOPIC-NEXT: ret189;190; RV32-PIC-TLSDESC-LABEL: f3:191; RV32-PIC-TLSDESC: # %bb.0: # %entry192; RV32-PIC-TLSDESC-NEXT: .Lpcrel_hi0:193; RV32-PIC-TLSDESC-NEXT: auipc a0, %tls_ie_pcrel_hi(ie)194; RV32-PIC-TLSDESC-NEXT: lw a0, %pcrel_lo(.Lpcrel_hi0)(a0)195; RV32-PIC-TLSDESC-NEXT: add a0, a0, tp196; RV32-PIC-TLSDESC-NEXT: ret197;198; RV64-PIC-TLSDESC-LABEL: f3:199; RV64-PIC-TLSDESC: # %bb.0: # %entry200; RV64-PIC-TLSDESC-NEXT: .Lpcrel_hi0:201; RV64-PIC-TLSDESC-NEXT: auipc a0, %tls_ie_pcrel_hi(ie)202; RV64-PIC-TLSDESC-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi0)(a0)203; RV64-PIC-TLSDESC-NEXT: add a0, a0, tp204; RV64-PIC-TLSDESC-NEXT: ret205;206; RV32-NOPIC-TLSDESC-LABEL: f3:207; RV32-NOPIC-TLSDESC: # %bb.0: # %entry208; RV32-NOPIC-TLSDESC-NEXT: .Lpcrel_hi2:209; RV32-NOPIC-TLSDESC-NEXT: auipc a0, %tls_ie_pcrel_hi(ie)210; RV32-NOPIC-TLSDESC-NEXT: lw a0, %pcrel_lo(.Lpcrel_hi2)(a0)211; RV32-NOPIC-TLSDESC-NEXT: add a0, a0, tp212; RV32-NOPIC-TLSDESC-NEXT: ret213;214; RV64-NOPIC-TLSDESC-LABEL: f3:215; RV64-NOPIC-TLSDESC: # %bb.0: # %entry216; RV64-NOPIC-TLSDESC-NEXT: .Lpcrel_hi2:217; RV64-NOPIC-TLSDESC-NEXT: auipc a0, %tls_ie_pcrel_hi(ie)218; RV64-NOPIC-TLSDESC-NEXT: ld a0, %pcrel_lo(.Lpcrel_hi2)(a0)219; RV64-NOPIC-TLSDESC-NEXT: add a0, a0, tp220; RV64-NOPIC-TLSDESC-NEXT: ret221entry:222 ret ptr @ie223}224 225 226; localexec specified227 228define ptr @f4() nounwind {229; RV32-PIC-LABEL: f4:230; RV32-PIC: # %bb.0: # %entry231; RV32-PIC-NEXT: lui a0, %tprel_hi(le)232; RV32-PIC-NEXT: add a0, a0, tp, %tprel_add(le)233; RV32-PIC-NEXT: addi a0, a0, %tprel_lo(le)234; RV32-PIC-NEXT: ret235;236; RV64-PIC-LABEL: f4:237; RV64-PIC: # %bb.0: # %entry238; RV64-PIC-NEXT: lui a0, %tprel_hi(le)239; RV64-PIC-NEXT: add a0, a0, tp, %tprel_add(le)240; RV64-PIC-NEXT: addi a0, a0, %tprel_lo(le)241; RV64-PIC-NEXT: ret242;243; RV32-NOPIC-LABEL: f4:244; RV32-NOPIC: # %bb.0: # %entry245; RV32-NOPIC-NEXT: lui a0, %tprel_hi(le)246; RV32-NOPIC-NEXT: add a0, a0, tp, %tprel_add(le)247; RV32-NOPIC-NEXT: addi a0, a0, %tprel_lo(le)248; RV32-NOPIC-NEXT: ret249;250; RV64-NOPIC-LABEL: f4:251; RV64-NOPIC: # %bb.0: # %entry252; RV64-NOPIC-NEXT: lui a0, %tprel_hi(le)253; RV64-NOPIC-NEXT: add a0, a0, tp, %tprel_add(le)254; RV64-NOPIC-NEXT: addi a0, a0, %tprel_lo(le)255; RV64-NOPIC-NEXT: ret256;257; RV32-PIC-TLSDESC-LABEL: f4:258; RV32-PIC-TLSDESC: # %bb.0: # %entry259; RV32-PIC-TLSDESC-NEXT: lui a0, %tprel_hi(le)260; RV32-PIC-TLSDESC-NEXT: add a0, a0, tp, %tprel_add(le)261; RV32-PIC-TLSDESC-NEXT: addi a0, a0, %tprel_lo(le)262; RV32-PIC-TLSDESC-NEXT: ret263;264; RV64-PIC-TLSDESC-LABEL: f4:265; RV64-PIC-TLSDESC: # %bb.0: # %entry266; RV64-PIC-TLSDESC-NEXT: lui a0, %tprel_hi(le)267; RV64-PIC-TLSDESC-NEXT: add a0, a0, tp, %tprel_add(le)268; RV64-PIC-TLSDESC-NEXT: addi a0, a0, %tprel_lo(le)269; RV64-PIC-TLSDESC-NEXT: ret270;271; RV32-NOPIC-TLSDESC-LABEL: f4:272; RV32-NOPIC-TLSDESC: # %bb.0: # %entry273; RV32-NOPIC-TLSDESC-NEXT: lui a0, %tprel_hi(le)274; RV32-NOPIC-TLSDESC-NEXT: add a0, a0, tp, %tprel_add(le)275; RV32-NOPIC-TLSDESC-NEXT: addi a0, a0, %tprel_lo(le)276; RV32-NOPIC-TLSDESC-NEXT: ret277;278; RV64-NOPIC-TLSDESC-LABEL: f4:279; RV64-NOPIC-TLSDESC: # %bb.0: # %entry280; RV64-NOPIC-TLSDESC-NEXT: lui a0, %tprel_hi(le)281; RV64-NOPIC-TLSDESC-NEXT: add a0, a0, tp, %tprel_add(le)282; RV64-NOPIC-TLSDESC-NEXT: addi a0, a0, %tprel_lo(le)283; RV64-NOPIC-TLSDESC-NEXT: ret284entry:285 ret ptr @le286}287