1; RUN: llc --mtriple=loongarch64 -mattr=+d --code-model=medium --relocation-model=pic --post-RA-scheduler=0 < %s \ 2; RUN: | FileCheck %s --check-prefix=MEDIUM_NO_SCH 3; RUN: llc --mtriple=loongarch64 -mattr=+d --code-model=medium --relocation-model=pic --post-RA-scheduler=1 < %s \ 4; RUN: | FileCheck %s --check-prefix=MEDIUM_SCH 5; RUN: llc --mtriple=loongarch64 -mattr=+d --code-model=large --relocation-model=pic --post-RA-scheduler=0 < %s \ 6; RUN: | FileCheck %s --check-prefix=LARGE_NO_SCH 7; RUN: llc --mtriple=loongarch64 -mattr=+d --code-model=large --relocation-model=pic --post-RA-scheduler=1 < %s \ 8; RUN: | FileCheck %s --check-prefix=LARGE_SCH 9; RUN: llc --mtriple=loongarch64 -mattr=+d --code-model=medium --relocation-model=pic --enable-tlsdesc \ 10; RUN: --post-RA-scheduler=0 < %s | FileCheck %s --check-prefix=MEDIUMDESC_NO_SCH 11; RUN: llc --mtriple=loongarch64 -mattr=+d --code-model=medium --relocation-model=pic --enable-tlsdesc \ 12; RUN: --post-RA-scheduler=1 < %s | FileCheck %s --check-prefix=MEDIUMDESC_SCH 13; RUN: llc --mtriple=loongarch64 -mattr=+d --code-model=large --relocation-model=pic --enable-tlsdesc \ 14; RUN: --post-RA-scheduler=0 < %s | FileCheck %s --check-prefix=LARGEDESC_NO_SCH 15; RUN: llc --mtriple=loongarch64 -mattr=+d --code-model=large --relocation-model=pic --enable-tlsdesc \ 16; RUN: --post-RA-scheduler=1 < %s | FileCheck %s --check-prefix=LARGEDESC_SCH 17 18@g = dso_local global i64 zeroinitializer, align 4 19@G = global i64 zeroinitializer, align 4 20@gd = external thread_local global i64 21@ld = external thread_local(localdynamic) global i64 22@ie = external thread_local(initialexec) global i64 23 24declare ptr @bar(i64) 25 26define void @foo() nounwind { 27; MEDIUM_NO_SCH-LABEL: foo: 28; MEDIUM_NO_SCH: # %bb.0: 29; MEDIUM_NO_SCH-NEXT: addi.d $sp, $sp, -16 30; MEDIUM_NO_SCH-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill 31; MEDIUM_NO_SCH-NEXT: pcalau12i $a0, %got_pc_hi20(G) 32; MEDIUM_NO_SCH-NEXT: ld.d $a0, $a0, %got_pc_lo12(G) 33; MEDIUM_NO_SCH-NEXT: ld.d $zero, $a0, 0 34; MEDIUM_NO_SCH-NEXT: pcalau12i $a0, %pc_hi20(.Lg$local) 35; MEDIUM_NO_SCH-NEXT: ld.d $zero, $a0, %pc_lo12(.Lg$local) 36; MEDIUM_NO_SCH-NEXT: ori $a0, $zero, 1 37; MEDIUM_NO_SCH-NEXT: pcaddu18i $ra, %call36(bar) 38; MEDIUM_NO_SCH-NEXT: jirl $ra, $ra, 0 39; MEDIUM_NO_SCH-NEXT: pcalau12i $a0, %gd_pc_hi20(gd) 40; MEDIUM_NO_SCH-NEXT: addi.d $a0, $a0, %got_pc_lo12(gd) 41; MEDIUM_NO_SCH-NEXT: pcaddu18i $ra, %call36(__tls_get_addr) 42; MEDIUM_NO_SCH-NEXT: jirl $ra, $ra, 0 43; MEDIUM_NO_SCH-NEXT: ld.d $zero, $a0, 0 44; MEDIUM_NO_SCH-NEXT: pcalau12i $a0, %ld_pc_hi20(ld) 45; MEDIUM_NO_SCH-NEXT: addi.d $a0, $a0, %got_pc_lo12(ld) 46; MEDIUM_NO_SCH-NEXT: pcaddu18i $ra, %call36(__tls_get_addr) 47; MEDIUM_NO_SCH-NEXT: jirl $ra, $ra, 0 48; MEDIUM_NO_SCH-NEXT: pcalau12i $a1, %ie_pc_hi20(ie) 49; MEDIUM_NO_SCH-NEXT: ld.d $a1, $a1, %ie_pc_lo12(ie) 50; MEDIUM_NO_SCH-NEXT: ld.d $zero, $a0, 0 51; MEDIUM_NO_SCH-NEXT: ldx.d $zero, $a1, $tp 52; MEDIUM_NO_SCH-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload 53; MEDIUM_NO_SCH-NEXT: addi.d $sp, $sp, 16 54; MEDIUM_NO_SCH-NEXT: ret 55; 56; MEDIUM_SCH-LABEL: foo: 57; MEDIUM_SCH: # %bb.0: 58; MEDIUM_SCH-NEXT: addi.d $sp, $sp, -16 59; MEDIUM_SCH-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill 60; MEDIUM_SCH-NEXT: pcalau12i $a0, %got_pc_hi20(G) 61; MEDIUM_SCH-NEXT: ld.d $a0, $a0, %got_pc_lo12(G) 62; MEDIUM_SCH-NEXT: ld.d $zero, $a0, 0 63; MEDIUM_SCH-NEXT: pcalau12i $a0, %pc_hi20(.Lg$local) 64; MEDIUM_SCH-NEXT: ld.d $zero, $a0, %pc_lo12(.Lg$local) 65; MEDIUM_SCH-NEXT: ori $a0, $zero, 1 66; MEDIUM_SCH-NEXT: pcaddu18i $ra, %call36(bar) 67; MEDIUM_SCH-NEXT: jirl $ra, $ra, 0 68; MEDIUM_SCH-NEXT: pcalau12i $a0, %gd_pc_hi20(gd) 69; MEDIUM_SCH-NEXT: addi.d $a0, $a0, %got_pc_lo12(gd) 70; MEDIUM_SCH-NEXT: pcaddu18i $ra, %call36(__tls_get_addr) 71; MEDIUM_SCH-NEXT: jirl $ra, $ra, 0 72; MEDIUM_SCH-NEXT: ld.d $zero, $a0, 0 73; MEDIUM_SCH-NEXT: pcalau12i $a0, %ld_pc_hi20(ld) 74; MEDIUM_SCH-NEXT: addi.d $a0, $a0, %got_pc_lo12(ld) 75; MEDIUM_SCH-NEXT: pcaddu18i $ra, %call36(__tls_get_addr) 76; MEDIUM_SCH-NEXT: jirl $ra, $ra, 0 77; MEDIUM_SCH-NEXT: pcalau12i $a1, %ie_pc_hi20(ie) 78; MEDIUM_SCH-NEXT: ld.d $zero, $a0, 0 79; MEDIUM_SCH-NEXT: ld.d $a1, $a1, %ie_pc_lo12(ie) 80; MEDIUM_SCH-NEXT: ldx.d $zero, $a1, $tp 81; MEDIUM_SCH-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload 82; MEDIUM_SCH-NEXT: addi.d $sp, $sp, 16 83; MEDIUM_SCH-NEXT: ret 84; 85; LARGE_NO_SCH-LABEL: foo: 86; LARGE_NO_SCH: # %bb.0: 87; LARGE_NO_SCH-NEXT: addi.d $sp, $sp, -16 88; LARGE_NO_SCH-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill 89; LARGE_NO_SCH-NEXT: pcalau12i $a0, %got_pc_hi20(G) 90; LARGE_NO_SCH-NEXT: addi.d $a1, $zero, %got_pc_lo12(G) 91; LARGE_NO_SCH-NEXT: lu32i.d $a1, %got64_pc_lo20(G) 92; LARGE_NO_SCH-NEXT: lu52i.d $a1, $a1, %got64_pc_hi12(G) 93; LARGE_NO_SCH-NEXT: ldx.d $a0, $a1, $a0 94; LARGE_NO_SCH-NEXT: ld.d $zero, $a0, 0 95; LARGE_NO_SCH-NEXT: pcalau12i $a0, %pc_hi20(.Lg$local) 96; LARGE_NO_SCH-NEXT: addi.d $a1, $zero, %pc_lo12(.Lg$local) 97; LARGE_NO_SCH-NEXT: lu32i.d $a1, %pc64_lo20(.Lg$local) 98; LARGE_NO_SCH-NEXT: lu52i.d $a1, $a1, %pc64_hi12(.Lg$local) 99; LARGE_NO_SCH-NEXT: ldx.d $zero, $a1, $a0 100; LARGE_NO_SCH-NEXT: ori $a0, $zero, 1 101; LARGE_NO_SCH-NEXT: pcalau12i $a1, %got_pc_hi20(bar) 102; LARGE_NO_SCH-NEXT: addi.d $ra, $zero, %got_pc_lo12(bar) 103; LARGE_NO_SCH-NEXT: lu32i.d $ra, %got64_pc_lo20(bar) 104; LARGE_NO_SCH-NEXT: lu52i.d $ra, $ra, %got64_pc_hi12(bar) 105; LARGE_NO_SCH-NEXT: ldx.d $ra, $ra, $a1 106; LARGE_NO_SCH-NEXT: jirl $ra, $ra, 0 107; LARGE_NO_SCH-NEXT: pcalau12i $a0, %gd_pc_hi20(gd) 108; LARGE_NO_SCH-NEXT: addi.d $a1, $zero, %got_pc_lo12(gd) 109; LARGE_NO_SCH-NEXT: lu32i.d $a1, %got64_pc_lo20(gd) 110; LARGE_NO_SCH-NEXT: lu52i.d $a1, $a1, %got64_pc_hi12(gd) 111; LARGE_NO_SCH-NEXT: add.d $a0, $a1, $a0 112; LARGE_NO_SCH-NEXT: pcalau12i $a1, %got_pc_hi20(__tls_get_addr) 113; LARGE_NO_SCH-NEXT: addi.d $ra, $zero, %got_pc_lo12(__tls_get_addr) 114; LARGE_NO_SCH-NEXT: lu32i.d $ra, %got64_pc_lo20(__tls_get_addr) 115; LARGE_NO_SCH-NEXT: lu52i.d $ra, $ra, %got64_pc_hi12(__tls_get_addr) 116; LARGE_NO_SCH-NEXT: ldx.d $ra, $ra, $a1 117; LARGE_NO_SCH-NEXT: jirl $ra, $ra, 0 118; LARGE_NO_SCH-NEXT: ld.d $zero, $a0, 0 119; LARGE_NO_SCH-NEXT: pcalau12i $a0, %ld_pc_hi20(ld) 120; LARGE_NO_SCH-NEXT: addi.d $a1, $zero, %got_pc_lo12(ld) 121; LARGE_NO_SCH-NEXT: lu32i.d $a1, %got64_pc_lo20(ld) 122; LARGE_NO_SCH-NEXT: lu52i.d $a1, $a1, %got64_pc_hi12(ld) 123; LARGE_NO_SCH-NEXT: add.d $a0, $a1, $a0 124; LARGE_NO_SCH-NEXT: pcalau12i $a1, %got_pc_hi20(__tls_get_addr) 125; LARGE_NO_SCH-NEXT: addi.d $ra, $zero, %got_pc_lo12(__tls_get_addr) 126; LARGE_NO_SCH-NEXT: lu32i.d $ra, %got64_pc_lo20(__tls_get_addr) 127; LARGE_NO_SCH-NEXT: lu52i.d $ra, $ra, %got64_pc_hi12(__tls_get_addr) 128; LARGE_NO_SCH-NEXT: ldx.d $ra, $ra, $a1 129; LARGE_NO_SCH-NEXT: jirl $ra, $ra, 0 130; LARGE_NO_SCH-NEXT: ld.d $zero, $a0, 0 131; LARGE_NO_SCH-NEXT: pcalau12i $a0, %ie_pc_hi20(ie) 132; LARGE_NO_SCH-NEXT: addi.d $a1, $zero, %ie_pc_lo12(ie) 133; LARGE_NO_SCH-NEXT: lu32i.d $a1, %ie64_pc_lo20(ie) 134; LARGE_NO_SCH-NEXT: lu52i.d $a1, $a1, %ie64_pc_hi12(ie) 135; LARGE_NO_SCH-NEXT: ldx.d $a0, $a1, $a0 136; LARGE_NO_SCH-NEXT: ldx.d $zero, $a0, $tp 137; LARGE_NO_SCH-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload 138; LARGE_NO_SCH-NEXT: addi.d $sp, $sp, 16 139; LARGE_NO_SCH-NEXT: ret 140; 141; LARGE_SCH-LABEL: foo: 142; LARGE_SCH: # %bb.0: 143; LARGE_SCH-NEXT: addi.d $sp, $sp, -16 144; LARGE_SCH-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill 145; LARGE_SCH-NEXT: pcalau12i $a0, %got_pc_hi20(G) 146; LARGE_SCH-NEXT: addi.d $a1, $zero, %got_pc_lo12(G) 147; LARGE_SCH-NEXT: lu32i.d $a1, %got64_pc_lo20(G) 148; LARGE_SCH-NEXT: lu52i.d $a1, $a1, %got64_pc_hi12(G) 149; LARGE_SCH-NEXT: ldx.d $a0, $a1, $a0 150; LARGE_SCH-NEXT: ld.d $zero, $a0, 0 151; LARGE_SCH-NEXT: pcalau12i $a0, %pc_hi20(.Lg$local) 152; LARGE_SCH-NEXT: addi.d $a1, $zero, %pc_lo12(.Lg$local) 153; LARGE_SCH-NEXT: lu32i.d $a1, %pc64_lo20(.Lg$local) 154; LARGE_SCH-NEXT: lu52i.d $a1, $a1, %pc64_hi12(.Lg$local) 155; LARGE_SCH-NEXT: ldx.d $zero, $a1, $a0 156; LARGE_SCH-NEXT: ori $a0, $zero, 1 157; LARGE_SCH-NEXT: pcalau12i $a1, %got_pc_hi20(bar) 158; LARGE_SCH-NEXT: addi.d $ra, $zero, %got_pc_lo12(bar) 159; LARGE_SCH-NEXT: lu32i.d $ra, %got64_pc_lo20(bar) 160; LARGE_SCH-NEXT: lu52i.d $ra, $ra, %got64_pc_hi12(bar) 161; LARGE_SCH-NEXT: ldx.d $ra, $ra, $a1 162; LARGE_SCH-NEXT: jirl $ra, $ra, 0 163; LARGE_SCH-NEXT: pcalau12i $a0, %gd_pc_hi20(gd) 164; LARGE_SCH-NEXT: addi.d $a1, $zero, %got_pc_lo12(gd) 165; LARGE_SCH-NEXT: lu32i.d $a1, %got64_pc_lo20(gd) 166; LARGE_SCH-NEXT: lu52i.d $a1, $a1, %got64_pc_hi12(gd) 167; LARGE_SCH-NEXT: add.d $a0, $a1, $a0 168; LARGE_SCH-NEXT: pcalau12i $a1, %got_pc_hi20(__tls_get_addr) 169; LARGE_SCH-NEXT: addi.d $ra, $zero, %got_pc_lo12(__tls_get_addr) 170; LARGE_SCH-NEXT: lu32i.d $ra, %got64_pc_lo20(__tls_get_addr) 171; LARGE_SCH-NEXT: lu52i.d $ra, $ra, %got64_pc_hi12(__tls_get_addr) 172; LARGE_SCH-NEXT: ldx.d $ra, $ra, $a1 173; LARGE_SCH-NEXT: jirl $ra, $ra, 0 174; LARGE_SCH-NEXT: ld.d $zero, $a0, 0 175; LARGE_SCH-NEXT: pcalau12i $a0, %ld_pc_hi20(ld) 176; LARGE_SCH-NEXT: addi.d $a1, $zero, %got_pc_lo12(ld) 177; LARGE_SCH-NEXT: lu32i.d $a1, %got64_pc_lo20(ld) 178; LARGE_SCH-NEXT: lu52i.d $a1, $a1, %got64_pc_hi12(ld) 179; LARGE_SCH-NEXT: add.d $a0, $a1, $a0 180; LARGE_SCH-NEXT: pcalau12i $a1, %got_pc_hi20(__tls_get_addr) 181; LARGE_SCH-NEXT: addi.d $ra, $zero, %got_pc_lo12(__tls_get_addr) 182; LARGE_SCH-NEXT: lu32i.d $ra, %got64_pc_lo20(__tls_get_addr) 183; LARGE_SCH-NEXT: lu52i.d $ra, $ra, %got64_pc_hi12(__tls_get_addr) 184; LARGE_SCH-NEXT: ldx.d $ra, $ra, $a1 185; LARGE_SCH-NEXT: jirl $ra, $ra, 0 186; LARGE_SCH-NEXT: ld.d $zero, $a0, 0 187; LARGE_SCH-NEXT: pcalau12i $a0, %ie_pc_hi20(ie) 188; LARGE_SCH-NEXT: addi.d $a1, $zero, %ie_pc_lo12(ie) 189; LARGE_SCH-NEXT: lu32i.d $a1, %ie64_pc_lo20(ie) 190; LARGE_SCH-NEXT: lu52i.d $a1, $a1, %ie64_pc_hi12(ie) 191; LARGE_SCH-NEXT: ldx.d $a0, $a1, $a0 192; LARGE_SCH-NEXT: ldx.d $zero, $a0, $tp 193; LARGE_SCH-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload 194; LARGE_SCH-NEXT: addi.d $sp, $sp, 16 195; LARGE_SCH-NEXT: ret 196 %V = load volatile i64, ptr @G 197 %v = load volatile i64, ptr @g 198 call void @bar(i64 1) 199 %v_gd = load volatile i64, ptr @gd 200 %v_ld = load volatile i64, ptr @ld 201 %v_ie = load volatile i64, ptr @ie 202 ret void 203} 204 205define void @baz() nounwind { 206; MEDIUMDESC_NO_SCH-LABEL: baz: 207; MEDIUMDESC_NO_SCH: # %bb.0: 208; MEDIUMDESC_NO_SCH-NEXT: addi.d $sp, $sp, -16 209; MEDIUMDESC_NO_SCH-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill 210; MEDIUMDESC_NO_SCH-NEXT: pcalau12i $a0, %desc_pc_hi20(gd) 211; MEDIUMDESC_NO_SCH-NEXT: addi.d $a0, $a0, %desc_pc_lo12(gd) 212; MEDIUMDESC_NO_SCH-NEXT: ld.d $ra, $a0, %desc_ld(gd) 213; MEDIUMDESC_NO_SCH-NEXT: jirl $ra, $ra, %desc_call(gd) 214; MEDIUMDESC_NO_SCH-NEXT: add.d $a0, $a0, $tp 215; MEDIUMDESC_NO_SCH-NEXT: ld.d $zero, $a0, 0 216; MEDIUMDESC_NO_SCH-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload 217; MEDIUMDESC_NO_SCH-NEXT: addi.d $sp, $sp, 16 218; MEDIUMDESC_NO_SCH-NEXT: ret 219; 220; MEDIUMDESC_SCH-LABEL: baz: 221; MEDIUMDESC_SCH: # %bb.0: 222; MEDIUMDESC_SCH-NEXT: addi.d $sp, $sp, -16 223; MEDIUMDESC_SCH-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill 224; MEDIUMDESC_SCH-NEXT: pcalau12i $a0, %desc_pc_hi20(gd) 225; MEDIUMDESC_SCH-NEXT: addi.d $a0, $a0, %desc_pc_lo12(gd) 226; MEDIUMDESC_SCH-NEXT: ld.d $ra, $a0, %desc_ld(gd) 227; MEDIUMDESC_SCH-NEXT: jirl $ra, $ra, %desc_call(gd) 228; MEDIUMDESC_SCH-NEXT: add.d $a0, $a0, $tp 229; MEDIUMDESC_SCH-NEXT: ld.d $zero, $a0, 0 230; MEDIUMDESC_SCH-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload 231; MEDIUMDESC_SCH-NEXT: addi.d $sp, $sp, 16 232; MEDIUMDESC_SCH-NEXT: ret 233; 234; LARGEDESC_NO_SCH-LABEL: baz: 235; LARGEDESC_NO_SCH: # %bb.0: 236; LARGEDESC_NO_SCH-NEXT: addi.d $sp, $sp, -16 237; LARGEDESC_NO_SCH-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill 238; LARGEDESC_NO_SCH-NEXT: pcalau12i $a0, %desc_pc_hi20(gd) 239; LARGEDESC_NO_SCH-NEXT: addi.d $a1, $zero, %desc_pc_lo12(gd) 240; LARGEDESC_NO_SCH-NEXT: lu32i.d $a1, %desc64_pc_lo20(gd) 241; LARGEDESC_NO_SCH-NEXT: lu52i.d $a1, $a1, %desc64_pc_hi12(gd) 242; LARGEDESC_NO_SCH-NEXT: add.d $a0, $a0, $a1 243; LARGEDESC_NO_SCH-NEXT: ld.d $ra, $a0, %desc_ld(gd) 244; LARGEDESC_NO_SCH-NEXT: jirl $ra, $ra, %desc_call(gd) 245; LARGEDESC_NO_SCH-NEXT: add.d $a0, $a0, $tp 246; LARGEDESC_NO_SCH-NEXT: ld.d $zero, $a0, 0 247; LARGEDESC_NO_SCH-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload 248; LARGEDESC_NO_SCH-NEXT: addi.d $sp, $sp, 16 249; LARGEDESC_NO_SCH-NEXT: ret 250; 251; LARGEDESC_SCH-LABEL: baz: 252; LARGEDESC_SCH: # %bb.0: 253; LARGEDESC_SCH-NEXT: addi.d $sp, $sp, -16 254; LARGEDESC_SCH-NEXT: st.d $ra, $sp, 8 # 8-byte Folded Spill 255; LARGEDESC_SCH-NEXT: pcalau12i $a0, %desc_pc_hi20(gd) 256; LARGEDESC_SCH-NEXT: addi.d $a1, $zero, %desc_pc_lo12(gd) 257; LARGEDESC_SCH-NEXT: lu32i.d $a1, %desc64_pc_lo20(gd) 258; LARGEDESC_SCH-NEXT: lu52i.d $a1, $a1, %desc64_pc_hi12(gd) 259; LARGEDESC_SCH-NEXT: add.d $a0, $a0, $a1 260; LARGEDESC_SCH-NEXT: ld.d $ra, $a0, %desc_ld(gd) 261; LARGEDESC_SCH-NEXT: jirl $ra, $ra, %desc_call(gd) 262; LARGEDESC_SCH-NEXT: add.d $a0, $a0, $tp 263; LARGEDESC_SCH-NEXT: ld.d $zero, $a0, 0 264; LARGEDESC_SCH-NEXT: ld.d $ra, $sp, 8 # 8-byte Folded Reload 265; LARGEDESC_SCH-NEXT: addi.d $sp, $sp, 16 266; LARGEDESC_SCH-NEXT: ret 267 %v_gd = load volatile i64, ptr @gd 268 ret void 269} 270