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-prefixes=RV32,RV32I 4; RUN: llc -mtriple=riscv32 -verify-machineinstrs -mattr=+zba < %s \ 5; RUN: | FileCheck %s -check-prefixes=RV32,RV32ZBA 6; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \ 7; RUN: | FileCheck %s -check-prefixes=RV64,RV64I 8; RUN: llc -mtriple=riscv64 -verify-machineinstrs -mattr=+zba < %s \ 9; RUN: | FileCheck %s -check-prefixes=RV64,RV64ZBA 10 11declare void @inspect(...) 12 13define void @test() { 14; RV32I-LABEL: test: 15; RV32I: # %bb.0: 16; RV32I-NEXT: addi sp, sp, -2032 17; RV32I-NEXT: .cfi_def_cfa_offset 2032 18; RV32I-NEXT: sw ra, 2028(sp) # 4-byte Folded Spill 19; RV32I-NEXT: .cfi_offset ra, -4 20; RV32I-NEXT: addi sp, sp, -2048 21; RV32I-NEXT: addi sp, sp, -1120 22; RV32I-NEXT: .cfi_def_cfa_offset 5200 23; RV32I-NEXT: addi a0, sp, 12 24; RV32I-NEXT: addi a1, sp, 2047 25; RV32I-NEXT: addi a1, a1, 13 26; RV32I-NEXT: lui a2, 1 27; RV32I-NEXT: addi a2, a2, 12 28; RV32I-NEXT: add a2, sp, a2 29; RV32I-NEXT: lui a3, 1 30; RV32I-NEXT: addi a3, a3, 1036 31; RV32I-NEXT: add a3, sp, a3 32; RV32I-NEXT: call inspect 33; RV32I-NEXT: addi sp, sp, 2032 34; RV32I-NEXT: addi sp, sp, 1136 35; RV32I-NEXT: .cfi_def_cfa_offset 2032 36; RV32I-NEXT: lw ra, 2028(sp) # 4-byte Folded Reload 37; RV32I-NEXT: .cfi_restore ra 38; RV32I-NEXT: addi sp, sp, 2032 39; RV32I-NEXT: .cfi_def_cfa_offset 0 40; RV32I-NEXT: ret 41; 42; RV32ZBA-LABEL: test: 43; RV32ZBA: # %bb.0: 44; RV32ZBA-NEXT: addi sp, sp, -2032 45; RV32ZBA-NEXT: .cfi_def_cfa_offset 2032 46; RV32ZBA-NEXT: sw ra, 2028(sp) # 4-byte Folded Spill 47; RV32ZBA-NEXT: .cfi_offset ra, -4 48; RV32ZBA-NEXT: addi sp, sp, -2048 49; RV32ZBA-NEXT: addi sp, sp, -1120 50; RV32ZBA-NEXT: .cfi_def_cfa_offset 5200 51; RV32ZBA-NEXT: addi a0, sp, 12 52; RV32ZBA-NEXT: addi a1, sp, 2047 53; RV32ZBA-NEXT: addi a1, a1, 13 54; RV32ZBA-NEXT: li a2, 1027 55; RV32ZBA-NEXT: sh2add a2, a2, sp 56; RV32ZBA-NEXT: li a3, 1283 57; RV32ZBA-NEXT: sh2add a3, a3, sp 58; RV32ZBA-NEXT: call inspect 59; RV32ZBA-NEXT: addi sp, sp, 2032 60; RV32ZBA-NEXT: addi sp, sp, 1136 61; RV32ZBA-NEXT: .cfi_def_cfa_offset 2032 62; RV32ZBA-NEXT: lw ra, 2028(sp) # 4-byte Folded Reload 63; RV32ZBA-NEXT: .cfi_restore ra 64; RV32ZBA-NEXT: addi sp, sp, 2032 65; RV32ZBA-NEXT: .cfi_def_cfa_offset 0 66; RV32ZBA-NEXT: ret 67; 68; RV64I-LABEL: test: 69; RV64I: # %bb.0: 70; RV64I-NEXT: addi sp, sp, -2032 71; RV64I-NEXT: .cfi_def_cfa_offset 2032 72; RV64I-NEXT: sd ra, 2024(sp) # 8-byte Folded Spill 73; RV64I-NEXT: .cfi_offset ra, -8 74; RV64I-NEXT: addi sp, sp, -2048 75; RV64I-NEXT: addi sp, sp, -1120 76; RV64I-NEXT: .cfi_def_cfa_offset 5200 77; RV64I-NEXT: addi a0, sp, 8 78; RV64I-NEXT: addi a1, sp, 2047 79; RV64I-NEXT: addi a1, a1, 9 80; RV64I-NEXT: lui a2, 1 81; RV64I-NEXT: addiw a2, a2, 8 82; RV64I-NEXT: add a2, sp, a2 83; RV64I-NEXT: lui a3, 1 84; RV64I-NEXT: addiw a3, a3, 1032 85; RV64I-NEXT: add a3, sp, a3 86; RV64I-NEXT: call inspect 87; RV64I-NEXT: addi sp, sp, 2032 88; RV64I-NEXT: addi sp, sp, 1136 89; RV64I-NEXT: .cfi_def_cfa_offset 2032 90; RV64I-NEXT: ld ra, 2024(sp) # 8-byte Folded Reload 91; RV64I-NEXT: .cfi_restore ra 92; RV64I-NEXT: addi sp, sp, 2032 93; RV64I-NEXT: .cfi_def_cfa_offset 0 94; RV64I-NEXT: ret 95; 96; RV64ZBA-LABEL: test: 97; RV64ZBA: # %bb.0: 98; RV64ZBA-NEXT: addi sp, sp, -2032 99; RV64ZBA-NEXT: .cfi_def_cfa_offset 2032 100; RV64ZBA-NEXT: sd ra, 2024(sp) # 8-byte Folded Spill 101; RV64ZBA-NEXT: .cfi_offset ra, -8 102; RV64ZBA-NEXT: addi sp, sp, -2048 103; RV64ZBA-NEXT: addi sp, sp, -1120 104; RV64ZBA-NEXT: .cfi_def_cfa_offset 5200 105; RV64ZBA-NEXT: addi a0, sp, 8 106; RV64ZBA-NEXT: addi a1, sp, 2047 107; RV64ZBA-NEXT: addi a1, a1, 9 108; RV64ZBA-NEXT: li a2, 513 109; RV64ZBA-NEXT: sh3add a2, a2, sp 110; RV64ZBA-NEXT: li a3, 641 111; RV64ZBA-NEXT: sh3add a3, a3, sp 112; RV64ZBA-NEXT: call inspect 113; RV64ZBA-NEXT: addi sp, sp, 2032 114; RV64ZBA-NEXT: addi sp, sp, 1136 115; RV64ZBA-NEXT: .cfi_def_cfa_offset 2032 116; RV64ZBA-NEXT: ld ra, 2024(sp) # 8-byte Folded Reload 117; RV64ZBA-NEXT: .cfi_restore ra 118; RV64ZBA-NEXT: addi sp, sp, 2032 119; RV64ZBA-NEXT: .cfi_def_cfa_offset 0 120; RV64ZBA-NEXT: ret 121 %p4 = alloca [64 x i8], align 1 122 %p3 = alloca [1024 x i8], align 1 123 %p2 = alloca [2048 x i8], align 1 124 %p1 = alloca [2048 x i8], align 1 125 call void (...) @inspect(ptr %p1, ptr %p2, ptr %p3, ptr %p4) 126 ret void 127} 128 129define void @align_8() { 130; RV32I-LABEL: align_8: 131; RV32I: # %bb.0: 132; RV32I-NEXT: addi sp, sp, -2032 133; RV32I-NEXT: .cfi_def_cfa_offset 2032 134; RV32I-NEXT: sw ra, 2028(sp) # 4-byte Folded Spill 135; RV32I-NEXT: .cfi_offset ra, -4 136; RV32I-NEXT: addi sp, sp, -2048 137; RV32I-NEXT: addi sp, sp, -32 138; RV32I-NEXT: .cfi_def_cfa_offset 4112 139; RV32I-NEXT: addi a0, sp, 7 140; RV32I-NEXT: lui a1, 1 141; RV32I-NEXT: addi a1, a1, 8 142; RV32I-NEXT: add a1, sp, a1 143; RV32I-NEXT: call inspect 144; RV32I-NEXT: addi sp, sp, 2032 145; RV32I-NEXT: addi sp, sp, 48 146; RV32I-NEXT: .cfi_def_cfa_offset 2032 147; RV32I-NEXT: lw ra, 2028(sp) # 4-byte Folded Reload 148; RV32I-NEXT: .cfi_restore ra 149; RV32I-NEXT: addi sp, sp, 2032 150; RV32I-NEXT: .cfi_def_cfa_offset 0 151; RV32I-NEXT: ret 152; 153; RV32ZBA-LABEL: align_8: 154; RV32ZBA: # %bb.0: 155; RV32ZBA-NEXT: addi sp, sp, -2032 156; RV32ZBA-NEXT: .cfi_def_cfa_offset 2032 157; RV32ZBA-NEXT: sw ra, 2028(sp) # 4-byte Folded Spill 158; RV32ZBA-NEXT: .cfi_offset ra, -4 159; RV32ZBA-NEXT: addi sp, sp, -2048 160; RV32ZBA-NEXT: addi sp, sp, -32 161; RV32ZBA-NEXT: .cfi_def_cfa_offset 4112 162; RV32ZBA-NEXT: addi a0, sp, 7 163; RV32ZBA-NEXT: li a1, 513 164; RV32ZBA-NEXT: sh3add a1, a1, sp 165; RV32ZBA-NEXT: call inspect 166; RV32ZBA-NEXT: addi sp, sp, 2032 167; RV32ZBA-NEXT: addi sp, sp, 48 168; RV32ZBA-NEXT: .cfi_def_cfa_offset 2032 169; RV32ZBA-NEXT: lw ra, 2028(sp) # 4-byte Folded Reload 170; RV32ZBA-NEXT: .cfi_restore ra 171; RV32ZBA-NEXT: addi sp, sp, 2032 172; RV32ZBA-NEXT: .cfi_def_cfa_offset 0 173; RV32ZBA-NEXT: ret 174; 175; RV64I-LABEL: align_8: 176; RV64I: # %bb.0: 177; RV64I-NEXT: addi sp, sp, -2032 178; RV64I-NEXT: .cfi_def_cfa_offset 2032 179; RV64I-NEXT: sd ra, 2024(sp) # 8-byte Folded Spill 180; RV64I-NEXT: .cfi_offset ra, -8 181; RV64I-NEXT: addi sp, sp, -2048 182; RV64I-NEXT: addi sp, sp, -48 183; RV64I-NEXT: .cfi_def_cfa_offset 4128 184; RV64I-NEXT: addi a0, sp, 15 185; RV64I-NEXT: lui a1, 1 186; RV64I-NEXT: addiw a1, a1, 16 187; RV64I-NEXT: add a1, sp, a1 188; RV64I-NEXT: call inspect 189; RV64I-NEXT: addi sp, sp, 2032 190; RV64I-NEXT: addi sp, sp, 64 191; RV64I-NEXT: .cfi_def_cfa_offset 2032 192; RV64I-NEXT: ld ra, 2024(sp) # 8-byte Folded Reload 193; RV64I-NEXT: .cfi_restore ra 194; RV64I-NEXT: addi sp, sp, 2032 195; RV64I-NEXT: .cfi_def_cfa_offset 0 196; RV64I-NEXT: ret 197; 198; RV64ZBA-LABEL: align_8: 199; RV64ZBA: # %bb.0: 200; RV64ZBA-NEXT: addi sp, sp, -2032 201; RV64ZBA-NEXT: .cfi_def_cfa_offset 2032 202; RV64ZBA-NEXT: sd ra, 2024(sp) # 8-byte Folded Spill 203; RV64ZBA-NEXT: .cfi_offset ra, -8 204; RV64ZBA-NEXT: addi sp, sp, -2048 205; RV64ZBA-NEXT: addi sp, sp, -48 206; RV64ZBA-NEXT: .cfi_def_cfa_offset 4128 207; RV64ZBA-NEXT: addi a0, sp, 15 208; RV64ZBA-NEXT: li a1, 514 209; RV64ZBA-NEXT: sh3add a1, a1, sp 210; RV64ZBA-NEXT: call inspect 211; RV64ZBA-NEXT: addi sp, sp, 2032 212; RV64ZBA-NEXT: addi sp, sp, 64 213; RV64ZBA-NEXT: .cfi_def_cfa_offset 2032 214; RV64ZBA-NEXT: ld ra, 2024(sp) # 8-byte Folded Reload 215; RV64ZBA-NEXT: .cfi_restore ra 216; RV64ZBA-NEXT: addi sp, sp, 2032 217; RV64ZBA-NEXT: .cfi_def_cfa_offset 0 218; RV64ZBA-NEXT: ret 219 %p2 = alloca i8, align 8 220 %p1 = alloca [4097 x i8], align 1 221 call void (...) @inspect(ptr %p1, ptr %p2) 222 ret void 223} 224 225define void @align_4() { 226; RV32I-LABEL: align_4: 227; RV32I: # %bb.0: 228; RV32I-NEXT: addi sp, sp, -2032 229; RV32I-NEXT: .cfi_def_cfa_offset 2032 230; RV32I-NEXT: sw ra, 2028(sp) # 4-byte Folded Spill 231; RV32I-NEXT: .cfi_offset ra, -4 232; RV32I-NEXT: addi sp, sp, -2048 233; RV32I-NEXT: addi sp, sp, -32 234; RV32I-NEXT: .cfi_def_cfa_offset 4112 235; RV32I-NEXT: addi a0, sp, 7 236; RV32I-NEXT: lui a1, 1 237; RV32I-NEXT: addi a1, a1, 8 238; RV32I-NEXT: add a1, sp, a1 239; RV32I-NEXT: call inspect 240; RV32I-NEXT: addi sp, sp, 2032 241; RV32I-NEXT: addi sp, sp, 48 242; RV32I-NEXT: .cfi_def_cfa_offset 2032 243; RV32I-NEXT: lw ra, 2028(sp) # 4-byte Folded Reload 244; RV32I-NEXT: .cfi_restore ra 245; RV32I-NEXT: addi sp, sp, 2032 246; RV32I-NEXT: .cfi_def_cfa_offset 0 247; RV32I-NEXT: ret 248; 249; RV32ZBA-LABEL: align_4: 250; RV32ZBA: # %bb.0: 251; RV32ZBA-NEXT: addi sp, sp, -2032 252; RV32ZBA-NEXT: .cfi_def_cfa_offset 2032 253; RV32ZBA-NEXT: sw ra, 2028(sp) # 4-byte Folded Spill 254; RV32ZBA-NEXT: .cfi_offset ra, -4 255; RV32ZBA-NEXT: addi sp, sp, -2048 256; RV32ZBA-NEXT: addi sp, sp, -32 257; RV32ZBA-NEXT: .cfi_def_cfa_offset 4112 258; RV32ZBA-NEXT: addi a0, sp, 7 259; RV32ZBA-NEXT: li a1, 513 260; RV32ZBA-NEXT: sh3add a1, a1, sp 261; RV32ZBA-NEXT: call inspect 262; RV32ZBA-NEXT: addi sp, sp, 2032 263; RV32ZBA-NEXT: addi sp, sp, 48 264; RV32ZBA-NEXT: .cfi_def_cfa_offset 2032 265; RV32ZBA-NEXT: lw ra, 2028(sp) # 4-byte Folded Reload 266; RV32ZBA-NEXT: .cfi_restore ra 267; RV32ZBA-NEXT: addi sp, sp, 2032 268; RV32ZBA-NEXT: .cfi_def_cfa_offset 0 269; RV32ZBA-NEXT: ret 270; 271; RV64I-LABEL: align_4: 272; RV64I: # %bb.0: 273; RV64I-NEXT: addi sp, sp, -2032 274; RV64I-NEXT: .cfi_def_cfa_offset 2032 275; RV64I-NEXT: sd ra, 2024(sp) # 8-byte Folded Spill 276; RV64I-NEXT: .cfi_offset ra, -8 277; RV64I-NEXT: addi sp, sp, -2048 278; RV64I-NEXT: addi sp, sp, -48 279; RV64I-NEXT: .cfi_def_cfa_offset 4128 280; RV64I-NEXT: addi a0, sp, 19 281; RV64I-NEXT: lui a1, 1 282; RV64I-NEXT: addiw a1, a1, 20 283; RV64I-NEXT: add a1, sp, a1 284; RV64I-NEXT: call inspect 285; RV64I-NEXT: addi sp, sp, 2032 286; RV64I-NEXT: addi sp, sp, 64 287; RV64I-NEXT: .cfi_def_cfa_offset 2032 288; RV64I-NEXT: ld ra, 2024(sp) # 8-byte Folded Reload 289; RV64I-NEXT: .cfi_restore ra 290; RV64I-NEXT: addi sp, sp, 2032 291; RV64I-NEXT: .cfi_def_cfa_offset 0 292; RV64I-NEXT: ret 293; 294; RV64ZBA-LABEL: align_4: 295; RV64ZBA: # %bb.0: 296; RV64ZBA-NEXT: addi sp, sp, -2032 297; RV64ZBA-NEXT: .cfi_def_cfa_offset 2032 298; RV64ZBA-NEXT: sd ra, 2024(sp) # 8-byte Folded Spill 299; RV64ZBA-NEXT: .cfi_offset ra, -8 300; RV64ZBA-NEXT: addi sp, sp, -2048 301; RV64ZBA-NEXT: addi sp, sp, -48 302; RV64ZBA-NEXT: .cfi_def_cfa_offset 4128 303; RV64ZBA-NEXT: addi a0, sp, 19 304; RV64ZBA-NEXT: li a1, 1029 305; RV64ZBA-NEXT: sh2add a1, a1, sp 306; RV64ZBA-NEXT: call inspect 307; RV64ZBA-NEXT: addi sp, sp, 2032 308; RV64ZBA-NEXT: addi sp, sp, 64 309; RV64ZBA-NEXT: .cfi_def_cfa_offset 2032 310; RV64ZBA-NEXT: ld ra, 2024(sp) # 8-byte Folded Reload 311; RV64ZBA-NEXT: .cfi_restore ra 312; RV64ZBA-NEXT: addi sp, sp, 2032 313; RV64ZBA-NEXT: .cfi_def_cfa_offset 0 314; RV64ZBA-NEXT: ret 315 %p2 = alloca i8, align 4 316 %p1 = alloca [4097 x i8], align 1 317 call void (...) @inspect(ptr %p1, ptr %p2) 318 ret void 319} 320 321define void @align_2() { 322; RV32-LABEL: align_2: 323; RV32: # %bb.0: 324; RV32-NEXT: addi sp, sp, -2032 325; RV32-NEXT: .cfi_def_cfa_offset 2032 326; RV32-NEXT: sw ra, 2028(sp) # 4-byte Folded Spill 327; RV32-NEXT: .cfi_offset ra, -4 328; RV32-NEXT: addi sp, sp, -2048 329; RV32-NEXT: addi sp, sp, -32 330; RV32-NEXT: .cfi_def_cfa_offset 4112 331; RV32-NEXT: addi a0, sp, 9 332; RV32-NEXT: lui a1, 1 333; RV32-NEXT: addi a1, a1, 10 334; RV32-NEXT: add a1, sp, a1 335; RV32-NEXT: call inspect 336; RV32-NEXT: addi sp, sp, 2032 337; RV32-NEXT: addi sp, sp, 48 338; RV32-NEXT: .cfi_def_cfa_offset 2032 339; RV32-NEXT: lw ra, 2028(sp) # 4-byte Folded Reload 340; RV32-NEXT: .cfi_restore ra 341; RV32-NEXT: addi sp, sp, 2032 342; RV32-NEXT: .cfi_def_cfa_offset 0 343; RV32-NEXT: ret 344; 345; RV64-LABEL: align_2: 346; RV64: # %bb.0: 347; RV64-NEXT: addi sp, sp, -2032 348; RV64-NEXT: .cfi_def_cfa_offset 2032 349; RV64-NEXT: sd ra, 2024(sp) # 8-byte Folded Spill 350; RV64-NEXT: .cfi_offset ra, -8 351; RV64-NEXT: addi sp, sp, -2048 352; RV64-NEXT: addi sp, sp, -48 353; RV64-NEXT: .cfi_def_cfa_offset 4128 354; RV64-NEXT: addi a0, sp, 21 355; RV64-NEXT: lui a1, 1 356; RV64-NEXT: addiw a1, a1, 22 357; RV64-NEXT: add a1, sp, a1 358; RV64-NEXT: call inspect 359; RV64-NEXT: addi sp, sp, 2032 360; RV64-NEXT: addi sp, sp, 64 361; RV64-NEXT: .cfi_def_cfa_offset 2032 362; RV64-NEXT: ld ra, 2024(sp) # 8-byte Folded Reload 363; RV64-NEXT: .cfi_restore ra 364; RV64-NEXT: addi sp, sp, 2032 365; RV64-NEXT: .cfi_def_cfa_offset 0 366; RV64-NEXT: ret 367 %p2 = alloca i8, align 2 368 %p1 = alloca [4097 x i8], align 1 369 call void (...) @inspect(ptr %p1, ptr %p2) 370 ret void 371} 372 373 374define void @align_1() { 375; RV32-LABEL: align_1: 376; RV32: # %bb.0: 377; RV32-NEXT: addi sp, sp, -2032 378; RV32-NEXT: .cfi_def_cfa_offset 2032 379; RV32-NEXT: sw ra, 2028(sp) # 4-byte Folded Spill 380; RV32-NEXT: .cfi_offset ra, -4 381; RV32-NEXT: addi sp, sp, -2048 382; RV32-NEXT: addi sp, sp, -32 383; RV32-NEXT: .cfi_def_cfa_offset 4112 384; RV32-NEXT: addi a0, sp, 10 385; RV32-NEXT: lui a1, 1 386; RV32-NEXT: addi a1, a1, 11 387; RV32-NEXT: add a1, sp, a1 388; RV32-NEXT: call inspect 389; RV32-NEXT: addi sp, sp, 2032 390; RV32-NEXT: addi sp, sp, 48 391; RV32-NEXT: .cfi_def_cfa_offset 2032 392; RV32-NEXT: lw ra, 2028(sp) # 4-byte Folded Reload 393; RV32-NEXT: .cfi_restore ra 394; RV32-NEXT: addi sp, sp, 2032 395; RV32-NEXT: .cfi_def_cfa_offset 0 396; RV32-NEXT: ret 397; 398; RV64-LABEL: align_1: 399; RV64: # %bb.0: 400; RV64-NEXT: addi sp, sp, -2032 401; RV64-NEXT: .cfi_def_cfa_offset 2032 402; RV64-NEXT: sd ra, 2024(sp) # 8-byte Folded Spill 403; RV64-NEXT: .cfi_offset ra, -8 404; RV64-NEXT: addi sp, sp, -2048 405; RV64-NEXT: addi sp, sp, -48 406; RV64-NEXT: .cfi_def_cfa_offset 4128 407; RV64-NEXT: addi a0, sp, 22 408; RV64-NEXT: lui a1, 1 409; RV64-NEXT: addiw a1, a1, 23 410; RV64-NEXT: add a1, sp, a1 411; RV64-NEXT: call inspect 412; RV64-NEXT: addi sp, sp, 2032 413; RV64-NEXT: addi sp, sp, 64 414; RV64-NEXT: .cfi_def_cfa_offset 2032 415; RV64-NEXT: ld ra, 2024(sp) # 8-byte Folded Reload 416; RV64-NEXT: .cfi_restore ra 417; RV64-NEXT: addi sp, sp, 2032 418; RV64-NEXT: .cfi_def_cfa_offset 0 419; RV64-NEXT: ret 420 %p2 = alloca i8, align 1 421 %p1 = alloca [4097 x i8], align 1 422 call void (...) @inspect(ptr %p1, ptr %p2) 423 ret void 424} 425