1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \ 3; RUN: | FileCheck -check-prefixes=CHECK,RV32I %s 4; RUN: llc -relocation-model=pic -mtriple=riscv32 -verify-machineinstrs < %s \ 5; RUN: | FileCheck -check-prefixes=CHECK,RV32I-PIC %s 6; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \ 7; RUN: | FileCheck -check-prefix=RV64I %s 8; RUN: llc -code-model=small -mtriple=riscv64 -verify-machineinstrs < %s \ 9; RUN: | FileCheck -check-prefix=RV64I-SMALL %s 10; RUN: llc -code-model=medium -mtriple=riscv64 -verify-machineinstrs < %s \ 11; RUN: | FileCheck -check-prefix=RV64I-MEDIUM %s 12; RUN: llc -code-model=large -mtriple=riscv64 -verify-machineinstrs < %s \ 13; RUN: | FileCheck -check-prefix=RV64I-LARGE %s 14; RUN: llc -code-model=large -mtriple=riscv64 -mattr=experimental-zicfilp -verify-machineinstrs < %s \ 15; RUN: | FileCheck -check-prefix=RV64I-LARGE-ZICFILP %s 16 17declare i32 @external_function(i32) 18 19define i32 @test_call_external(i32 %a) nounwind { 20; CHECK-LABEL: test_call_external: 21; CHECK: # %bb.0: 22; CHECK-NEXT: addi sp, sp, -16 23; CHECK-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 24; CHECK-NEXT: call external_function 25; CHECK-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 26; CHECK-NEXT: addi sp, sp, 16 27; CHECK-NEXT: ret 28; 29; RV64I-LABEL: test_call_external: 30; RV64I: # %bb.0: 31; RV64I-NEXT: addi sp, sp, -16 32; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 33; RV64I-NEXT: call external_function 34; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 35; RV64I-NEXT: addi sp, sp, 16 36; RV64I-NEXT: ret 37; 38; RV64I-SMALL-LABEL: test_call_external: 39; RV64I-SMALL: # %bb.0: 40; RV64I-SMALL-NEXT: addi sp, sp, -16 41; RV64I-SMALL-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 42; RV64I-SMALL-NEXT: call external_function 43; RV64I-SMALL-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 44; RV64I-SMALL-NEXT: addi sp, sp, 16 45; RV64I-SMALL-NEXT: ret 46; 47; RV64I-MEDIUM-LABEL: test_call_external: 48; RV64I-MEDIUM: # %bb.0: 49; RV64I-MEDIUM-NEXT: addi sp, sp, -16 50; RV64I-MEDIUM-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 51; RV64I-MEDIUM-NEXT: call external_function 52; RV64I-MEDIUM-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 53; RV64I-MEDIUM-NEXT: addi sp, sp, 16 54; RV64I-MEDIUM-NEXT: ret 55; 56; RV64I-LARGE-LABEL: test_call_external: 57; RV64I-LARGE: # %bb.0: 58; RV64I-LARGE-NEXT: addi sp, sp, -16 59; RV64I-LARGE-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 60; RV64I-LARGE-NEXT: .Lpcrel_hi0: 61; RV64I-LARGE-NEXT: auipc a1, %pcrel_hi(.LCPI0_0) 62; RV64I-LARGE-NEXT: ld a1, %pcrel_lo(.Lpcrel_hi0)(a1) 63; RV64I-LARGE-NEXT: jalr a1 64; RV64I-LARGE-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 65; RV64I-LARGE-NEXT: addi sp, sp, 16 66; RV64I-LARGE-NEXT: ret 67; 68; RV64I-LARGE-ZICFILP-LABEL: test_call_external: 69; RV64I-LARGE-ZICFILP: # %bb.0: 70; RV64I-LARGE-ZICFILP-NEXT: lpad 0 71; RV64I-LARGE-ZICFILP-NEXT: addi sp, sp, -16 72; RV64I-LARGE-ZICFILP-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 73; RV64I-LARGE-ZICFILP-NEXT: .Lpcrel_hi0: 74; RV64I-LARGE-ZICFILP-NEXT: auipc a1, %pcrel_hi(.LCPI0_0) 75; RV64I-LARGE-ZICFILP-NEXT: ld t2, %pcrel_lo(.Lpcrel_hi0)(a1) 76; RV64I-LARGE-ZICFILP-NEXT: jalr t2 77; RV64I-LARGE-ZICFILP-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 78; RV64I-LARGE-ZICFILP-NEXT: addi sp, sp, 16 79; RV64I-LARGE-ZICFILP-NEXT: ret 80 %1 = call i32 @external_function(i32 %a) 81 ret i32 %1 82} 83 84declare dso_local i32 @dso_local_function(i32) 85 86define i32 @test_call_dso_local(i32 %a) nounwind { 87; CHECK-LABEL: test_call_dso_local: 88; CHECK: # %bb.0: 89; CHECK-NEXT: addi sp, sp, -16 90; CHECK-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 91; CHECK-NEXT: call dso_local_function 92; CHECK-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 93; CHECK-NEXT: addi sp, sp, 16 94; CHECK-NEXT: ret 95; 96; RV64I-LABEL: test_call_dso_local: 97; RV64I: # %bb.0: 98; RV64I-NEXT: addi sp, sp, -16 99; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 100; RV64I-NEXT: call dso_local_function 101; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 102; RV64I-NEXT: addi sp, sp, 16 103; RV64I-NEXT: ret 104; 105; RV64I-SMALL-LABEL: test_call_dso_local: 106; RV64I-SMALL: # %bb.0: 107; RV64I-SMALL-NEXT: addi sp, sp, -16 108; RV64I-SMALL-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 109; RV64I-SMALL-NEXT: call dso_local_function 110; RV64I-SMALL-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 111; RV64I-SMALL-NEXT: addi sp, sp, 16 112; RV64I-SMALL-NEXT: ret 113; 114; RV64I-MEDIUM-LABEL: test_call_dso_local: 115; RV64I-MEDIUM: # %bb.0: 116; RV64I-MEDIUM-NEXT: addi sp, sp, -16 117; RV64I-MEDIUM-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 118; RV64I-MEDIUM-NEXT: call dso_local_function 119; RV64I-MEDIUM-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 120; RV64I-MEDIUM-NEXT: addi sp, sp, 16 121; RV64I-MEDIUM-NEXT: ret 122; 123; RV64I-LARGE-LABEL: test_call_dso_local: 124; RV64I-LARGE: # %bb.0: 125; RV64I-LARGE-NEXT: addi sp, sp, -16 126; RV64I-LARGE-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 127; RV64I-LARGE-NEXT: .Lpcrel_hi1: 128; RV64I-LARGE-NEXT: auipc a1, %pcrel_hi(.LCPI1_0) 129; RV64I-LARGE-NEXT: ld a1, %pcrel_lo(.Lpcrel_hi1)(a1) 130; RV64I-LARGE-NEXT: jalr a1 131; RV64I-LARGE-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 132; RV64I-LARGE-NEXT: addi sp, sp, 16 133; RV64I-LARGE-NEXT: ret 134; 135; RV64I-LARGE-ZICFILP-LABEL: test_call_dso_local: 136; RV64I-LARGE-ZICFILP: # %bb.0: 137; RV64I-LARGE-ZICFILP-NEXT: lpad 0 138; RV64I-LARGE-ZICFILP-NEXT: addi sp, sp, -16 139; RV64I-LARGE-ZICFILP-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 140; RV64I-LARGE-ZICFILP-NEXT: .Lpcrel_hi1: 141; RV64I-LARGE-ZICFILP-NEXT: auipc a1, %pcrel_hi(.LCPI1_0) 142; RV64I-LARGE-ZICFILP-NEXT: ld t2, %pcrel_lo(.Lpcrel_hi1)(a1) 143; RV64I-LARGE-ZICFILP-NEXT: jalr t2 144; RV64I-LARGE-ZICFILP-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 145; RV64I-LARGE-ZICFILP-NEXT: addi sp, sp, 16 146; RV64I-LARGE-ZICFILP-NEXT: ret 147 %1 = call i32 @dso_local_function(i32 %a) 148 ret i32 %1 149} 150 151define i32 @defined_function(i32 %a) nounwind { 152; CHECK-LABEL: defined_function: 153; CHECK: # %bb.0: 154; CHECK-NEXT: addi a0, a0, 1 155; CHECK-NEXT: ret 156; 157; RV64I-LABEL: defined_function: 158; RV64I: # %bb.0: 159; RV64I-NEXT: addiw a0, a0, 1 160; RV64I-NEXT: ret 161; 162; RV64I-SMALL-LABEL: defined_function: 163; RV64I-SMALL: # %bb.0: 164; RV64I-SMALL-NEXT: addiw a0, a0, 1 165; RV64I-SMALL-NEXT: ret 166; 167; RV64I-MEDIUM-LABEL: defined_function: 168; RV64I-MEDIUM: # %bb.0: 169; RV64I-MEDIUM-NEXT: addiw a0, a0, 1 170; RV64I-MEDIUM-NEXT: ret 171; 172; RV64I-LARGE-LABEL: defined_function: 173; RV64I-LARGE: # %bb.0: 174; RV64I-LARGE-NEXT: addiw a0, a0, 1 175; RV64I-LARGE-NEXT: ret 176; 177; RV64I-LARGE-ZICFILP-LABEL: defined_function: 178; RV64I-LARGE-ZICFILP: # %bb.0: 179; RV64I-LARGE-ZICFILP-NEXT: lpad 0 180; RV64I-LARGE-ZICFILP-NEXT: addiw a0, a0, 1 181; RV64I-LARGE-ZICFILP-NEXT: ret 182 %1 = add i32 %a, 1 183 ret i32 %1 184} 185 186define i32 @test_call_defined(i32 %a) nounwind { 187; CHECK-LABEL: test_call_defined: 188; CHECK: # %bb.0: 189; CHECK-NEXT: addi sp, sp, -16 190; CHECK-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 191; CHECK-NEXT: call defined_function 192; CHECK-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 193; CHECK-NEXT: addi sp, sp, 16 194; CHECK-NEXT: ret 195; 196; RV64I-LABEL: test_call_defined: 197; RV64I: # %bb.0: 198; RV64I-NEXT: addi sp, sp, -16 199; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 200; RV64I-NEXT: call defined_function 201; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 202; RV64I-NEXT: addi sp, sp, 16 203; RV64I-NEXT: ret 204; 205; RV64I-SMALL-LABEL: test_call_defined: 206; RV64I-SMALL: # %bb.0: 207; RV64I-SMALL-NEXT: addi sp, sp, -16 208; RV64I-SMALL-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 209; RV64I-SMALL-NEXT: call defined_function 210; RV64I-SMALL-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 211; RV64I-SMALL-NEXT: addi sp, sp, 16 212; RV64I-SMALL-NEXT: ret 213; 214; RV64I-MEDIUM-LABEL: test_call_defined: 215; RV64I-MEDIUM: # %bb.0: 216; RV64I-MEDIUM-NEXT: addi sp, sp, -16 217; RV64I-MEDIUM-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 218; RV64I-MEDIUM-NEXT: call defined_function 219; RV64I-MEDIUM-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 220; RV64I-MEDIUM-NEXT: addi sp, sp, 16 221; RV64I-MEDIUM-NEXT: ret 222; 223; RV64I-LARGE-LABEL: test_call_defined: 224; RV64I-LARGE: # %bb.0: 225; RV64I-LARGE-NEXT: addi sp, sp, -16 226; RV64I-LARGE-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 227; RV64I-LARGE-NEXT: .Lpcrel_hi2: 228; RV64I-LARGE-NEXT: auipc a1, %pcrel_hi(.LCPI3_0) 229; RV64I-LARGE-NEXT: ld a1, %pcrel_lo(.Lpcrel_hi2)(a1) 230; RV64I-LARGE-NEXT: jalr a1 231; RV64I-LARGE-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 232; RV64I-LARGE-NEXT: addi sp, sp, 16 233; RV64I-LARGE-NEXT: ret 234; 235; RV64I-LARGE-ZICFILP-LABEL: test_call_defined: 236; RV64I-LARGE-ZICFILP: # %bb.0: 237; RV64I-LARGE-ZICFILP-NEXT: lpad 0 238; RV64I-LARGE-ZICFILP-NEXT: addi sp, sp, -16 239; RV64I-LARGE-ZICFILP-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 240; RV64I-LARGE-ZICFILP-NEXT: .Lpcrel_hi2: 241; RV64I-LARGE-ZICFILP-NEXT: auipc a1, %pcrel_hi(.LCPI3_0) 242; RV64I-LARGE-ZICFILP-NEXT: ld t2, %pcrel_lo(.Lpcrel_hi2)(a1) 243; RV64I-LARGE-ZICFILP-NEXT: jalr t2 244; RV64I-LARGE-ZICFILP-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 245; RV64I-LARGE-ZICFILP-NEXT: addi sp, sp, 16 246; RV64I-LARGE-ZICFILP-NEXT: ret 247 %1 = call i32 @defined_function(i32 %a) 248 ret i32 %1 249} 250 251define i32 @test_call_indirect(ptr %a, i32 %b) nounwind { 252; CHECK-LABEL: test_call_indirect: 253; CHECK: # %bb.0: 254; CHECK-NEXT: addi sp, sp, -16 255; CHECK-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 256; CHECK-NEXT: mv a2, a0 257; CHECK-NEXT: mv a0, a1 258; CHECK-NEXT: jalr a2 259; CHECK-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 260; CHECK-NEXT: addi sp, sp, 16 261; CHECK-NEXT: ret 262; 263; RV64I-LABEL: test_call_indirect: 264; RV64I: # %bb.0: 265; RV64I-NEXT: addi sp, sp, -16 266; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 267; RV64I-NEXT: mv a2, a0 268; RV64I-NEXT: mv a0, a1 269; RV64I-NEXT: jalr a2 270; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 271; RV64I-NEXT: addi sp, sp, 16 272; RV64I-NEXT: ret 273; 274; RV64I-SMALL-LABEL: test_call_indirect: 275; RV64I-SMALL: # %bb.0: 276; RV64I-SMALL-NEXT: addi sp, sp, -16 277; RV64I-SMALL-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 278; RV64I-SMALL-NEXT: mv a2, a0 279; RV64I-SMALL-NEXT: mv a0, a1 280; RV64I-SMALL-NEXT: jalr a2 281; RV64I-SMALL-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 282; RV64I-SMALL-NEXT: addi sp, sp, 16 283; RV64I-SMALL-NEXT: ret 284; 285; RV64I-MEDIUM-LABEL: test_call_indirect: 286; RV64I-MEDIUM: # %bb.0: 287; RV64I-MEDIUM-NEXT: addi sp, sp, -16 288; RV64I-MEDIUM-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 289; RV64I-MEDIUM-NEXT: mv a2, a0 290; RV64I-MEDIUM-NEXT: mv a0, a1 291; RV64I-MEDIUM-NEXT: jalr a2 292; RV64I-MEDIUM-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 293; RV64I-MEDIUM-NEXT: addi sp, sp, 16 294; RV64I-MEDIUM-NEXT: ret 295; 296; RV64I-LARGE-LABEL: test_call_indirect: 297; RV64I-LARGE: # %bb.0: 298; RV64I-LARGE-NEXT: addi sp, sp, -16 299; RV64I-LARGE-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 300; RV64I-LARGE-NEXT: mv a2, a0 301; RV64I-LARGE-NEXT: mv a0, a1 302; RV64I-LARGE-NEXT: jalr a2 303; RV64I-LARGE-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 304; RV64I-LARGE-NEXT: addi sp, sp, 16 305; RV64I-LARGE-NEXT: ret 306; 307; RV64I-LARGE-ZICFILP-LABEL: test_call_indirect: 308; RV64I-LARGE-ZICFILP: # %bb.0: 309; RV64I-LARGE-ZICFILP-NEXT: lpad 0 310; RV64I-LARGE-ZICFILP-NEXT: addi sp, sp, -16 311; RV64I-LARGE-ZICFILP-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 312; RV64I-LARGE-ZICFILP-NEXT: mv a2, a0 313; RV64I-LARGE-ZICFILP-NEXT: mv a0, a1 314; RV64I-LARGE-ZICFILP-NEXT: jalr a2 315; RV64I-LARGE-ZICFILP-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 316; RV64I-LARGE-ZICFILP-NEXT: addi sp, sp, 16 317; RV64I-LARGE-ZICFILP-NEXT: ret 318 %1 = call i32 %a(i32 %b) 319 ret i32 %1 320} 321 322; Make sure we don't use t0 as the source for jalr as that is a hint to pop the 323; return address stack on some microarchitectures. 324define i32 @test_call_indirect_no_t0(ptr %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h) nounwind { 325; CHECK-LABEL: test_call_indirect_no_t0: 326; CHECK: # %bb.0: 327; CHECK-NEXT: addi sp, sp, -16 328; CHECK-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 329; CHECK-NEXT: mv t1, a0 330; CHECK-NEXT: mv a0, a1 331; CHECK-NEXT: mv a1, a2 332; CHECK-NEXT: mv a2, a3 333; CHECK-NEXT: mv a3, a4 334; CHECK-NEXT: mv a4, a5 335; CHECK-NEXT: mv a5, a6 336; CHECK-NEXT: mv a6, a7 337; CHECK-NEXT: jalr t1 338; CHECK-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 339; CHECK-NEXT: addi sp, sp, 16 340; CHECK-NEXT: ret 341; 342; RV64I-LABEL: test_call_indirect_no_t0: 343; RV64I: # %bb.0: 344; RV64I-NEXT: addi sp, sp, -16 345; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 346; RV64I-NEXT: mv t1, a0 347; RV64I-NEXT: mv a0, a1 348; RV64I-NEXT: mv a1, a2 349; RV64I-NEXT: mv a2, a3 350; RV64I-NEXT: mv a3, a4 351; RV64I-NEXT: mv a4, a5 352; RV64I-NEXT: mv a5, a6 353; RV64I-NEXT: mv a6, a7 354; RV64I-NEXT: jalr t1 355; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 356; RV64I-NEXT: addi sp, sp, 16 357; RV64I-NEXT: ret 358; 359; RV64I-SMALL-LABEL: test_call_indirect_no_t0: 360; RV64I-SMALL: # %bb.0: 361; RV64I-SMALL-NEXT: addi sp, sp, -16 362; RV64I-SMALL-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 363; RV64I-SMALL-NEXT: mv t1, a0 364; RV64I-SMALL-NEXT: mv a0, a1 365; RV64I-SMALL-NEXT: mv a1, a2 366; RV64I-SMALL-NEXT: mv a2, a3 367; RV64I-SMALL-NEXT: mv a3, a4 368; RV64I-SMALL-NEXT: mv a4, a5 369; RV64I-SMALL-NEXT: mv a5, a6 370; RV64I-SMALL-NEXT: mv a6, a7 371; RV64I-SMALL-NEXT: jalr t1 372; RV64I-SMALL-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 373; RV64I-SMALL-NEXT: addi sp, sp, 16 374; RV64I-SMALL-NEXT: ret 375; 376; RV64I-MEDIUM-LABEL: test_call_indirect_no_t0: 377; RV64I-MEDIUM: # %bb.0: 378; RV64I-MEDIUM-NEXT: addi sp, sp, -16 379; RV64I-MEDIUM-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 380; RV64I-MEDIUM-NEXT: mv t1, a0 381; RV64I-MEDIUM-NEXT: mv a0, a1 382; RV64I-MEDIUM-NEXT: mv a1, a2 383; RV64I-MEDIUM-NEXT: mv a2, a3 384; RV64I-MEDIUM-NEXT: mv a3, a4 385; RV64I-MEDIUM-NEXT: mv a4, a5 386; RV64I-MEDIUM-NEXT: mv a5, a6 387; RV64I-MEDIUM-NEXT: mv a6, a7 388; RV64I-MEDIUM-NEXT: jalr t1 389; RV64I-MEDIUM-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 390; RV64I-MEDIUM-NEXT: addi sp, sp, 16 391; RV64I-MEDIUM-NEXT: ret 392; 393; RV64I-LARGE-LABEL: test_call_indirect_no_t0: 394; RV64I-LARGE: # %bb.0: 395; RV64I-LARGE-NEXT: addi sp, sp, -16 396; RV64I-LARGE-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 397; RV64I-LARGE-NEXT: mv t1, a0 398; RV64I-LARGE-NEXT: mv a0, a1 399; RV64I-LARGE-NEXT: mv a1, a2 400; RV64I-LARGE-NEXT: mv a2, a3 401; RV64I-LARGE-NEXT: mv a3, a4 402; RV64I-LARGE-NEXT: mv a4, a5 403; RV64I-LARGE-NEXT: mv a5, a6 404; RV64I-LARGE-NEXT: mv a6, a7 405; RV64I-LARGE-NEXT: jalr t1 406; RV64I-LARGE-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 407; RV64I-LARGE-NEXT: addi sp, sp, 16 408; RV64I-LARGE-NEXT: ret 409; 410; RV64I-LARGE-ZICFILP-LABEL: test_call_indirect_no_t0: 411; RV64I-LARGE-ZICFILP: # %bb.0: 412; RV64I-LARGE-ZICFILP-NEXT: lpad 0 413; RV64I-LARGE-ZICFILP-NEXT: addi sp, sp, -16 414; RV64I-LARGE-ZICFILP-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 415; RV64I-LARGE-ZICFILP-NEXT: mv t1, a0 416; RV64I-LARGE-ZICFILP-NEXT: mv a0, a1 417; RV64I-LARGE-ZICFILP-NEXT: mv a1, a2 418; RV64I-LARGE-ZICFILP-NEXT: mv a2, a3 419; RV64I-LARGE-ZICFILP-NEXT: mv a3, a4 420; RV64I-LARGE-ZICFILP-NEXT: mv a4, a5 421; RV64I-LARGE-ZICFILP-NEXT: mv a5, a6 422; RV64I-LARGE-ZICFILP-NEXT: mv a6, a7 423; RV64I-LARGE-ZICFILP-NEXT: jalr t1 424; RV64I-LARGE-ZICFILP-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 425; RV64I-LARGE-ZICFILP-NEXT: addi sp, sp, 16 426; RV64I-LARGE-ZICFILP-NEXT: ret 427 %1 = call i32 %a(i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h) 428 ret i32 %1 429} 430 431; Ensure that calls to fastcc functions aren't rejected. Such calls may be 432; introduced when compiling with optimisation. 433 434define fastcc i32 @fastcc_function(i32 %a, i32 %b) nounwind { 435; CHECK-LABEL: fastcc_function: 436; CHECK: # %bb.0: 437; CHECK-NEXT: add a0, a0, a1 438; CHECK-NEXT: ret 439; 440; RV64I-LABEL: fastcc_function: 441; RV64I: # %bb.0: 442; RV64I-NEXT: addw a0, a0, a1 443; RV64I-NEXT: ret 444; 445; RV64I-SMALL-LABEL: fastcc_function: 446; RV64I-SMALL: # %bb.0: 447; RV64I-SMALL-NEXT: addw a0, a0, a1 448; RV64I-SMALL-NEXT: ret 449; 450; RV64I-MEDIUM-LABEL: fastcc_function: 451; RV64I-MEDIUM: # %bb.0: 452; RV64I-MEDIUM-NEXT: addw a0, a0, a1 453; RV64I-MEDIUM-NEXT: ret 454; 455; RV64I-LARGE-LABEL: fastcc_function: 456; RV64I-LARGE: # %bb.0: 457; RV64I-LARGE-NEXT: addw a0, a0, a1 458; RV64I-LARGE-NEXT: ret 459; 460; RV64I-LARGE-ZICFILP-LABEL: fastcc_function: 461; RV64I-LARGE-ZICFILP: # %bb.0: 462; RV64I-LARGE-ZICFILP-NEXT: lpad 0 463; RV64I-LARGE-ZICFILP-NEXT: addw a0, a0, a1 464; RV64I-LARGE-ZICFILP-NEXT: ret 465 %1 = add i32 %a, %b 466 ret i32 %1 467} 468 469define i32 @test_call_fastcc(i32 %a, i32 %b) nounwind { 470; CHECK-LABEL: test_call_fastcc: 471; CHECK: # %bb.0: 472; CHECK-NEXT: addi sp, sp, -16 473; CHECK-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 474; CHECK-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 475; CHECK-NEXT: mv s0, a0 476; CHECK-NEXT: call fastcc_function 477; CHECK-NEXT: mv a0, s0 478; CHECK-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 479; CHECK-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 480; CHECK-NEXT: addi sp, sp, 16 481; CHECK-NEXT: ret 482; 483; RV64I-LABEL: test_call_fastcc: 484; RV64I: # %bb.0: 485; RV64I-NEXT: addi sp, sp, -16 486; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 487; RV64I-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 488; RV64I-NEXT: mv s0, a0 489; RV64I-NEXT: call fastcc_function 490; RV64I-NEXT: mv a0, s0 491; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 492; RV64I-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 493; RV64I-NEXT: addi sp, sp, 16 494; RV64I-NEXT: ret 495; 496; RV64I-SMALL-LABEL: test_call_fastcc: 497; RV64I-SMALL: # %bb.0: 498; RV64I-SMALL-NEXT: addi sp, sp, -16 499; RV64I-SMALL-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 500; RV64I-SMALL-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 501; RV64I-SMALL-NEXT: mv s0, a0 502; RV64I-SMALL-NEXT: call fastcc_function 503; RV64I-SMALL-NEXT: mv a0, s0 504; RV64I-SMALL-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 505; RV64I-SMALL-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 506; RV64I-SMALL-NEXT: addi sp, sp, 16 507; RV64I-SMALL-NEXT: ret 508; 509; RV64I-MEDIUM-LABEL: test_call_fastcc: 510; RV64I-MEDIUM: # %bb.0: 511; RV64I-MEDIUM-NEXT: addi sp, sp, -16 512; RV64I-MEDIUM-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 513; RV64I-MEDIUM-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 514; RV64I-MEDIUM-NEXT: mv s0, a0 515; RV64I-MEDIUM-NEXT: call fastcc_function 516; RV64I-MEDIUM-NEXT: mv a0, s0 517; RV64I-MEDIUM-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 518; RV64I-MEDIUM-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 519; RV64I-MEDIUM-NEXT: addi sp, sp, 16 520; RV64I-MEDIUM-NEXT: ret 521; 522; RV64I-LARGE-LABEL: test_call_fastcc: 523; RV64I-LARGE: # %bb.0: 524; RV64I-LARGE-NEXT: addi sp, sp, -16 525; RV64I-LARGE-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 526; RV64I-LARGE-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 527; RV64I-LARGE-NEXT: mv s0, a0 528; RV64I-LARGE-NEXT: .Lpcrel_hi3: 529; RV64I-LARGE-NEXT: auipc a0, %pcrel_hi(.LCPI7_0) 530; RV64I-LARGE-NEXT: ld a2, %pcrel_lo(.Lpcrel_hi3)(a0) 531; RV64I-LARGE-NEXT: mv a0, s0 532; RV64I-LARGE-NEXT: jalr a2 533; RV64I-LARGE-NEXT: mv a0, s0 534; RV64I-LARGE-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 535; RV64I-LARGE-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 536; RV64I-LARGE-NEXT: addi sp, sp, 16 537; RV64I-LARGE-NEXT: ret 538; 539; RV64I-LARGE-ZICFILP-LABEL: test_call_fastcc: 540; RV64I-LARGE-ZICFILP: # %bb.0: 541; RV64I-LARGE-ZICFILP-NEXT: lpad 0 542; RV64I-LARGE-ZICFILP-NEXT: addi sp, sp, -16 543; RV64I-LARGE-ZICFILP-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 544; RV64I-LARGE-ZICFILP-NEXT: sd s0, 0(sp) # 8-byte Folded Spill 545; RV64I-LARGE-ZICFILP-NEXT: mv s0, a0 546; RV64I-LARGE-ZICFILP-NEXT: .Lpcrel_hi3: 547; RV64I-LARGE-ZICFILP-NEXT: auipc a0, %pcrel_hi(.LCPI7_0) 548; RV64I-LARGE-ZICFILP-NEXT: ld t2, %pcrel_lo(.Lpcrel_hi3)(a0) 549; RV64I-LARGE-ZICFILP-NEXT: mv a0, s0 550; RV64I-LARGE-ZICFILP-NEXT: jalr t2 551; RV64I-LARGE-ZICFILP-NEXT: mv a0, s0 552; RV64I-LARGE-ZICFILP-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 553; RV64I-LARGE-ZICFILP-NEXT: ld s0, 0(sp) # 8-byte Folded Reload 554; RV64I-LARGE-ZICFILP-NEXT: addi sp, sp, 16 555; RV64I-LARGE-ZICFILP-NEXT: ret 556 %1 = call fastcc i32 @fastcc_function(i32 %a, i32 %b) 557 ret i32 %a 558} 559 560declare i32 @external_many_args(i32, i32, i32, i32, i32, i32, i32, i32, i32, i32) nounwind 561 562define i32 @test_call_external_many_args(i32 %a) nounwind { 563; CHECK-LABEL: test_call_external_many_args: 564; CHECK: # %bb.0: 565; CHECK-NEXT: addi sp, sp, -16 566; CHECK-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 567; CHECK-NEXT: sw s0, 8(sp) # 4-byte Folded Spill 568; CHECK-NEXT: mv s0, a0 569; CHECK-NEXT: sw a0, 0(sp) 570; CHECK-NEXT: sw a0, 4(sp) 571; CHECK-NEXT: mv a1, a0 572; CHECK-NEXT: mv a2, a0 573; CHECK-NEXT: mv a3, a0 574; CHECK-NEXT: mv a4, a0 575; CHECK-NEXT: mv a5, a0 576; CHECK-NEXT: mv a6, a0 577; CHECK-NEXT: mv a7, a0 578; CHECK-NEXT: call external_many_args 579; CHECK-NEXT: mv a0, s0 580; CHECK-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 581; CHECK-NEXT: lw s0, 8(sp) # 4-byte Folded Reload 582; CHECK-NEXT: addi sp, sp, 16 583; CHECK-NEXT: ret 584; 585; RV64I-LABEL: test_call_external_many_args: 586; RV64I: # %bb.0: 587; RV64I-NEXT: addi sp, sp, -32 588; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 589; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 590; RV64I-NEXT: mv s0, a0 591; RV64I-NEXT: sd a0, 0(sp) 592; RV64I-NEXT: sd a0, 8(sp) 593; RV64I-NEXT: mv a1, a0 594; RV64I-NEXT: mv a2, a0 595; RV64I-NEXT: mv a3, a0 596; RV64I-NEXT: mv a4, a0 597; RV64I-NEXT: mv a5, a0 598; RV64I-NEXT: mv a6, a0 599; RV64I-NEXT: mv a7, a0 600; RV64I-NEXT: call external_many_args 601; RV64I-NEXT: mv a0, s0 602; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 603; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 604; RV64I-NEXT: addi sp, sp, 32 605; RV64I-NEXT: ret 606; 607; RV64I-SMALL-LABEL: test_call_external_many_args: 608; RV64I-SMALL: # %bb.0: 609; RV64I-SMALL-NEXT: addi sp, sp, -32 610; RV64I-SMALL-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 611; RV64I-SMALL-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 612; RV64I-SMALL-NEXT: mv s0, a0 613; RV64I-SMALL-NEXT: sd a0, 0(sp) 614; RV64I-SMALL-NEXT: sd a0, 8(sp) 615; RV64I-SMALL-NEXT: mv a1, a0 616; RV64I-SMALL-NEXT: mv a2, a0 617; RV64I-SMALL-NEXT: mv a3, a0 618; RV64I-SMALL-NEXT: mv a4, a0 619; RV64I-SMALL-NEXT: mv a5, a0 620; RV64I-SMALL-NEXT: mv a6, a0 621; RV64I-SMALL-NEXT: mv a7, a0 622; RV64I-SMALL-NEXT: call external_many_args 623; RV64I-SMALL-NEXT: mv a0, s0 624; RV64I-SMALL-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 625; RV64I-SMALL-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 626; RV64I-SMALL-NEXT: addi sp, sp, 32 627; RV64I-SMALL-NEXT: ret 628; 629; RV64I-MEDIUM-LABEL: test_call_external_many_args: 630; RV64I-MEDIUM: # %bb.0: 631; RV64I-MEDIUM-NEXT: addi sp, sp, -32 632; RV64I-MEDIUM-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 633; RV64I-MEDIUM-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 634; RV64I-MEDIUM-NEXT: mv s0, a0 635; RV64I-MEDIUM-NEXT: sd a0, 0(sp) 636; RV64I-MEDIUM-NEXT: sd a0, 8(sp) 637; RV64I-MEDIUM-NEXT: mv a1, a0 638; RV64I-MEDIUM-NEXT: mv a2, a0 639; RV64I-MEDIUM-NEXT: mv a3, a0 640; RV64I-MEDIUM-NEXT: mv a4, a0 641; RV64I-MEDIUM-NEXT: mv a5, a0 642; RV64I-MEDIUM-NEXT: mv a6, a0 643; RV64I-MEDIUM-NEXT: mv a7, a0 644; RV64I-MEDIUM-NEXT: call external_many_args 645; RV64I-MEDIUM-NEXT: mv a0, s0 646; RV64I-MEDIUM-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 647; RV64I-MEDIUM-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 648; RV64I-MEDIUM-NEXT: addi sp, sp, 32 649; RV64I-MEDIUM-NEXT: ret 650; 651; RV64I-LARGE-LABEL: test_call_external_many_args: 652; RV64I-LARGE: # %bb.0: 653; RV64I-LARGE-NEXT: addi sp, sp, -32 654; RV64I-LARGE-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 655; RV64I-LARGE-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 656; RV64I-LARGE-NEXT: mv s0, a0 657; RV64I-LARGE-NEXT: .Lpcrel_hi4: 658; RV64I-LARGE-NEXT: auipc a0, %pcrel_hi(.LCPI8_0) 659; RV64I-LARGE-NEXT: ld t1, %pcrel_lo(.Lpcrel_hi4)(a0) 660; RV64I-LARGE-NEXT: sd s0, 0(sp) 661; RV64I-LARGE-NEXT: sd s0, 8(sp) 662; RV64I-LARGE-NEXT: mv a0, s0 663; RV64I-LARGE-NEXT: mv a1, s0 664; RV64I-LARGE-NEXT: mv a2, s0 665; RV64I-LARGE-NEXT: mv a3, s0 666; RV64I-LARGE-NEXT: mv a4, s0 667; RV64I-LARGE-NEXT: mv a5, s0 668; RV64I-LARGE-NEXT: mv a6, s0 669; RV64I-LARGE-NEXT: mv a7, s0 670; RV64I-LARGE-NEXT: jalr t1 671; RV64I-LARGE-NEXT: mv a0, s0 672; RV64I-LARGE-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 673; RV64I-LARGE-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 674; RV64I-LARGE-NEXT: addi sp, sp, 32 675; RV64I-LARGE-NEXT: ret 676; 677; RV64I-LARGE-ZICFILP-LABEL: test_call_external_many_args: 678; RV64I-LARGE-ZICFILP: # %bb.0: 679; RV64I-LARGE-ZICFILP-NEXT: lpad 0 680; RV64I-LARGE-ZICFILP-NEXT: addi sp, sp, -32 681; RV64I-LARGE-ZICFILP-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 682; RV64I-LARGE-ZICFILP-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 683; RV64I-LARGE-ZICFILP-NEXT: mv s0, a0 684; RV64I-LARGE-ZICFILP-NEXT: .Lpcrel_hi4: 685; RV64I-LARGE-ZICFILP-NEXT: auipc a0, %pcrel_hi(.LCPI8_0) 686; RV64I-LARGE-ZICFILP-NEXT: ld t2, %pcrel_lo(.Lpcrel_hi4)(a0) 687; RV64I-LARGE-ZICFILP-NEXT: sd s0, 0(sp) 688; RV64I-LARGE-ZICFILP-NEXT: sd s0, 8(sp) 689; RV64I-LARGE-ZICFILP-NEXT: mv a0, s0 690; RV64I-LARGE-ZICFILP-NEXT: mv a1, s0 691; RV64I-LARGE-ZICFILP-NEXT: mv a2, s0 692; RV64I-LARGE-ZICFILP-NEXT: mv a3, s0 693; RV64I-LARGE-ZICFILP-NEXT: mv a4, s0 694; RV64I-LARGE-ZICFILP-NEXT: mv a5, s0 695; RV64I-LARGE-ZICFILP-NEXT: mv a6, s0 696; RV64I-LARGE-ZICFILP-NEXT: mv a7, s0 697; RV64I-LARGE-ZICFILP-NEXT: jalr t2 698; RV64I-LARGE-ZICFILP-NEXT: mv a0, s0 699; RV64I-LARGE-ZICFILP-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 700; RV64I-LARGE-ZICFILP-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 701; RV64I-LARGE-ZICFILP-NEXT: addi sp, sp, 32 702; RV64I-LARGE-ZICFILP-NEXT: ret 703 %1 = call i32 @external_many_args(i32 %a, i32 %a, i32 %a, i32 %a, i32 %a, 704 i32 %a, i32 %a, i32 %a, i32 %a, i32 %a) 705 ret i32 %a 706} 707 708define i32 @defined_many_args(i32, i32, i32, i32, i32, i32, i32, i32, i32, i32 %j) nounwind { 709; CHECK-LABEL: defined_many_args: 710; CHECK: # %bb.0: 711; CHECK-NEXT: lw a0, 4(sp) 712; CHECK-NEXT: addi a0, a0, 1 713; CHECK-NEXT: ret 714; 715; RV64I-LABEL: defined_many_args: 716; RV64I: # %bb.0: 717; RV64I-NEXT: lw a0, 8(sp) 718; RV64I-NEXT: addiw a0, a0, 1 719; RV64I-NEXT: ret 720; 721; RV64I-SMALL-LABEL: defined_many_args: 722; RV64I-SMALL: # %bb.0: 723; RV64I-SMALL-NEXT: lw a0, 8(sp) 724; RV64I-SMALL-NEXT: addiw a0, a0, 1 725; RV64I-SMALL-NEXT: ret 726; 727; RV64I-MEDIUM-LABEL: defined_many_args: 728; RV64I-MEDIUM: # %bb.0: 729; RV64I-MEDIUM-NEXT: lw a0, 8(sp) 730; RV64I-MEDIUM-NEXT: addiw a0, a0, 1 731; RV64I-MEDIUM-NEXT: ret 732; 733; RV64I-LARGE-LABEL: defined_many_args: 734; RV64I-LARGE: # %bb.0: 735; RV64I-LARGE-NEXT: lw a0, 8(sp) 736; RV64I-LARGE-NEXT: addiw a0, a0, 1 737; RV64I-LARGE-NEXT: ret 738; 739; RV64I-LARGE-ZICFILP-LABEL: defined_many_args: 740; RV64I-LARGE-ZICFILP: # %bb.0: 741; RV64I-LARGE-ZICFILP-NEXT: lpad 0 742; RV64I-LARGE-ZICFILP-NEXT: lw a0, 8(sp) 743; RV64I-LARGE-ZICFILP-NEXT: addiw a0, a0, 1 744; RV64I-LARGE-ZICFILP-NEXT: ret 745 %added = add i32 %j, 1 746 ret i32 %added 747} 748 749define i32 @test_call_defined_many_args(i32 %a) nounwind { 750; CHECK-LABEL: test_call_defined_many_args: 751; CHECK: # %bb.0: 752; CHECK-NEXT: addi sp, sp, -16 753; CHECK-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 754; CHECK-NEXT: sw a0, 0(sp) 755; CHECK-NEXT: sw a0, 4(sp) 756; CHECK-NEXT: mv a1, a0 757; CHECK-NEXT: mv a2, a0 758; CHECK-NEXT: mv a3, a0 759; CHECK-NEXT: mv a4, a0 760; CHECK-NEXT: mv a5, a0 761; CHECK-NEXT: mv a6, a0 762; CHECK-NEXT: mv a7, a0 763; CHECK-NEXT: call defined_many_args 764; CHECK-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 765; CHECK-NEXT: addi sp, sp, 16 766; CHECK-NEXT: ret 767; 768; RV64I-LABEL: test_call_defined_many_args: 769; RV64I: # %bb.0: 770; RV64I-NEXT: addi sp, sp, -32 771; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 772; RV64I-NEXT: sd a0, 0(sp) 773; RV64I-NEXT: sd a0, 8(sp) 774; RV64I-NEXT: mv a1, a0 775; RV64I-NEXT: mv a2, a0 776; RV64I-NEXT: mv a3, a0 777; RV64I-NEXT: mv a4, a0 778; RV64I-NEXT: mv a5, a0 779; RV64I-NEXT: mv a6, a0 780; RV64I-NEXT: mv a7, a0 781; RV64I-NEXT: call defined_many_args 782; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 783; RV64I-NEXT: addi sp, sp, 32 784; RV64I-NEXT: ret 785; 786; RV64I-SMALL-LABEL: test_call_defined_many_args: 787; RV64I-SMALL: # %bb.0: 788; RV64I-SMALL-NEXT: addi sp, sp, -32 789; RV64I-SMALL-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 790; RV64I-SMALL-NEXT: sd a0, 0(sp) 791; RV64I-SMALL-NEXT: sd a0, 8(sp) 792; RV64I-SMALL-NEXT: mv a1, a0 793; RV64I-SMALL-NEXT: mv a2, a0 794; RV64I-SMALL-NEXT: mv a3, a0 795; RV64I-SMALL-NEXT: mv a4, a0 796; RV64I-SMALL-NEXT: mv a5, a0 797; RV64I-SMALL-NEXT: mv a6, a0 798; RV64I-SMALL-NEXT: mv a7, a0 799; RV64I-SMALL-NEXT: call defined_many_args 800; RV64I-SMALL-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 801; RV64I-SMALL-NEXT: addi sp, sp, 32 802; RV64I-SMALL-NEXT: ret 803; 804; RV64I-MEDIUM-LABEL: test_call_defined_many_args: 805; RV64I-MEDIUM: # %bb.0: 806; RV64I-MEDIUM-NEXT: addi sp, sp, -32 807; RV64I-MEDIUM-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 808; RV64I-MEDIUM-NEXT: sd a0, 0(sp) 809; RV64I-MEDIUM-NEXT: sd a0, 8(sp) 810; RV64I-MEDIUM-NEXT: mv a1, a0 811; RV64I-MEDIUM-NEXT: mv a2, a0 812; RV64I-MEDIUM-NEXT: mv a3, a0 813; RV64I-MEDIUM-NEXT: mv a4, a0 814; RV64I-MEDIUM-NEXT: mv a5, a0 815; RV64I-MEDIUM-NEXT: mv a6, a0 816; RV64I-MEDIUM-NEXT: mv a7, a0 817; RV64I-MEDIUM-NEXT: call defined_many_args 818; RV64I-MEDIUM-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 819; RV64I-MEDIUM-NEXT: addi sp, sp, 32 820; RV64I-MEDIUM-NEXT: ret 821; 822; RV64I-LARGE-LABEL: test_call_defined_many_args: 823; RV64I-LARGE: # %bb.0: 824; RV64I-LARGE-NEXT: addi sp, sp, -32 825; RV64I-LARGE-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 826; RV64I-LARGE-NEXT: .Lpcrel_hi5: 827; RV64I-LARGE-NEXT: auipc a1, %pcrel_hi(.LCPI10_0) 828; RV64I-LARGE-NEXT: ld t1, %pcrel_lo(.Lpcrel_hi5)(a1) 829; RV64I-LARGE-NEXT: sd a0, 0(sp) 830; RV64I-LARGE-NEXT: sd a0, 8(sp) 831; RV64I-LARGE-NEXT: mv a1, a0 832; RV64I-LARGE-NEXT: mv a2, a0 833; RV64I-LARGE-NEXT: mv a3, a0 834; RV64I-LARGE-NEXT: mv a4, a0 835; RV64I-LARGE-NEXT: mv a5, a0 836; RV64I-LARGE-NEXT: mv a6, a0 837; RV64I-LARGE-NEXT: mv a7, a0 838; RV64I-LARGE-NEXT: jalr t1 839; RV64I-LARGE-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 840; RV64I-LARGE-NEXT: addi sp, sp, 32 841; RV64I-LARGE-NEXT: ret 842; 843; RV64I-LARGE-ZICFILP-LABEL: test_call_defined_many_args: 844; RV64I-LARGE-ZICFILP: # %bb.0: 845; RV64I-LARGE-ZICFILP-NEXT: lpad 0 846; RV64I-LARGE-ZICFILP-NEXT: addi sp, sp, -32 847; RV64I-LARGE-ZICFILP-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 848; RV64I-LARGE-ZICFILP-NEXT: .Lpcrel_hi5: 849; RV64I-LARGE-ZICFILP-NEXT: auipc a1, %pcrel_hi(.LCPI10_0) 850; RV64I-LARGE-ZICFILP-NEXT: ld t2, %pcrel_lo(.Lpcrel_hi5)(a1) 851; RV64I-LARGE-ZICFILP-NEXT: sd a0, 0(sp) 852; RV64I-LARGE-ZICFILP-NEXT: sd a0, 8(sp) 853; RV64I-LARGE-ZICFILP-NEXT: mv a1, a0 854; RV64I-LARGE-ZICFILP-NEXT: mv a2, a0 855; RV64I-LARGE-ZICFILP-NEXT: mv a3, a0 856; RV64I-LARGE-ZICFILP-NEXT: mv a4, a0 857; RV64I-LARGE-ZICFILP-NEXT: mv a5, a0 858; RV64I-LARGE-ZICFILP-NEXT: mv a6, a0 859; RV64I-LARGE-ZICFILP-NEXT: mv a7, a0 860; RV64I-LARGE-ZICFILP-NEXT: jalr t2 861; RV64I-LARGE-ZICFILP-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 862; RV64I-LARGE-ZICFILP-NEXT: addi sp, sp, 32 863; RV64I-LARGE-ZICFILP-NEXT: ret 864 %1 = call i32 @defined_many_args(i32 %a, i32 %a, i32 %a, i32 %a, i32 %a, 865 i32 %a, i32 %a, i32 %a, i32 %a, i32 %a) 866 ret i32 %1 867} 868;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: 869; RV32I: {{.*}} 870; RV32I-PIC: {{.*}} 871