1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=ve | FileCheck %s 3; RUN: llc < %s -mtriple=ve --frame-pointer=all \ 4; RUN: | FileCheck %s --check-prefix=CHECKFP 5 6;;; Check stack frame allocation with static and dynamic stack object with 7;;; alignments as a test of getFrameIndexReference(). 8 9;; Allocated buffer places from 9 to 15 bytes in 16 bytes local vars area. 10 11; Function Attrs: nounwind 12define i8* @test_frame7(i8* %0) { 13; CHECK-LABEL: test_frame7: 14; CHECK: # %bb.0: 15; CHECK-NEXT: adds.l %s11, -16, %s11 16; CHECK-NEXT: brge.l.t %s11, %s8, .LBB0_2 17; CHECK-NEXT: # %bb.1: 18; CHECK-NEXT: ld %s61, 24(, %s14) 19; CHECK-NEXT: or %s62, 0, %s0 20; CHECK-NEXT: lea %s63, 315 21; CHECK-NEXT: shm.l %s63, (%s61) 22; CHECK-NEXT: shm.l %s8, 8(%s61) 23; CHECK-NEXT: shm.l %s11, 16(%s61) 24; CHECK-NEXT: monc 25; CHECK-NEXT: or %s0, 0, %s62 26; CHECK-NEXT: .LBB0_2: 27; CHECK-NEXT: ld1b.zx %s1, (, %s0) 28; CHECK-NEXT: lea %s0, 9(, %s11) 29; CHECK-NEXT: st1b %s1, 9(, %s11) 30; CHECK-NEXT: adds.l %s11, 16, %s11 31; CHECK-NEXT: b.l.t (, %s10) 32; 33; CHECKFP-LABEL: test_frame7: 34; CHECKFP: # %bb.0: 35; CHECKFP-NEXT: st %s9, (, %s11) 36; CHECKFP-NEXT: st %s10, 8(, %s11) 37; CHECKFP-NEXT: or %s9, 0, %s11 38; CHECKFP-NEXT: lea %s11, -192(, %s11) 39; CHECKFP-NEXT: brge.l.t %s11, %s8, .LBB0_2 40; CHECKFP-NEXT: # %bb.1: 41; CHECKFP-NEXT: ld %s61, 24(, %s14) 42; CHECKFP-NEXT: or %s62, 0, %s0 43; CHECKFP-NEXT: lea %s63, 315 44; CHECKFP-NEXT: shm.l %s63, (%s61) 45; CHECKFP-NEXT: shm.l %s8, 8(%s61) 46; CHECKFP-NEXT: shm.l %s11, 16(%s61) 47; CHECKFP-NEXT: monc 48; CHECKFP-NEXT: or %s0, 0, %s62 49; CHECKFP-NEXT: .LBB0_2: 50; CHECKFP-NEXT: ld1b.zx %s1, (, %s0) 51; CHECKFP-NEXT: lea %s0, -7(, %s9) 52; CHECKFP-NEXT: st1b %s1, -7(, %s9) 53; CHECKFP-NEXT: or %s11, 0, %s9 54; CHECKFP-NEXT: ld %s10, 8(, %s11) 55; CHECKFP-NEXT: ld %s9, (, %s11) 56; CHECKFP-NEXT: b.l.t (, %s10) 57 %2 = alloca [7 x i8], align 1 58 %3 = getelementptr inbounds [7 x i8], [7 x i8]* %2, i64 0, i64 0 59 %4 = load i8, i8* %0, align 1 60 store i8 %4, i8* %3, align 1 61 ret i8* %3 62} 63 64;; Allocated buffer is aligned by 8, so it places from 8 to 14 bytes in 16 65;; bytes local vars area. 66 67; Function Attrs: nounwind 68define i8* @test_frame7_align8(i8* %0) { 69; CHECK-LABEL: test_frame7_align8: 70; CHECK: # %bb.0: 71; CHECK-NEXT: adds.l %s11, -16, %s11 72; CHECK-NEXT: brge.l.t %s11, %s8, .LBB1_2 73; CHECK-NEXT: # %bb.1: 74; CHECK-NEXT: ld %s61, 24(, %s14) 75; CHECK-NEXT: or %s62, 0, %s0 76; CHECK-NEXT: lea %s63, 315 77; CHECK-NEXT: shm.l %s63, (%s61) 78; CHECK-NEXT: shm.l %s8, 8(%s61) 79; CHECK-NEXT: shm.l %s11, 16(%s61) 80; CHECK-NEXT: monc 81; CHECK-NEXT: or %s0, 0, %s62 82; CHECK-NEXT: .LBB1_2: 83; CHECK-NEXT: ld1b.zx %s1, (, %s0) 84; CHECK-NEXT: lea %s0, 8(, %s11) 85; CHECK-NEXT: st1b %s1, 8(, %s11) 86; CHECK-NEXT: adds.l %s11, 16, %s11 87; CHECK-NEXT: b.l.t (, %s10) 88; 89; CHECKFP-LABEL: test_frame7_align8: 90; CHECKFP: # %bb.0: 91; CHECKFP-NEXT: st %s9, (, %s11) 92; CHECKFP-NEXT: st %s10, 8(, %s11) 93; CHECKFP-NEXT: or %s9, 0, %s11 94; CHECKFP-NEXT: lea %s11, -192(, %s11) 95; CHECKFP-NEXT: brge.l.t %s11, %s8, .LBB1_2 96; CHECKFP-NEXT: # %bb.1: 97; CHECKFP-NEXT: ld %s61, 24(, %s14) 98; CHECKFP-NEXT: or %s62, 0, %s0 99; CHECKFP-NEXT: lea %s63, 315 100; CHECKFP-NEXT: shm.l %s63, (%s61) 101; CHECKFP-NEXT: shm.l %s8, 8(%s61) 102; CHECKFP-NEXT: shm.l %s11, 16(%s61) 103; CHECKFP-NEXT: monc 104; CHECKFP-NEXT: or %s0, 0, %s62 105; CHECKFP-NEXT: .LBB1_2: 106; CHECKFP-NEXT: ld1b.zx %s1, (, %s0) 107; CHECKFP-NEXT: lea %s0, -8(, %s9) 108; CHECKFP-NEXT: st1b %s1, -8(, %s9) 109; CHECKFP-NEXT: or %s11, 0, %s9 110; CHECKFP-NEXT: ld %s10, 8(, %s11) 111; CHECKFP-NEXT: ld %s9, (, %s11) 112; CHECKFP-NEXT: b.l.t (, %s10) 113 %2 = alloca [7 x i8], align 8 114 %3 = getelementptr inbounds [7 x i8], [7 x i8]* %2, i64 0, i64 0 115 %4 = load i8, i8* %0, align 1 116 store i8 %4, i8* %3, align 1 117 ret i8* %3 118} 119 120;; Allocated buffer is aligned by 16, so it places from 0 to 15 bytes in 16 121;; bytes local vars area. 122 123; Function Attrs: nounwind 124define i8* @test_frame16_align16(i8* %0) { 125; CHECK-LABEL: test_frame16_align16: 126; CHECK: # %bb.0: 127; CHECK-NEXT: adds.l %s11, -16, %s11 128; CHECK-NEXT: brge.l.t %s11, %s8, .LBB2_2 129; CHECK-NEXT: # %bb.1: 130; CHECK-NEXT: ld %s61, 24(, %s14) 131; CHECK-NEXT: or %s62, 0, %s0 132; CHECK-NEXT: lea %s63, 315 133; CHECK-NEXT: shm.l %s63, (%s61) 134; CHECK-NEXT: shm.l %s8, 8(%s61) 135; CHECK-NEXT: shm.l %s11, 16(%s61) 136; CHECK-NEXT: monc 137; CHECK-NEXT: or %s0, 0, %s62 138; CHECK-NEXT: .LBB2_2: 139; CHECK-NEXT: ld1b.zx %s1, (, %s0) 140; CHECK-NEXT: lea %s0, (, %s11) 141; CHECK-NEXT: st1b %s1, (, %s11) 142; CHECK-NEXT: adds.l %s11, 16, %s11 143; CHECK-NEXT: b.l.t (, %s10) 144; 145; CHECKFP-LABEL: test_frame16_align16: 146; CHECKFP: # %bb.0: 147; CHECKFP-NEXT: st %s9, (, %s11) 148; CHECKFP-NEXT: st %s10, 8(, %s11) 149; CHECKFP-NEXT: or %s9, 0, %s11 150; CHECKFP-NEXT: lea %s11, -192(, %s11) 151; CHECKFP-NEXT: brge.l.t %s11, %s8, .LBB2_2 152; CHECKFP-NEXT: # %bb.1: 153; CHECKFP-NEXT: ld %s61, 24(, %s14) 154; CHECKFP-NEXT: or %s62, 0, %s0 155; CHECKFP-NEXT: lea %s63, 315 156; CHECKFP-NEXT: shm.l %s63, (%s61) 157; CHECKFP-NEXT: shm.l %s8, 8(%s61) 158; CHECKFP-NEXT: shm.l %s11, 16(%s61) 159; CHECKFP-NEXT: monc 160; CHECKFP-NEXT: or %s0, 0, %s62 161; CHECKFP-NEXT: .LBB2_2: 162; CHECKFP-NEXT: ld1b.zx %s1, (, %s0) 163; CHECKFP-NEXT: lea %s0, -16(, %s9) 164; CHECKFP-NEXT: st1b %s1, -16(, %s9) 165; CHECKFP-NEXT: or %s11, 0, %s9 166; CHECKFP-NEXT: ld %s10, 8(, %s11) 167; CHECKFP-NEXT: ld %s9, (, %s11) 168; CHECKFP-NEXT: b.l.t (, %s10) 169 %2 = alloca [16 x i8], align 16 170 %3 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 0 171 %4 = load i8, i8* %0, align 1 172 store i8 %4, i8* %3, align 1 173 ret i8* %3 174} 175 176;; Allocated buffer is aligned by 32, so it places from 0 to 15 bytes in 48 177;; bytes local vars area. Or it places from 192 (aligned to 32 bytes) to 178;; 207 bytes in 224 + alpha allocated local vars area. 179 180; Function Attrs: nounwind 181define i8* @test_frame16_align32(i8* %0) { 182; CHECK-LABEL: test_frame16_align32: 183; CHECK: # %bb.0: 184; CHECK-NEXT: st %s9, (, %s11) 185; CHECK-NEXT: st %s10, 8(, %s11) 186; CHECK-NEXT: or %s9, 0, %s11 187; CHECK-NEXT: lea %s11, -224(, %s11) 188; CHECK-NEXT: and %s11, %s11, (59)1 189; CHECK-NEXT: brge.l.t %s11, %s8, .LBB3_2 190; CHECK-NEXT: # %bb.1: 191; CHECK-NEXT: ld %s61, 24(, %s14) 192; CHECK-NEXT: or %s62, 0, %s0 193; CHECK-NEXT: lea %s63, 315 194; CHECK-NEXT: shm.l %s63, (%s61) 195; CHECK-NEXT: shm.l %s8, 8(%s61) 196; CHECK-NEXT: shm.l %s11, 16(%s61) 197; CHECK-NEXT: monc 198; CHECK-NEXT: or %s0, 0, %s62 199; CHECK-NEXT: .LBB3_2: 200; CHECK-NEXT: ld1b.zx %s1, (, %s0) 201; CHECK-NEXT: lea %s0, 192(, %s11) 202; CHECK-NEXT: st1b %s1, 192(, %s11) 203; CHECK-NEXT: or %s11, 0, %s9 204; CHECK-NEXT: ld %s10, 8(, %s11) 205; CHECK-NEXT: ld %s9, (, %s11) 206; CHECK-NEXT: b.l.t (, %s10) 207; 208; CHECKFP-LABEL: test_frame16_align32: 209; CHECKFP: # %bb.0: 210; CHECKFP-NEXT: st %s9, (, %s11) 211; CHECKFP-NEXT: st %s10, 8(, %s11) 212; CHECKFP-NEXT: or %s9, 0, %s11 213; CHECKFP-NEXT: lea %s11, -224(, %s11) 214; CHECKFP-NEXT: and %s11, %s11, (59)1 215; CHECKFP-NEXT: brge.l.t %s11, %s8, .LBB3_2 216; CHECKFP-NEXT: # %bb.1: 217; CHECKFP-NEXT: ld %s61, 24(, %s14) 218; CHECKFP-NEXT: or %s62, 0, %s0 219; CHECKFP-NEXT: lea %s63, 315 220; CHECKFP-NEXT: shm.l %s63, (%s61) 221; CHECKFP-NEXT: shm.l %s8, 8(%s61) 222; CHECKFP-NEXT: shm.l %s11, 16(%s61) 223; CHECKFP-NEXT: monc 224; CHECKFP-NEXT: or %s0, 0, %s62 225; CHECKFP-NEXT: .LBB3_2: 226; CHECKFP-NEXT: ld1b.zx %s1, (, %s0) 227; CHECKFP-NEXT: lea %s0, 192(, %s11) 228; CHECKFP-NEXT: st1b %s1, 192(, %s11) 229; CHECKFP-NEXT: or %s11, 0, %s9 230; CHECKFP-NEXT: ld %s10, 8(, %s11) 231; CHECKFP-NEXT: ld %s9, (, %s11) 232; CHECKFP-NEXT: b.l.t (, %s10) 233 %2 = alloca [16 x i8], align 32 234 %3 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 0 235 %4 = load i8, i8* %0, align 1 236 store i8 %4, i8* %3, align 1 237 ret i8* %3 238} 239 240;; Allocated buffer is aligned by 32, so it places from 0 to 31 bytes in 48 241;; + alpha bytes local vars area, or it places from 192 (32 bytes aligned 176) 242;; to 223 in 224 + alpha bytes local vars area.. 243 244; Function Attrs: nounwind 245define i8* @test_frame32_align32(i8* %0) { 246; CHECK-LABEL: test_frame32_align32: 247; CHECK: # %bb.0: 248; CHECK-NEXT: st %s9, (, %s11) 249; CHECK-NEXT: st %s10, 8(, %s11) 250; CHECK-NEXT: or %s9, 0, %s11 251; CHECK-NEXT: lea %s11, -224(, %s11) 252; CHECK-NEXT: and %s11, %s11, (59)1 253; CHECK-NEXT: brge.l.t %s11, %s8, .LBB4_2 254; CHECK-NEXT: # %bb.1: 255; CHECK-NEXT: ld %s61, 24(, %s14) 256; CHECK-NEXT: or %s62, 0, %s0 257; CHECK-NEXT: lea %s63, 315 258; CHECK-NEXT: shm.l %s63, (%s61) 259; CHECK-NEXT: shm.l %s8, 8(%s61) 260; CHECK-NEXT: shm.l %s11, 16(%s61) 261; CHECK-NEXT: monc 262; CHECK-NEXT: or %s0, 0, %s62 263; CHECK-NEXT: .LBB4_2: 264; CHECK-NEXT: ld1b.zx %s1, (, %s0) 265; CHECK-NEXT: lea %s0, 192(, %s11) 266; CHECK-NEXT: st1b %s1, 192(, %s11) 267; CHECK-NEXT: or %s11, 0, %s9 268; CHECK-NEXT: ld %s10, 8(, %s11) 269; CHECK-NEXT: ld %s9, (, %s11) 270; CHECK-NEXT: b.l.t (, %s10) 271; 272; CHECKFP-LABEL: test_frame32_align32: 273; CHECKFP: # %bb.0: 274; CHECKFP-NEXT: st %s9, (, %s11) 275; CHECKFP-NEXT: st %s10, 8(, %s11) 276; CHECKFP-NEXT: or %s9, 0, %s11 277; CHECKFP-NEXT: lea %s11, -224(, %s11) 278; CHECKFP-NEXT: and %s11, %s11, (59)1 279; CHECKFP-NEXT: brge.l.t %s11, %s8, .LBB4_2 280; CHECKFP-NEXT: # %bb.1: 281; CHECKFP-NEXT: ld %s61, 24(, %s14) 282; CHECKFP-NEXT: or %s62, 0, %s0 283; CHECKFP-NEXT: lea %s63, 315 284; CHECKFP-NEXT: shm.l %s63, (%s61) 285; CHECKFP-NEXT: shm.l %s8, 8(%s61) 286; CHECKFP-NEXT: shm.l %s11, 16(%s61) 287; CHECKFP-NEXT: monc 288; CHECKFP-NEXT: or %s0, 0, %s62 289; CHECKFP-NEXT: .LBB4_2: 290; CHECKFP-NEXT: ld1b.zx %s1, (, %s0) 291; CHECKFP-NEXT: lea %s0, 192(, %s11) 292; CHECKFP-NEXT: st1b %s1, 192(, %s11) 293; CHECKFP-NEXT: or %s11, 0, %s9 294; CHECKFP-NEXT: ld %s10, 8(, %s11) 295; CHECKFP-NEXT: ld %s9, (, %s11) 296; CHECKFP-NEXT: b.l.t (, %s10) 297 %2 = alloca [32 x i8], align 32 298 %3 = getelementptr inbounds [32 x i8], [32 x i8]* %2, i64 0, i64 0 299 %4 = load i8, i8* %0, align 1 300 store i8 %4, i8* %3, align 1 301 ret i8* %3 302} 303 304;; Dynamically allocated buffer is aligned by 16, so it places from 0 to 31 305;; bytes in allocated area, or it places from 240 (32 bytes aligned 176+64) 306;; to 271 in allocated area (actually it places not newly allocated area 307;; but in somewhere between newly allocated area and allocated area at the 308;; prologue since VE ABI requires the reserved area at the top of stack). 309 310;; FIXME: (size+15)/16*16 is not enough. 311 312; Function Attrs: nounwind 313define i8* @test_frame_dynalign16(i8* %0, i64 %1) { 314; CHECK-LABEL: test_frame_dynalign16: 315; CHECK: # %bb.0: 316; CHECK-NEXT: st %s9, (, %s11) 317; CHECK-NEXT: st %s10, 8(, %s11) 318; CHECK-NEXT: or %s9, 0, %s11 319; CHECK-NEXT: lea %s11, -240(, %s11) 320; CHECK-NEXT: brge.l.t %s11, %s8, .LBB5_2 321; CHECK-NEXT: # %bb.1: 322; CHECK-NEXT: ld %s61, 24(, %s14) 323; CHECK-NEXT: or %s62, 0, %s0 324; CHECK-NEXT: lea %s63, 315 325; CHECK-NEXT: shm.l %s63, (%s61) 326; CHECK-NEXT: shm.l %s8, 8(%s61) 327; CHECK-NEXT: shm.l %s11, 16(%s61) 328; CHECK-NEXT: monc 329; CHECK-NEXT: or %s0, 0, %s62 330; CHECK-NEXT: .LBB5_2: 331; CHECK-NEXT: or %s2, 0, %s0 332; CHECK-NEXT: lea %s0, 15(, %s1) 333; CHECK-NEXT: and %s0, -16, %s0 334; CHECK-NEXT: lea %s1, __ve_grow_stack@lo 335; CHECK-NEXT: and %s1, %s1, (32)0 336; CHECK-NEXT: lea.sl %s12, __ve_grow_stack@hi(, %s1) 337; CHECK-NEXT: bsic %s10, (, %s12) 338; CHECK-NEXT: lea %s0, 240(, %s11) 339; CHECK-NEXT: ld1b.zx %s1, (, %s2) 340; CHECK-NEXT: st1b %s1, (, %s0) 341; CHECK-NEXT: or %s11, 0, %s9 342; CHECK-NEXT: ld %s10, 8(, %s11) 343; CHECK-NEXT: ld %s9, (, %s11) 344; CHECK-NEXT: b.l.t (, %s10) 345; 346; CHECKFP-LABEL: test_frame_dynalign16: 347; CHECKFP: # %bb.0: 348; CHECKFP-NEXT: st %s9, (, %s11) 349; CHECKFP-NEXT: st %s10, 8(, %s11) 350; CHECKFP-NEXT: or %s9, 0, %s11 351; CHECKFP-NEXT: lea %s11, -240(, %s11) 352; CHECKFP-NEXT: brge.l.t %s11, %s8, .LBB5_2 353; CHECKFP-NEXT: # %bb.1: 354; CHECKFP-NEXT: ld %s61, 24(, %s14) 355; CHECKFP-NEXT: or %s62, 0, %s0 356; CHECKFP-NEXT: lea %s63, 315 357; CHECKFP-NEXT: shm.l %s63, (%s61) 358; CHECKFP-NEXT: shm.l %s8, 8(%s61) 359; CHECKFP-NEXT: shm.l %s11, 16(%s61) 360; CHECKFP-NEXT: monc 361; CHECKFP-NEXT: or %s0, 0, %s62 362; CHECKFP-NEXT: .LBB5_2: 363; CHECKFP-NEXT: or %s2, 0, %s0 364; CHECKFP-NEXT: lea %s0, 15(, %s1) 365; CHECKFP-NEXT: and %s0, -16, %s0 366; CHECKFP-NEXT: lea %s1, __ve_grow_stack@lo 367; CHECKFP-NEXT: and %s1, %s1, (32)0 368; CHECKFP-NEXT: lea.sl %s12, __ve_grow_stack@hi(, %s1) 369; CHECKFP-NEXT: bsic %s10, (, %s12) 370; CHECKFP-NEXT: lea %s0, 240(, %s11) 371; CHECKFP-NEXT: ld1b.zx %s1, (, %s2) 372; CHECKFP-NEXT: st1b %s1, (, %s0) 373; CHECKFP-NEXT: or %s11, 0, %s9 374; CHECKFP-NEXT: ld %s10, 8(, %s11) 375; CHECKFP-NEXT: ld %s9, (, %s11) 376; CHECKFP-NEXT: b.l.t (, %s10) 377 %3 = alloca i8, i64 %1, align 16 378 %4 = load i8, i8* %0, align 1 379 store i8 %4, i8* %3, align 1 380 ret i8* %3 381} 382 383;; This test allocates static buffer with 16 bytes align and dynamic buffer 384;; with 32 bytes align. In LLVM, stack frame is always aligned to 32 bytes 385;; (bigger one). So, LLVM allocates 176 (RSA) + 64 (call site) + 32 (32 bytes 386;; aligned 16 bytes data) + 16 (pad to align) if FP is not eliminated. 387;; Statically allocated buffer is aligned to 16, so it places from 16 to 31 388;; bytes from BP in 32 + alpha bytes local vars area, or it places from 272 389;; to 287 bytes from BP in 288 + alpha bytes local vars area. 390;; Dynamically allocated buffer is aligned to 32, so it places from aligned 391;; address between 240 and 271 from SP. 392 393; Function Attrs: nounwind 394define i8* @test_frame16_align16_dynalign32(i8* %0, i64 %n) { 395; CHECK-LABEL: test_frame16_align16_dynalign32: 396; CHECK: # %bb.0: 397; CHECK-NEXT: st %s9, (, %s11) 398; CHECK-NEXT: st %s10, 8(, %s11) 399; CHECK-NEXT: st %s17, 40(, %s11) 400; CHECK-NEXT: or %s9, 0, %s11 401; CHECK-NEXT: lea %s11, -288(, %s11) 402; CHECK-NEXT: and %s11, %s11, (59)1 403; CHECK-NEXT: or %s17, 0, %s11 404; CHECK-NEXT: brge.l.t %s11, %s8, .LBB6_2 405; CHECK-NEXT: # %bb.1: 406; CHECK-NEXT: ld %s61, 24(, %s14) 407; CHECK-NEXT: or %s62, 0, %s0 408; CHECK-NEXT: lea %s63, 315 409; CHECK-NEXT: shm.l %s63, (%s61) 410; CHECK-NEXT: shm.l %s8, 8(%s61) 411; CHECK-NEXT: shm.l %s11, 16(%s61) 412; CHECK-NEXT: monc 413; CHECK-NEXT: or %s0, 0, %s62 414; CHECK-NEXT: .LBB6_2: 415; CHECK-NEXT: ld1b.zx %s0, (, %s0) 416; CHECK-NEXT: st1b %s0, 272(, %s17) 417; CHECK-NEXT: lea %s0, 15(, %s1) 418; CHECK-NEXT: and %s0, -16, %s0 419; CHECK-NEXT: lea %s1, __ve_grow_stack_align@lo 420; CHECK-NEXT: and %s1, %s1, (32)0 421; CHECK-NEXT: lea.sl %s12, __ve_grow_stack_align@hi(, %s1) 422; CHECK-NEXT: or %s1, -32, (0)1 423; CHECK-NEXT: bsic %s10, (, %s12) 424; CHECK-NEXT: lea %s0, 240(, %s11) 425; CHECK-NEXT: ld1b.zx %s1, 272(, %s17) 426; CHECK-NEXT: lea %s0, 31(, %s0) 427; CHECK-NEXT: and %s0, -32, %s0 428; CHECK-NEXT: st1b %s1, (, %s0) 429; CHECK-NEXT: or %s11, 0, %s9 430; CHECK-NEXT: ld %s17, 40(, %s11) 431; CHECK-NEXT: ld %s10, 8(, %s11) 432; CHECK-NEXT: ld %s9, (, %s11) 433; CHECK-NEXT: b.l.t (, %s10) 434; 435; CHECKFP-LABEL: test_frame16_align16_dynalign32: 436; CHECKFP: # %bb.0: 437; CHECKFP-NEXT: st %s9, (, %s11) 438; CHECKFP-NEXT: st %s10, 8(, %s11) 439; CHECKFP-NEXT: st %s17, 40(, %s11) 440; CHECKFP-NEXT: or %s9, 0, %s11 441; CHECKFP-NEXT: lea %s11, -288(, %s11) 442; CHECKFP-NEXT: and %s11, %s11, (59)1 443; CHECKFP-NEXT: or %s17, 0, %s11 444; CHECKFP-NEXT: brge.l.t %s11, %s8, .LBB6_2 445; CHECKFP-NEXT: # %bb.1: 446; CHECKFP-NEXT: ld %s61, 24(, %s14) 447; CHECKFP-NEXT: or %s62, 0, %s0 448; CHECKFP-NEXT: lea %s63, 315 449; CHECKFP-NEXT: shm.l %s63, (%s61) 450; CHECKFP-NEXT: shm.l %s8, 8(%s61) 451; CHECKFP-NEXT: shm.l %s11, 16(%s61) 452; CHECKFP-NEXT: monc 453; CHECKFP-NEXT: or %s0, 0, %s62 454; CHECKFP-NEXT: .LBB6_2: 455; CHECKFP-NEXT: ld1b.zx %s0, (, %s0) 456; CHECKFP-NEXT: st1b %s0, 272(, %s17) 457; CHECKFP-NEXT: lea %s0, 15(, %s1) 458; CHECKFP-NEXT: and %s0, -16, %s0 459; CHECKFP-NEXT: lea %s1, __ve_grow_stack_align@lo 460; CHECKFP-NEXT: and %s1, %s1, (32)0 461; CHECKFP-NEXT: lea.sl %s12, __ve_grow_stack_align@hi(, %s1) 462; CHECKFP-NEXT: or %s1, -32, (0)1 463; CHECKFP-NEXT: bsic %s10, (, %s12) 464; CHECKFP-NEXT: lea %s0, 240(, %s11) 465; CHECKFP-NEXT: ld1b.zx %s1, 272(, %s17) 466; CHECKFP-NEXT: lea %s0, 31(, %s0) 467; CHECKFP-NEXT: and %s0, -32, %s0 468; CHECKFP-NEXT: st1b %s1, (, %s0) 469; CHECKFP-NEXT: or %s11, 0, %s9 470; CHECKFP-NEXT: ld %s17, 40(, %s11) 471; CHECKFP-NEXT: ld %s10, 8(, %s11) 472; CHECKFP-NEXT: ld %s9, (, %s11) 473; CHECKFP-NEXT: b.l.t (, %s10) 474 %2 = alloca [16 x i8], align 16 475 %3 = getelementptr inbounds [16 x i8], [16 x i8]* %2, i64 0, i64 0 476 %4 = load i8, i8* %0, align 1 477 store i8 %4, i8* %3, align 1 478 %5 = alloca i8, i64 %n, align 32 479 %6 = load i8, i8* %3, align 1 480 store i8 %6, i8* %5, align 1 481 ret i8* %5 482} 483 484