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