1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \ 3; RUN: | FileCheck %s -check-prefix=RV32I 4; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \ 5; RUN: | FileCheck %s -check-prefix=RV64I 6 7declare void @callee(i8*) 8 9define void @caller32() { 10; RV32I-LABEL: caller32: 11; RV32I: # %bb.0: 12; RV32I-NEXT: addi sp, sp, -32 13; RV32I-NEXT: .cfi_def_cfa_offset 32 14; RV32I-NEXT: sw ra, 28(sp) # 4-byte Folded Spill 15; RV32I-NEXT: sw s0, 24(sp) # 4-byte Folded Spill 16; RV32I-NEXT: .cfi_offset ra, -4 17; RV32I-NEXT: .cfi_offset s0, -8 18; RV32I-NEXT: addi s0, sp, 32 19; RV32I-NEXT: .cfi_def_cfa s0, 0 20; RV32I-NEXT: andi sp, sp, -32 21; RV32I-NEXT: mv a0, sp 22; RV32I-NEXT: call callee@plt 23; RV32I-NEXT: addi sp, s0, -32 24; RV32I-NEXT: lw ra, 28(sp) # 4-byte Folded Reload 25; RV32I-NEXT: lw s0, 24(sp) # 4-byte Folded Reload 26; RV32I-NEXT: addi sp, sp, 32 27; RV32I-NEXT: ret 28; 29; RV64I-LABEL: caller32: 30; RV64I: # %bb.0: 31; RV64I-NEXT: addi sp, sp, -32 32; RV64I-NEXT: .cfi_def_cfa_offset 32 33; RV64I-NEXT: sd ra, 24(sp) # 8-byte Folded Spill 34; RV64I-NEXT: sd s0, 16(sp) # 8-byte Folded Spill 35; RV64I-NEXT: .cfi_offset ra, -8 36; RV64I-NEXT: .cfi_offset s0, -16 37; RV64I-NEXT: addi s0, sp, 32 38; RV64I-NEXT: .cfi_def_cfa s0, 0 39; RV64I-NEXT: andi sp, sp, -32 40; RV64I-NEXT: mv a0, sp 41; RV64I-NEXT: call callee@plt 42; RV64I-NEXT: addi sp, s0, -32 43; RV64I-NEXT: ld ra, 24(sp) # 8-byte Folded Reload 44; RV64I-NEXT: ld s0, 16(sp) # 8-byte Folded Reload 45; RV64I-NEXT: addi sp, sp, 32 46; RV64I-NEXT: ret 47 %1 = alloca i8, align 32 48 call void @callee(i8* %1) 49 ret void 50} 51 52define void @caller_no_realign32() "no-realign-stack" { 53; RV32I-LABEL: caller_no_realign32: 54; RV32I: # %bb.0: 55; RV32I-NEXT: addi sp, sp, -16 56; RV32I-NEXT: .cfi_def_cfa_offset 16 57; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 58; RV32I-NEXT: .cfi_offset ra, -4 59; RV32I-NEXT: mv a0, sp 60; RV32I-NEXT: call callee@plt 61; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 62; RV32I-NEXT: addi sp, sp, 16 63; RV32I-NEXT: ret 64; 65; RV64I-LABEL: caller_no_realign32: 66; RV64I: # %bb.0: 67; RV64I-NEXT: addi sp, sp, -16 68; RV64I-NEXT: .cfi_def_cfa_offset 16 69; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 70; RV64I-NEXT: .cfi_offset ra, -8 71; RV64I-NEXT: mv a0, sp 72; RV64I-NEXT: call callee@plt 73; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 74; RV64I-NEXT: addi sp, sp, 16 75; RV64I-NEXT: ret 76 %1 = alloca i8, align 32 77 call void @callee(i8* %1) 78 ret void 79} 80 81define void @caller64() { 82; RV32I-LABEL: caller64: 83; RV32I: # %bb.0: 84; RV32I-NEXT: addi sp, sp, -64 85; RV32I-NEXT: .cfi_def_cfa_offset 64 86; RV32I-NEXT: sw ra, 60(sp) # 4-byte Folded Spill 87; RV32I-NEXT: sw s0, 56(sp) # 4-byte Folded Spill 88; RV32I-NEXT: .cfi_offset ra, -4 89; RV32I-NEXT: .cfi_offset s0, -8 90; RV32I-NEXT: addi s0, sp, 64 91; RV32I-NEXT: .cfi_def_cfa s0, 0 92; RV32I-NEXT: andi sp, sp, -64 93; RV32I-NEXT: mv a0, sp 94; RV32I-NEXT: call callee@plt 95; RV32I-NEXT: addi sp, s0, -64 96; RV32I-NEXT: lw ra, 60(sp) # 4-byte Folded Reload 97; RV32I-NEXT: lw s0, 56(sp) # 4-byte Folded Reload 98; RV32I-NEXT: addi sp, sp, 64 99; RV32I-NEXT: ret 100; 101; RV64I-LABEL: caller64: 102; RV64I: # %bb.0: 103; RV64I-NEXT: addi sp, sp, -64 104; RV64I-NEXT: .cfi_def_cfa_offset 64 105; RV64I-NEXT: sd ra, 56(sp) # 8-byte Folded Spill 106; RV64I-NEXT: sd s0, 48(sp) # 8-byte Folded Spill 107; RV64I-NEXT: .cfi_offset ra, -8 108; RV64I-NEXT: .cfi_offset s0, -16 109; RV64I-NEXT: addi s0, sp, 64 110; RV64I-NEXT: .cfi_def_cfa s0, 0 111; RV64I-NEXT: andi sp, sp, -64 112; RV64I-NEXT: mv a0, sp 113; RV64I-NEXT: call callee@plt 114; RV64I-NEXT: addi sp, s0, -64 115; RV64I-NEXT: ld ra, 56(sp) # 8-byte Folded Reload 116; RV64I-NEXT: ld s0, 48(sp) # 8-byte Folded Reload 117; RV64I-NEXT: addi sp, sp, 64 118; RV64I-NEXT: ret 119 %1 = alloca i8, align 64 120 call void @callee(i8* %1) 121 ret void 122} 123 124define void @caller_no_realign64() "no-realign-stack" { 125; RV32I-LABEL: caller_no_realign64: 126; RV32I: # %bb.0: 127; RV32I-NEXT: addi sp, sp, -16 128; RV32I-NEXT: .cfi_def_cfa_offset 16 129; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 130; RV32I-NEXT: .cfi_offset ra, -4 131; RV32I-NEXT: mv a0, sp 132; RV32I-NEXT: call callee@plt 133; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 134; RV32I-NEXT: addi sp, sp, 16 135; RV32I-NEXT: ret 136; 137; RV64I-LABEL: caller_no_realign64: 138; RV64I: # %bb.0: 139; RV64I-NEXT: addi sp, sp, -16 140; RV64I-NEXT: .cfi_def_cfa_offset 16 141; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 142; RV64I-NEXT: .cfi_offset ra, -8 143; RV64I-NEXT: mv a0, sp 144; RV64I-NEXT: call callee@plt 145; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 146; RV64I-NEXT: addi sp, sp, 16 147; RV64I-NEXT: ret 148 %1 = alloca i8, align 64 149 call void @callee(i8* %1) 150 ret void 151} 152 153define void @caller128() { 154; RV32I-LABEL: caller128: 155; RV32I: # %bb.0: 156; RV32I-NEXT: addi sp, sp, -128 157; RV32I-NEXT: .cfi_def_cfa_offset 128 158; RV32I-NEXT: sw ra, 124(sp) # 4-byte Folded Spill 159; RV32I-NEXT: sw s0, 120(sp) # 4-byte Folded Spill 160; RV32I-NEXT: .cfi_offset ra, -4 161; RV32I-NEXT: .cfi_offset s0, -8 162; RV32I-NEXT: addi s0, sp, 128 163; RV32I-NEXT: .cfi_def_cfa s0, 0 164; RV32I-NEXT: andi sp, sp, -128 165; RV32I-NEXT: mv a0, sp 166; RV32I-NEXT: call callee@plt 167; RV32I-NEXT: addi sp, s0, -128 168; RV32I-NEXT: lw ra, 124(sp) # 4-byte Folded Reload 169; RV32I-NEXT: lw s0, 120(sp) # 4-byte Folded Reload 170; RV32I-NEXT: addi sp, sp, 128 171; RV32I-NEXT: ret 172; 173; RV64I-LABEL: caller128: 174; RV64I: # %bb.0: 175; RV64I-NEXT: addi sp, sp, -128 176; RV64I-NEXT: .cfi_def_cfa_offset 128 177; RV64I-NEXT: sd ra, 120(sp) # 8-byte Folded Spill 178; RV64I-NEXT: sd s0, 112(sp) # 8-byte Folded Spill 179; RV64I-NEXT: .cfi_offset ra, -8 180; RV64I-NEXT: .cfi_offset s0, -16 181; RV64I-NEXT: addi s0, sp, 128 182; RV64I-NEXT: .cfi_def_cfa s0, 0 183; RV64I-NEXT: andi sp, sp, -128 184; RV64I-NEXT: mv a0, sp 185; RV64I-NEXT: call callee@plt 186; RV64I-NEXT: addi sp, s0, -128 187; RV64I-NEXT: ld ra, 120(sp) # 8-byte Folded Reload 188; RV64I-NEXT: ld s0, 112(sp) # 8-byte Folded Reload 189; RV64I-NEXT: addi sp, sp, 128 190; RV64I-NEXT: ret 191 %1 = alloca i8, align 128 192 call void @callee(i8* %1) 193 ret void 194} 195 196define void @caller_no_realign128() "no-realign-stack" { 197; RV32I-LABEL: caller_no_realign128: 198; RV32I: # %bb.0: 199; RV32I-NEXT: addi sp, sp, -16 200; RV32I-NEXT: .cfi_def_cfa_offset 16 201; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 202; RV32I-NEXT: .cfi_offset ra, -4 203; RV32I-NEXT: mv a0, sp 204; RV32I-NEXT: call callee@plt 205; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 206; RV32I-NEXT: addi sp, sp, 16 207; RV32I-NEXT: ret 208; 209; RV64I-LABEL: caller_no_realign128: 210; RV64I: # %bb.0: 211; RV64I-NEXT: addi sp, sp, -16 212; RV64I-NEXT: .cfi_def_cfa_offset 16 213; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 214; RV64I-NEXT: .cfi_offset ra, -8 215; RV64I-NEXT: mv a0, sp 216; RV64I-NEXT: call callee@plt 217; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 218; RV64I-NEXT: addi sp, sp, 16 219; RV64I-NEXT: ret 220 %1 = alloca i8, align 128 221 call void @callee(i8* %1) 222 ret void 223} 224 225define void @caller256() { 226; RV32I-LABEL: caller256: 227; RV32I: # %bb.0: 228; RV32I-NEXT: addi sp, sp, -256 229; RV32I-NEXT: .cfi_def_cfa_offset 256 230; RV32I-NEXT: sw ra, 252(sp) # 4-byte Folded Spill 231; RV32I-NEXT: sw s0, 248(sp) # 4-byte Folded Spill 232; RV32I-NEXT: .cfi_offset ra, -4 233; RV32I-NEXT: .cfi_offset s0, -8 234; RV32I-NEXT: addi s0, sp, 256 235; RV32I-NEXT: .cfi_def_cfa s0, 0 236; RV32I-NEXT: andi sp, sp, -256 237; RV32I-NEXT: mv a0, sp 238; RV32I-NEXT: call callee@plt 239; RV32I-NEXT: addi sp, s0, -256 240; RV32I-NEXT: lw ra, 252(sp) # 4-byte Folded Reload 241; RV32I-NEXT: lw s0, 248(sp) # 4-byte Folded Reload 242; RV32I-NEXT: addi sp, sp, 256 243; RV32I-NEXT: ret 244; 245; RV64I-LABEL: caller256: 246; RV64I: # %bb.0: 247; RV64I-NEXT: addi sp, sp, -256 248; RV64I-NEXT: .cfi_def_cfa_offset 256 249; RV64I-NEXT: sd ra, 248(sp) # 8-byte Folded Spill 250; RV64I-NEXT: sd s0, 240(sp) # 8-byte Folded Spill 251; RV64I-NEXT: .cfi_offset ra, -8 252; RV64I-NEXT: .cfi_offset s0, -16 253; RV64I-NEXT: addi s0, sp, 256 254; RV64I-NEXT: .cfi_def_cfa s0, 0 255; RV64I-NEXT: andi sp, sp, -256 256; RV64I-NEXT: mv a0, sp 257; RV64I-NEXT: call callee@plt 258; RV64I-NEXT: addi sp, s0, -256 259; RV64I-NEXT: ld ra, 248(sp) # 8-byte Folded Reload 260; RV64I-NEXT: ld s0, 240(sp) # 8-byte Folded Reload 261; RV64I-NEXT: addi sp, sp, 256 262; RV64I-NEXT: ret 263 %1 = alloca i8, align 256 264 call void @callee(i8* %1) 265 ret void 266} 267 268define void @caller_no_realign256() "no-realign-stack" { 269; RV32I-LABEL: caller_no_realign256: 270; RV32I: # %bb.0: 271; RV32I-NEXT: addi sp, sp, -16 272; RV32I-NEXT: .cfi_def_cfa_offset 16 273; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 274; RV32I-NEXT: .cfi_offset ra, -4 275; RV32I-NEXT: mv a0, sp 276; RV32I-NEXT: call callee@plt 277; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 278; RV32I-NEXT: addi sp, sp, 16 279; RV32I-NEXT: ret 280; 281; RV64I-LABEL: caller_no_realign256: 282; RV64I: # %bb.0: 283; RV64I-NEXT: addi sp, sp, -16 284; RV64I-NEXT: .cfi_def_cfa_offset 16 285; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 286; RV64I-NEXT: .cfi_offset ra, -8 287; RV64I-NEXT: mv a0, sp 288; RV64I-NEXT: call callee@plt 289; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 290; RV64I-NEXT: addi sp, sp, 16 291; RV64I-NEXT: ret 292 %1 = alloca i8, align 256 293 call void @callee(i8* %1) 294 ret void 295} 296 297define void @caller512() { 298; RV32I-LABEL: caller512: 299; RV32I: # %bb.0: 300; RV32I-NEXT: addi sp, sp, -1024 301; RV32I-NEXT: .cfi_def_cfa_offset 1024 302; RV32I-NEXT: sw ra, 1020(sp) # 4-byte Folded Spill 303; RV32I-NEXT: sw s0, 1016(sp) # 4-byte Folded Spill 304; RV32I-NEXT: .cfi_offset ra, -4 305; RV32I-NEXT: .cfi_offset s0, -8 306; RV32I-NEXT: addi s0, sp, 1024 307; RV32I-NEXT: .cfi_def_cfa s0, 0 308; RV32I-NEXT: andi sp, sp, -512 309; RV32I-NEXT: addi a0, sp, 512 310; RV32I-NEXT: call callee@plt 311; RV32I-NEXT: addi sp, s0, -1024 312; RV32I-NEXT: lw ra, 1020(sp) # 4-byte Folded Reload 313; RV32I-NEXT: lw s0, 1016(sp) # 4-byte Folded Reload 314; RV32I-NEXT: addi sp, sp, 1024 315; RV32I-NEXT: ret 316; 317; RV64I-LABEL: caller512: 318; RV64I: # %bb.0: 319; RV64I-NEXT: addi sp, sp, -1024 320; RV64I-NEXT: .cfi_def_cfa_offset 1024 321; RV64I-NEXT: sd ra, 1016(sp) # 8-byte Folded Spill 322; RV64I-NEXT: sd s0, 1008(sp) # 8-byte Folded Spill 323; RV64I-NEXT: .cfi_offset ra, -8 324; RV64I-NEXT: .cfi_offset s0, -16 325; RV64I-NEXT: addi s0, sp, 1024 326; RV64I-NEXT: .cfi_def_cfa s0, 0 327; RV64I-NEXT: andi sp, sp, -512 328; RV64I-NEXT: addi a0, sp, 512 329; RV64I-NEXT: call callee@plt 330; RV64I-NEXT: addi sp, s0, -1024 331; RV64I-NEXT: ld ra, 1016(sp) # 8-byte Folded Reload 332; RV64I-NEXT: ld s0, 1008(sp) # 8-byte Folded Reload 333; RV64I-NEXT: addi sp, sp, 1024 334; RV64I-NEXT: ret 335 %1 = alloca i8, align 512 336 call void @callee(i8* %1) 337 ret void 338} 339 340define void @caller_no_realign512() "no-realign-stack" { 341; RV32I-LABEL: caller_no_realign512: 342; RV32I: # %bb.0: 343; RV32I-NEXT: addi sp, sp, -16 344; RV32I-NEXT: .cfi_def_cfa_offset 16 345; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 346; RV32I-NEXT: .cfi_offset ra, -4 347; RV32I-NEXT: mv a0, sp 348; RV32I-NEXT: call callee@plt 349; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 350; RV32I-NEXT: addi sp, sp, 16 351; RV32I-NEXT: ret 352; 353; RV64I-LABEL: caller_no_realign512: 354; RV64I: # %bb.0: 355; RV64I-NEXT: addi sp, sp, -16 356; RV64I-NEXT: .cfi_def_cfa_offset 16 357; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 358; RV64I-NEXT: .cfi_offset ra, -8 359; RV64I-NEXT: mv a0, sp 360; RV64I-NEXT: call callee@plt 361; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 362; RV64I-NEXT: addi sp, sp, 16 363; RV64I-NEXT: ret 364 %1 = alloca i8, align 512 365 call void @callee(i8* %1) 366 ret void 367} 368 369define void @caller1024() { 370; RV32I-LABEL: caller1024: 371; RV32I: # %bb.0: 372; RV32I-NEXT: addi sp, sp, -2032 373; RV32I-NEXT: .cfi_def_cfa_offset 2032 374; RV32I-NEXT: sw ra, 2028(sp) # 4-byte Folded Spill 375; RV32I-NEXT: sw s0, 2024(sp) # 4-byte Folded Spill 376; RV32I-NEXT: .cfi_offset ra, -4 377; RV32I-NEXT: .cfi_offset s0, -8 378; RV32I-NEXT: addi s0, sp, 2032 379; RV32I-NEXT: .cfi_def_cfa s0, 0 380; RV32I-NEXT: addi sp, sp, -16 381; RV32I-NEXT: andi sp, sp, -1024 382; RV32I-NEXT: addi a0, sp, 1024 383; RV32I-NEXT: call callee@plt 384; RV32I-NEXT: addi sp, s0, -2048 385; RV32I-NEXT: addi sp, sp, 16 386; RV32I-NEXT: lw ra, 2028(sp) # 4-byte Folded Reload 387; RV32I-NEXT: lw s0, 2024(sp) # 4-byte Folded Reload 388; RV32I-NEXT: addi sp, sp, 2032 389; RV32I-NEXT: ret 390; 391; RV64I-LABEL: caller1024: 392; RV64I: # %bb.0: 393; RV64I-NEXT: addi sp, sp, -2032 394; RV64I-NEXT: .cfi_def_cfa_offset 2032 395; RV64I-NEXT: sd ra, 2024(sp) # 8-byte Folded Spill 396; RV64I-NEXT: sd s0, 2016(sp) # 8-byte Folded Spill 397; RV64I-NEXT: .cfi_offset ra, -8 398; RV64I-NEXT: .cfi_offset s0, -16 399; RV64I-NEXT: addi s0, sp, 2032 400; RV64I-NEXT: .cfi_def_cfa s0, 0 401; RV64I-NEXT: addi sp, sp, -16 402; RV64I-NEXT: andi sp, sp, -1024 403; RV64I-NEXT: addi a0, sp, 1024 404; RV64I-NEXT: call callee@plt 405; RV64I-NEXT: addi sp, s0, -2048 406; RV64I-NEXT: addi sp, sp, 16 407; RV64I-NEXT: ld ra, 2024(sp) # 8-byte Folded Reload 408; RV64I-NEXT: ld s0, 2016(sp) # 8-byte Folded Reload 409; RV64I-NEXT: addi sp, sp, 2032 410; RV64I-NEXT: ret 411 %1 = alloca i8, align 1024 412 call void @callee(i8* %1) 413 ret void 414} 415 416define void @caller_no_realign1024() "no-realign-stack" { 417; RV32I-LABEL: caller_no_realign1024: 418; RV32I: # %bb.0: 419; RV32I-NEXT: addi sp, sp, -16 420; RV32I-NEXT: .cfi_def_cfa_offset 16 421; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 422; RV32I-NEXT: .cfi_offset ra, -4 423; RV32I-NEXT: mv a0, sp 424; RV32I-NEXT: call callee@plt 425; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 426; RV32I-NEXT: addi sp, sp, 16 427; RV32I-NEXT: ret 428; 429; RV64I-LABEL: caller_no_realign1024: 430; RV64I: # %bb.0: 431; RV64I-NEXT: addi sp, sp, -16 432; RV64I-NEXT: .cfi_def_cfa_offset 16 433; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 434; RV64I-NEXT: .cfi_offset ra, -8 435; RV64I-NEXT: mv a0, sp 436; RV64I-NEXT: call callee@plt 437; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 438; RV64I-NEXT: addi sp, sp, 16 439; RV64I-NEXT: ret 440 %1 = alloca i8, align 1024 441 call void @callee(i8* %1) 442 ret void 443} 444 445define void @caller2048() { 446; RV32I-LABEL: caller2048: 447; RV32I: # %bb.0: 448; RV32I-NEXT: addi sp, sp, -2032 449; RV32I-NEXT: .cfi_def_cfa_offset 2032 450; RV32I-NEXT: sw ra, 2028(sp) # 4-byte Folded Spill 451; RV32I-NEXT: sw s0, 2024(sp) # 4-byte Folded Spill 452; RV32I-NEXT: .cfi_offset ra, -4 453; RV32I-NEXT: .cfi_offset s0, -8 454; RV32I-NEXT: addi s0, sp, 2032 455; RV32I-NEXT: .cfi_def_cfa s0, 0 456; RV32I-NEXT: addi sp, sp, -2048 457; RV32I-NEXT: addi sp, sp, -16 458; RV32I-NEXT: andi sp, sp, -2048 459; RV32I-NEXT: lui a0, 1 460; RV32I-NEXT: addi a0, a0, -2048 461; RV32I-NEXT: add a0, sp, a0 462; RV32I-NEXT: call callee@plt 463; RV32I-NEXT: lui a0, 1 464; RV32I-NEXT: sub sp, s0, a0 465; RV32I-NEXT: addi sp, sp, 2032 466; RV32I-NEXT: addi sp, sp, 32 467; RV32I-NEXT: lw ra, 2028(sp) # 4-byte Folded Reload 468; RV32I-NEXT: lw s0, 2024(sp) # 4-byte Folded Reload 469; RV32I-NEXT: addi sp, sp, 2032 470; RV32I-NEXT: ret 471; 472; RV64I-LABEL: caller2048: 473; RV64I: # %bb.0: 474; RV64I-NEXT: addi sp, sp, -2032 475; RV64I-NEXT: .cfi_def_cfa_offset 2032 476; RV64I-NEXT: sd ra, 2024(sp) # 8-byte Folded Spill 477; RV64I-NEXT: sd s0, 2016(sp) # 8-byte Folded Spill 478; RV64I-NEXT: .cfi_offset ra, -8 479; RV64I-NEXT: .cfi_offset s0, -16 480; RV64I-NEXT: addi s0, sp, 2032 481; RV64I-NEXT: .cfi_def_cfa s0, 0 482; RV64I-NEXT: addi sp, sp, -2048 483; RV64I-NEXT: addi sp, sp, -16 484; RV64I-NEXT: andi sp, sp, -2048 485; RV64I-NEXT: lui a0, 1 486; RV64I-NEXT: addiw a0, a0, -2048 487; RV64I-NEXT: add a0, sp, a0 488; RV64I-NEXT: call callee@plt 489; RV64I-NEXT: lui a0, 1 490; RV64I-NEXT: sub sp, s0, a0 491; RV64I-NEXT: addi sp, sp, 2032 492; RV64I-NEXT: addi sp, sp, 32 493; RV64I-NEXT: ld ra, 2024(sp) # 8-byte Folded Reload 494; RV64I-NEXT: ld s0, 2016(sp) # 8-byte Folded Reload 495; RV64I-NEXT: addi sp, sp, 2032 496; RV64I-NEXT: ret 497 %1 = alloca i8, align 2048 498 call void @callee(i8* %1) 499 ret void 500} 501 502define void @caller_no_realign2048() "no-realign-stack" { 503; RV32I-LABEL: caller_no_realign2048: 504; RV32I: # %bb.0: 505; RV32I-NEXT: addi sp, sp, -16 506; RV32I-NEXT: .cfi_def_cfa_offset 16 507; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 508; RV32I-NEXT: .cfi_offset ra, -4 509; RV32I-NEXT: mv a0, sp 510; RV32I-NEXT: call callee@plt 511; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 512; RV32I-NEXT: addi sp, sp, 16 513; RV32I-NEXT: ret 514; 515; RV64I-LABEL: caller_no_realign2048: 516; RV64I: # %bb.0: 517; RV64I-NEXT: addi sp, sp, -16 518; RV64I-NEXT: .cfi_def_cfa_offset 16 519; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 520; RV64I-NEXT: .cfi_offset ra, -8 521; RV64I-NEXT: mv a0, sp 522; RV64I-NEXT: call callee@plt 523; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 524; RV64I-NEXT: addi sp, sp, 16 525; RV64I-NEXT: ret 526 %1 = alloca i8, align 2048 527 call void @callee(i8* %1) 528 ret void 529} 530 531define void @caller4096() { 532; RV32I-LABEL: caller4096: 533; RV32I: # %bb.0: 534; RV32I-NEXT: addi sp, sp, -2032 535; RV32I-NEXT: .cfi_def_cfa_offset 2032 536; RV32I-NEXT: sw ra, 2028(sp) # 4-byte Folded Spill 537; RV32I-NEXT: sw s0, 2024(sp) # 4-byte Folded Spill 538; RV32I-NEXT: .cfi_offset ra, -4 539; RV32I-NEXT: .cfi_offset s0, -8 540; RV32I-NEXT: addi s0, sp, 2032 541; RV32I-NEXT: .cfi_def_cfa s0, 0 542; RV32I-NEXT: lui a0, 2 543; RV32I-NEXT: addi a0, a0, -2032 544; RV32I-NEXT: sub sp, sp, a0 545; RV32I-NEXT: srli a0, sp, 12 546; RV32I-NEXT: slli sp, a0, 12 547; RV32I-NEXT: lui a0, 1 548; RV32I-NEXT: add a0, sp, a0 549; RV32I-NEXT: call callee@plt 550; RV32I-NEXT: lui a0, 2 551; RV32I-NEXT: sub sp, s0, a0 552; RV32I-NEXT: lui a0, 2 553; RV32I-NEXT: addi a0, a0, -2032 554; RV32I-NEXT: add sp, sp, a0 555; RV32I-NEXT: lw ra, 2028(sp) # 4-byte Folded Reload 556; RV32I-NEXT: lw s0, 2024(sp) # 4-byte Folded Reload 557; RV32I-NEXT: addi sp, sp, 2032 558; RV32I-NEXT: ret 559; 560; RV64I-LABEL: caller4096: 561; RV64I: # %bb.0: 562; RV64I-NEXT: addi sp, sp, -2032 563; RV64I-NEXT: .cfi_def_cfa_offset 2032 564; RV64I-NEXT: sd ra, 2024(sp) # 8-byte Folded Spill 565; RV64I-NEXT: sd s0, 2016(sp) # 8-byte Folded Spill 566; RV64I-NEXT: .cfi_offset ra, -8 567; RV64I-NEXT: .cfi_offset s0, -16 568; RV64I-NEXT: addi s0, sp, 2032 569; RV64I-NEXT: .cfi_def_cfa s0, 0 570; RV64I-NEXT: lui a0, 2 571; RV64I-NEXT: addiw a0, a0, -2032 572; RV64I-NEXT: sub sp, sp, a0 573; RV64I-NEXT: srli a0, sp, 12 574; RV64I-NEXT: slli sp, a0, 12 575; RV64I-NEXT: lui a0, 1 576; RV64I-NEXT: add a0, sp, a0 577; RV64I-NEXT: call callee@plt 578; RV64I-NEXT: lui a0, 2 579; RV64I-NEXT: sub sp, s0, a0 580; RV64I-NEXT: lui a0, 2 581; RV64I-NEXT: addiw a0, a0, -2032 582; RV64I-NEXT: add sp, sp, a0 583; RV64I-NEXT: ld ra, 2024(sp) # 8-byte Folded Reload 584; RV64I-NEXT: ld s0, 2016(sp) # 8-byte Folded Reload 585; RV64I-NEXT: addi sp, sp, 2032 586; RV64I-NEXT: ret 587 %1 = alloca i8, align 4096 588 call void @callee(i8* %1) 589 ret void 590} 591 592define void @caller_no_realign4096() "no-realign-stack" { 593; RV32I-LABEL: caller_no_realign4096: 594; RV32I: # %bb.0: 595; RV32I-NEXT: addi sp, sp, -16 596; RV32I-NEXT: .cfi_def_cfa_offset 16 597; RV32I-NEXT: sw ra, 12(sp) # 4-byte Folded Spill 598; RV32I-NEXT: .cfi_offset ra, -4 599; RV32I-NEXT: mv a0, sp 600; RV32I-NEXT: call callee@plt 601; RV32I-NEXT: lw ra, 12(sp) # 4-byte Folded Reload 602; RV32I-NEXT: addi sp, sp, 16 603; RV32I-NEXT: ret 604; 605; RV64I-LABEL: caller_no_realign4096: 606; RV64I: # %bb.0: 607; RV64I-NEXT: addi sp, sp, -16 608; RV64I-NEXT: .cfi_def_cfa_offset 16 609; RV64I-NEXT: sd ra, 8(sp) # 8-byte Folded Spill 610; RV64I-NEXT: .cfi_offset ra, -8 611; RV64I-NEXT: mv a0, sp 612; RV64I-NEXT: call callee@plt 613; RV64I-NEXT: ld ra, 8(sp) # 8-byte Folded Reload 614; RV64I-NEXT: addi sp, sp, 16 615; RV64I-NEXT: ret 616 %1 = alloca i8, align 4096 617 call void @callee(i8* %1) 618 ret void 619} 620