796 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=ve | FileCheck %s3 4;;; Test store instructions5;;;6;;; Note:7;;; We test store instructions using general stack, stack with dynamic8;;; allocation, stack with dynamic allocation and alignment, and stack9;;; with dynamic allocation, alignment, and spill.10;;;11;;; Fist test using a stack for leaf function.12;;;13;;; | | Higher address14;;; |----------------------------------------------| <- old sp15;;; | Local variables of fixed size |16;;; |----------------------------------------------| <- sp17;;; | | Lower address18;;;19;;; Access local variable using sp (%s11). In addition, please remember20;;; that stack is aligned by 16 bytes.21;;;22;;; Second test using a general stack.23;;;24;;; | | Higher address25;;; |----------------------------------------------|26;;; | Parameter area for this function |27;;; |----------------------------------------------|28;;; | Register save area (RSA) for this function |29;;; |----------------------------------------------|30;;; | Return address for this function |31;;; |----------------------------------------------|32;;; | Frame pointer for this function |33;;; |----------------------------------------------| <- fp(=old sp)34;;; | Local variables of fixed size |35;;; |----------------------------------------------|36;;; |.variable-sized.local.variables.(VLAs)........|37;;; |..............................................|38;;; |..............................................|39;;; |----------------------------------------------| <- returned by alloca40;;; | Parameter area for callee |41;;; |----------------------------------------------|42;;; | Register save area (RSA) for callee |43;;; |----------------------------------------------|44;;; | Return address for callee |45;;; |----------------------------------------------|46;;; | Frame pointer for callee |47;;; |----------------------------------------------| <- sp48;;; | | Lower address49;;;50;;; Access local variable using fp (%s9) since the size of VLA is not51;;; known. At the beginning of the functions, allocates 240 + data52;;; bytes. 240 means RSA+RA+FP (=176) + Parameter (=64).53;;;54;;; Third test using a general stack.55;;;56;;; | | Higher address57;;; |----------------------------------------------|58;;; | Parameter area for this function |59;;; |----------------------------------------------|60;;; | Register save area (RSA) for this function |61;;; |----------------------------------------------|62;;; | Return address for this function |63;;; |----------------------------------------------|64;;; | Frame pointer for this function |65;;; |----------------------------------------------| <- fp(=old sp)66;;; |.empty.space.to.make.part.below.aligned.in....|67;;; |.case.it.needs.more.than.the.standard.16-byte.| (size of this area is68;;; |.alignment....................................| unknown at compile time)69;;; |----------------------------------------------|70;;; | Local variables of fixed size including spill|71;;; | slots |72;;; |----------------------------------------------| <- bp(not defined by ABI,73;;; |.variable-sized.local.variables.(VLAs)........| LLVM chooses SX17)74;;; |..............................................| (size of this area is75;;; |..............................................| unknown at compile time)76;;; |----------------------------------------------| <- stack top (returned by77;;; | Parameter area for callee | alloca)78;;; |----------------------------------------------|79;;; | Register save area (RSA) for callee |80;;; |----------------------------------------------|81;;; | Return address for callee |82;;; |----------------------------------------------|83;;; | Frame pointer for callee |84;;; |----------------------------------------------| <- sp85;;; | | Lower address86;;;87;;; Access local variable using bp (%s17) since the size of alignment88;;; and VLA are not known. At the beginning of the functions, allocates89;;; pad(240 + data + align) bytes. Then, access data through bp + pad(240)90;;; since this address doesn't change even if VLA is dynamically allocated.91;;;92;;; Fourth test using a general stack with some spills.93;;;94 95; Function Attrs: argmemonly mustprogress nofree nounwind willreturn96define x86_fastcallcc i64 @loadi64_stk() {97; CHECK-LABEL: loadi64_stk:98; CHECK: # %bb.0:99; CHECK-NEXT: adds.l %s11, -16, %s11100; CHECK-NEXT: brge.l.t %s11, %s8, .LBB0_2101; CHECK-NEXT: # %bb.1:102; CHECK-NEXT: ld %s61, 24(, %s14)103; CHECK-NEXT: or %s62, 0, %s0104; CHECK-NEXT: lea %s63, 315105; CHECK-NEXT: shm.l %s63, (%s61)106; CHECK-NEXT: shm.l %s8, 8(%s61)107; CHECK-NEXT: shm.l %s11, 16(%s61)108; CHECK-NEXT: monc109; CHECK-NEXT: or %s0, 0, %s62110; CHECK-NEXT: .LBB0_2:111; CHECK-NEXT: ld %s0, 8(, %s11)112; CHECK-NEXT: adds.l %s11, 16, %s11113; CHECK-NEXT: b.l.t (, %s10)114 %1 = alloca i64, align 8115 call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %1)116 %2 = load volatile i64, ptr %1, align 8, !tbaa !3117 call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %1)118 ret i64 %2119}120 121; Function Attrs: argmemonly mustprogress nocallback nofree nosync nounwind willreturn122declare void @llvm.lifetime.start.p0(i64 immarg, ptr nocapture)123 124; Function Attrs: argmemonly mustprogress nocallback nofree nosync nounwind willreturn125declare void @llvm.lifetime.end.p0(i64 immarg, ptr nocapture)126 127; Function Attrs: argmemonly nofree nounwind128define x86_fastcallcc i64 @loadi64_stk_big() {129; CHECK-LABEL: loadi64_stk_big:130; CHECK: # %bb.0:131; CHECK-NEXT: lea %s11, -2147483648(, %s11)132; CHECK-NEXT: brge.l %s11, %s8, .LBB1_4133; CHECK-NEXT: # %bb.3:134; CHECK-NEXT: ld %s61, 24(, %s14)135; CHECK-NEXT: or %s62, 0, %s0136; CHECK-NEXT: lea %s63, 315137; CHECK-NEXT: shm.l %s63, (%s61)138; CHECK-NEXT: shm.l %s8, 8(%s61)139; CHECK-NEXT: shm.l %s11, 16(%s61)140; CHECK-NEXT: monc141; CHECK-NEXT: or %s0, 0, %s62142; CHECK-NEXT: .LBB1_4:143; CHECK-NEXT: ld %s0, 2147483640(, %s11)144; CHECK-NEXT: or %s1, 0, (0)1145; CHECK-NEXT: lea %s2, 2147483640146; CHECK-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=1147; CHECK-NEXT: ld %s3, (%s1, %s11)148; CHECK-NEXT: lea %s1, 8(, %s1)149; CHECK-NEXT: brne.l %s1, %s2, .LBB1_1150; CHECK-NEXT: # %bb.2:151; CHECK-NEXT: lea %s13, -2147483648152; CHECK-NEXT: and %s13, %s13, (32)0153; CHECK-NEXT: lea.sl %s11, (%s13, %s11)154; CHECK-NEXT: b.l.t (, %s10)155 %1 = alloca i64, align 8156 %2 = alloca [268435455 x i64], align 8157 call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %1)158 call void @llvm.lifetime.start.p0(i64 2147483640, ptr nonnull %2)159 %3 = load volatile i64, ptr %1, align 8, !tbaa !3160 br label %5161 1624: ; preds = %5163 call void @llvm.lifetime.end.p0(i64 2147483640, ptr nonnull %2)164 call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %1)165 ret i64 %3166 1675: ; preds = %0, %5168 %6 = phi i64 [ 0, %0 ], [ %9, %5 ]169 %7 = getelementptr inbounds [268435455 x i64], ptr %2, i64 0, i64 %6170 %8 = load volatile i64, ptr %7, align 8, !tbaa !3171 %9 = add nuw nsw i64 %6, 1172 %10 = icmp eq i64 %9, 268435455173 br i1 %10, label %4, label %5, !llvm.loop !7174}175 176; Function Attrs: argmemonly nofree nounwind177define x86_fastcallcc i64 @loadi64_stk_big2() {178; CHECK-LABEL: loadi64_stk_big2:179; CHECK: # %bb.0:180; CHECK-NEXT: lea %s13, 2147483632181; CHECK-NEXT: and %s13, %s13, (32)0182; CHECK-NEXT: lea.sl %s11, -1(%s13, %s11)183; CHECK-NEXT: brge.l %s11, %s8, .LBB2_4184; CHECK-NEXT: # %bb.3:185; CHECK-NEXT: ld %s61, 24(, %s14)186; CHECK-NEXT: or %s62, 0, %s0187; CHECK-NEXT: lea %s63, 315188; CHECK-NEXT: shm.l %s63, (%s61)189; CHECK-NEXT: shm.l %s8, 8(%s61)190; CHECK-NEXT: shm.l %s11, 16(%s61)191; CHECK-NEXT: monc192; CHECK-NEXT: or %s0, 0, %s62193; CHECK-NEXT: .LBB2_4:194; CHECK-NEXT: lea %s13, -2147483640195; CHECK-NEXT: and %s13, %s13, (32)0196; CHECK-NEXT: lea.sl %s13, (%s11, %s13)197; CHECK-NEXT: ld %s0, (, %s13)198; CHECK-NEXT: or %s1, 0, (0)1199; CHECK-NEXT: lea %s2, -2147483648200; CHECK-NEXT: and %s2, %s2, (32)0201; CHECK-NEXT: .LBB2_1: # =>This Inner Loop Header: Depth=1202; CHECK-NEXT: ld %s3, 8(%s1, %s11)203; CHECK-NEXT: lea %s1, 8(, %s1)204; CHECK-NEXT: brne.l %s1, %s2, .LBB2_1205; CHECK-NEXT: # %bb.2:206; CHECK-NEXT: lea %s13, -2147483632207; CHECK-NEXT: and %s13, %s13, (32)0208; CHECK-NEXT: lea.sl %s11, (%s13, %s11)209; CHECK-NEXT: b.l.t (, %s10)210 %1 = alloca i64, align 8211 %2 = alloca [268435456 x i64], align 8212 call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %1)213 call void @llvm.lifetime.start.p0(i64 2147483648, ptr nonnull %2)214 %3 = load volatile i64, ptr %1, align 8, !tbaa !3215 br label %5216 2174: ; preds = %5218 call void @llvm.lifetime.end.p0(i64 2147483648, ptr nonnull %2)219 call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %1)220 ret i64 %3221 2225: ; preds = %0, %5223 %6 = phi i64 [ 0, %0 ], [ %9, %5 ]224 %7 = getelementptr inbounds [268435456 x i64], ptr %2, i64 0, i64 %6225 %8 = load volatile i64, ptr %7, align 8, !tbaa !3226 %9 = add nuw nsw i64 %6, 1227 %10 = icmp eq i64 %9, 268435456228 br i1 %10, label %4, label %5, !llvm.loop !9229}230 231; Function Attrs: argmemonly mustprogress nofree nounwind willreturn232define x86_fastcallcc i64 @loadi64_stk_dyn(i64 noundef %0) {233; CHECK-LABEL: loadi64_stk_dyn:234; CHECK: # %bb.0:235; CHECK-NEXT: st %s9, (, %s11)236; CHECK-NEXT: st %s10, 8(, %s11)237; CHECK-NEXT: or %s9, 0, %s11238; CHECK-NEXT: lea %s11, -256(, %s11)239; CHECK-NEXT: brge.l.t %s11, %s8, .LBB3_2240; CHECK-NEXT: # %bb.1:241; CHECK-NEXT: ld %s61, 24(, %s14)242; CHECK-NEXT: or %s62, 0, %s0243; CHECK-NEXT: lea %s63, 315244; CHECK-NEXT: shm.l %s63, (%s61)245; CHECK-NEXT: shm.l %s8, 8(%s61)246; CHECK-NEXT: shm.l %s11, 16(%s61)247; CHECK-NEXT: monc248; CHECK-NEXT: or %s0, 0, %s62249; CHECK-NEXT: .LBB3_2:250; CHECK-NEXT: lea %s0, 15(, %s0)251; CHECK-NEXT: and %s0, -16, %s0252; CHECK-NEXT: lea %s1, __ve_grow_stack@lo253; CHECK-NEXT: and %s1, %s1, (32)0254; CHECK-NEXT: lea.sl %s12, __ve_grow_stack@hi(, %s1)255; CHECK-NEXT: bsic %s10, (, %s12)256; CHECK-NEXT: lea %s0, 240(, %s11)257; CHECK-NEXT: ld %s0, (, %s0)258; CHECK-NEXT: ld %s0, -8(, %s9)259; CHECK-NEXT: or %s11, 0, %s9260; CHECK-NEXT: ld %s10, 8(, %s11)261; CHECK-NEXT: ld %s9, (, %s11)262; CHECK-NEXT: b.l.t (, %s10)263 %2 = alloca i64, align 8264 call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %2)265 %3 = alloca i8, i64 %0, align 8266 %4 = load volatile i64, ptr %3, align 8, !tbaa !3267 %5 = load volatile i64, ptr %2, align 8, !tbaa !3268 call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %2)269 ret i64 %5270}271 272; Function Attrs: argmemonly mustprogress nofree nounwind willreturn273define x86_fastcallcc i64 @loadi64_stk_dyn_align(i64 noundef %0) {274; CHECK-LABEL: loadi64_stk_dyn_align:275; CHECK: # %bb.0:276; CHECK-NEXT: st %s9, (, %s11)277; CHECK-NEXT: st %s10, 8(, %s11)278; CHECK-NEXT: st %s17, 40(, %s11)279; CHECK-NEXT: or %s9, 0, %s11280; CHECK-NEXT: lea %s11, -288(, %s11)281; CHECK-NEXT: and %s11, %s11, (59)1282; CHECK-NEXT: or %s17, 0, %s11283; CHECK-NEXT: brge.l.t %s11, %s8, .LBB4_2284; CHECK-NEXT: # %bb.1:285; CHECK-NEXT: ld %s61, 24(, %s14)286; CHECK-NEXT: or %s62, 0, %s0287; CHECK-NEXT: lea %s63, 315288; CHECK-NEXT: shm.l %s63, (%s61)289; CHECK-NEXT: shm.l %s8, 8(%s61)290; CHECK-NEXT: shm.l %s11, 16(%s61)291; CHECK-NEXT: monc292; CHECK-NEXT: or %s0, 0, %s62293; CHECK-NEXT: .LBB4_2:294; CHECK-NEXT: lea %s0, 15(, %s0)295; CHECK-NEXT: and %s0, -16, %s0296; CHECK-NEXT: lea %s1, __ve_grow_stack@lo297; CHECK-NEXT: and %s1, %s1, (32)0298; CHECK-NEXT: lea.sl %s12, __ve_grow_stack@hi(, %s1)299; CHECK-NEXT: bsic %s10, (, %s12)300; CHECK-NEXT: lea %s0, 240(, %s11)301; CHECK-NEXT: ld %s0, (, %s0)302; CHECK-NEXT: ld %s0, 256(, %s17)303; CHECK-NEXT: or %s11, 0, %s9304; CHECK-NEXT: ld %s17, 40(, %s11)305; CHECK-NEXT: ld %s10, 8(, %s11)306; CHECK-NEXT: ld %s9, (, %s11)307; CHECK-NEXT: b.l.t (, %s10)308 %2 = alloca i64, align 32309 call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %2)310 %3 = alloca i8, i64 %0, align 8311 %4 = load volatile i64, ptr %3, align 8, !tbaa !3312 %5 = load volatile i64, ptr %2, align 32, !tbaa !10313 call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %2)314 ret i64 %5315}316 317; Function Attrs: argmemonly mustprogress nofree nounwind willreturn318define x86_fastcallcc i64 @loadi64_stk_dyn_align2(i64 noundef %0) {319; CHECK-LABEL: loadi64_stk_dyn_align2:320; CHECK: # %bb.0:321; CHECK-NEXT: st %s9, (, %s11)322; CHECK-NEXT: st %s10, 8(, %s11)323; CHECK-NEXT: st %s17, 40(, %s11)324; CHECK-NEXT: or %s9, 0, %s11325; CHECK-NEXT: lea %s11, -320(, %s11)326; CHECK-NEXT: and %s11, %s11, (58)1327; CHECK-NEXT: or %s17, 0, %s11328; CHECK-NEXT: brge.l.t %s11, %s8, .LBB5_2329; CHECK-NEXT: # %bb.1:330; CHECK-NEXT: ld %s61, 24(, %s14)331; CHECK-NEXT: or %s62, 0, %s0332; CHECK-NEXT: lea %s63, 315333; CHECK-NEXT: shm.l %s63, (%s61)334; CHECK-NEXT: shm.l %s8, 8(%s61)335; CHECK-NEXT: shm.l %s11, 16(%s61)336; CHECK-NEXT: monc337; CHECK-NEXT: or %s0, 0, %s62338; CHECK-NEXT: .LBB5_2:339; CHECK-NEXT: lea %s0, 15(, %s0)340; CHECK-NEXT: and %s0, -16, %s0341; CHECK-NEXT: lea %s1, __ve_grow_stack@lo342; CHECK-NEXT: and %s1, %s1, (32)0343; CHECK-NEXT: lea.sl %s12, __ve_grow_stack@hi(, %s1)344; CHECK-NEXT: bsic %s10, (, %s12)345; CHECK-NEXT: lea %s0, 240(, %s11)346; CHECK-NEXT: ld %s0, (, %s0)347; CHECK-NEXT: ld %s0, 288(, %s17)348; CHECK-NEXT: ld %s1, 256(, %s17)349; CHECK-NEXT: or %s11, 0, %s9350; CHECK-NEXT: ld %s17, 40(, %s11)351; CHECK-NEXT: ld %s10, 8(, %s11)352; CHECK-NEXT: ld %s9, (, %s11)353; CHECK-NEXT: b.l.t (, %s10)354 %2 = alloca i64, align 32355 %3 = alloca i64, align 64356 call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %2)357 %4 = alloca i8, i64 %0, align 8358 %5 = load volatile i64, ptr %4, align 8, !tbaa !3359 %6 = load volatile i64, ptr %2, align 32, !tbaa !10360 call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %3)361 %7 = load volatile i64, ptr %3, align 64, !tbaa !10362 call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %3)363 call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %2)364 ret i64 %6365}366 367; Function Attrs: nounwind368define x86_fastcallcc i64 @loadi64_stk_dyn_align_spill(i64 noundef %0) {369; CHECK-LABEL: loadi64_stk_dyn_align_spill:370; CHECK: # %bb.0:371; CHECK-NEXT: st %s9, (, %s11)372; CHECK-NEXT: st %s10, 8(, %s11)373; CHECK-NEXT: st %s17, 40(, %s11)374; CHECK-NEXT: or %s9, 0, %s11375; CHECK-NEXT: lea %s11, -288(, %s11)376; CHECK-NEXT: and %s11, %s11, (59)1377; CHECK-NEXT: or %s17, 0, %s11378; CHECK-NEXT: brge.l.t %s11, %s8, .LBB6_2379; CHECK-NEXT: # %bb.1:380; CHECK-NEXT: ld %s61, 24(, %s14)381; CHECK-NEXT: or %s62, 0, %s0382; CHECK-NEXT: lea %s63, 315383; CHECK-NEXT: shm.l %s63, (%s61)384; CHECK-NEXT: shm.l %s8, 8(%s61)385; CHECK-NEXT: shm.l %s11, 16(%s61)386; CHECK-NEXT: monc387; CHECK-NEXT: or %s0, 0, %s62388; CHECK-NEXT: .LBB6_2:389; CHECK-NEXT: st %s18, 48(, %s9) # 8-byte Folded Spill390; CHECK-NEXT: st %s19, 56(, %s9) # 8-byte Folded Spill391; CHECK-NEXT: or %s18, 0, %s0392; CHECK-NEXT: lea %s0, 15(, %s0)393; CHECK-NEXT: and %s0, -16, %s0394; CHECK-NEXT: lea %s1, __ve_grow_stack@lo395; CHECK-NEXT: and %s1, %s1, (32)0396; CHECK-NEXT: lea.sl %s12, __ve_grow_stack@hi(, %s1)397; CHECK-NEXT: bsic %s10, (, %s12)398; CHECK-NEXT: lea %s0, 240(, %s11)399; CHECK-NEXT: ld %s0, (, %s0)400; CHECK-NEXT: ld %s19, 256(, %s17)401; CHECK-NEXT: lea %s0, dummy@lo402; CHECK-NEXT: and %s0, %s0, (32)0403; CHECK-NEXT: lea.sl %s12, dummy@hi(, %s0)404; CHECK-NEXT: bsic %s10, (, %s12)405; CHECK-NEXT: lea %s0, pass@lo406; CHECK-NEXT: and %s0, %s0, (32)0407; CHECK-NEXT: lea.sl %s12, pass@hi(, %s0)408; CHECK-NEXT: or %s0, 0, %s18409; CHECK-NEXT: bsic %s10, (, %s12)410; CHECK-NEXT: or %s0, 0, %s19411; CHECK-NEXT: ld %s19, 56(, %s9) # 8-byte Folded Reload412; CHECK-NEXT: ld %s18, 48(, %s9) # 8-byte Folded Reload413; CHECK-NEXT: or %s11, 0, %s9414; CHECK-NEXT: ld %s17, 40(, %s11)415; CHECK-NEXT: ld %s10, 8(, %s11)416; CHECK-NEXT: ld %s9, (, %s11)417; CHECK-NEXT: b.l.t (, %s10)418 %2 = alloca i64, align 32419 call void @llvm.lifetime.start.p0(i64 8, ptr nonnull %2)420 %3 = alloca i8, i64 %0, align 8421 %4 = load volatile i64, ptr %3, align 8, !tbaa !3422 %5 = load volatile i64, ptr %2, align 32, !tbaa !10423 tail call void (...) @dummy()424 tail call void @pass(i64 noundef %0)425 call void @llvm.lifetime.end.p0(i64 8, ptr nonnull %2)426 ret i64 %5427}428 429declare void @dummy(...)430 431declare void @pass(i64 noundef)432 433; Function Attrs: argmemonly mustprogress nofree nounwind willreturn434define x86_fastcallcc fp128 @loadquad_stk() {435; CHECK-LABEL: loadquad_stk:436; CHECK: # %bb.0:437; CHECK-NEXT: adds.l %s11, -16, %s11438; CHECK-NEXT: brge.l.t %s11, %s8, .LBB7_2439; CHECK-NEXT: # %bb.1:440; CHECK-NEXT: ld %s61, 24(, %s14)441; CHECK-NEXT: or %s62, 0, %s0442; CHECK-NEXT: lea %s63, 315443; CHECK-NEXT: shm.l %s63, (%s61)444; CHECK-NEXT: shm.l %s8, 8(%s61)445; CHECK-NEXT: shm.l %s11, 16(%s61)446; CHECK-NEXT: monc447; CHECK-NEXT: or %s0, 0, %s62448; CHECK-NEXT: .LBB7_2:449; CHECK-NEXT: ld %s1, (, %s11)450; CHECK-NEXT: ld %s0, 8(, %s11)451; CHECK-NEXT: adds.l %s11, 16, %s11452; CHECK-NEXT: b.l.t (, %s10)453 %1 = alloca fp128, align 16454 call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %1)455 %2 = load volatile fp128, ptr %1, align 16, !tbaa !12456 call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %1)457 ret fp128 %2458}459 460; Function Attrs: argmemonly nofree nounwind461define x86_fastcallcc fp128 @loadquad_stk_big() {462; CHECK-LABEL: loadquad_stk_big:463; CHECK: # %bb.0:464; CHECK-NEXT: lea %s13, 2147483632465; CHECK-NEXT: and %s13, %s13, (32)0466; CHECK-NEXT: lea.sl %s11, -1(%s13, %s11)467; CHECK-NEXT: brge.l %s11, %s8, .LBB8_4468; CHECK-NEXT: # %bb.3:469; CHECK-NEXT: ld %s61, 24(, %s14)470; CHECK-NEXT: or %s62, 0, %s0471; CHECK-NEXT: lea %s63, 315472; CHECK-NEXT: shm.l %s63, (%s61)473; CHECK-NEXT: shm.l %s8, 8(%s61)474; CHECK-NEXT: shm.l %s11, 16(%s61)475; CHECK-NEXT: monc476; CHECK-NEXT: or %s0, 0, %s62477; CHECK-NEXT: .LBB8_4:478; CHECK-NEXT: lea %s13, -2147483648479; CHECK-NEXT: and %s13, %s13, (32)0480; CHECK-NEXT: lea.sl %s13, (%s11, %s13)481; CHECK-NEXT: ld %s1, (, %s13)482; CHECK-NEXT: ld %s0, 8(, %s13)483; CHECK-NEXT: or %s2, 0, (0)1484; CHECK-NEXT: lea %s3, 2147483640485; CHECK-NEXT: .LBB8_1: # =>This Inner Loop Header: Depth=1486; CHECK-NEXT: ld %s4, 8(%s2, %s11)487; CHECK-NEXT: lea %s2, 8(, %s2)488; CHECK-NEXT: brne.l %s2, %s3, .LBB8_1489; CHECK-NEXT: # %bb.2:490; CHECK-NEXT: lea %s13, -2147483632491; CHECK-NEXT: and %s13, %s13, (32)0492; CHECK-NEXT: lea.sl %s11, (%s13, %s11)493; CHECK-NEXT: b.l.t (, %s10)494 %1 = alloca fp128, align 16495 %2 = alloca [268435455 x i64], align 8496 call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %1)497 call void @llvm.lifetime.start.p0(i64 2147483640, ptr nonnull %2)498 %3 = load volatile fp128, ptr %1, align 16, !tbaa !12499 br label %5500 5014: ; preds = %5502 call void @llvm.lifetime.end.p0(i64 2147483640, ptr nonnull %2)503 call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %1)504 ret fp128 %3505 5065: ; preds = %0, %5507 %6 = phi i64 [ 0, %0 ], [ %9, %5 ]508 %7 = getelementptr inbounds [268435455 x i64], ptr %2, i64 0, i64 %6509 %8 = load volatile i64, ptr %7, align 8, !tbaa !3510 %9 = add nuw nsw i64 %6, 1511 %10 = icmp eq i64 %9, 268435455512 br i1 %10, label %4, label %5, !llvm.loop !14513}514 515; Function Attrs: argmemonly nofree nounwind516define x86_fastcallcc fp128 @loadquad_stk_big2() {517; CHECK-LABEL: loadquad_stk_big2:518; CHECK: # %bb.0:519; CHECK-NEXT: lea %s13, 2147483632520; CHECK-NEXT: and %s13, %s13, (32)0521; CHECK-NEXT: lea.sl %s11, -1(%s13, %s11)522; CHECK-NEXT: brge.l %s11, %s8, .LBB9_4523; CHECK-NEXT: # %bb.3:524; CHECK-NEXT: ld %s61, 24(, %s14)525; CHECK-NEXT: or %s62, 0, %s0526; CHECK-NEXT: lea %s63, 315527; CHECK-NEXT: shm.l %s63, (%s61)528; CHECK-NEXT: shm.l %s8, 8(%s61)529; CHECK-NEXT: shm.l %s11, 16(%s61)530; CHECK-NEXT: monc531; CHECK-NEXT: or %s0, 0, %s62532; CHECK-NEXT: .LBB9_4:533; CHECK-NEXT: lea %s13, -2147483648534; CHECK-NEXT: and %s13, %s13, (32)0535; CHECK-NEXT: lea.sl %s13, (%s11, %s13)536; CHECK-NEXT: ld %s1, (, %s13)537; CHECK-NEXT: ld %s0, 8(, %s13)538; CHECK-NEXT: or %s2, 0, (0)1539; CHECK-NEXT: lea %s3, -2147483648540; CHECK-NEXT: and %s3, %s3, (32)0541; CHECK-NEXT: .LBB9_1: # =>This Inner Loop Header: Depth=1542; CHECK-NEXT: ld %s4, (%s2, %s11)543; CHECK-NEXT: lea %s2, 8(, %s2)544; CHECK-NEXT: brne.l %s2, %s3, .LBB9_1545; CHECK-NEXT: # %bb.2:546; CHECK-NEXT: lea %s13, -2147483632547; CHECK-NEXT: and %s13, %s13, (32)0548; CHECK-NEXT: lea.sl %s11, (%s13, %s11)549; CHECK-NEXT: b.l.t (, %s10)550 %1 = alloca fp128, align 16551 %2 = alloca [268435456 x i64], align 8552 call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %1)553 call void @llvm.lifetime.start.p0(i64 2147483648, ptr nonnull %2)554 %3 = load volatile fp128, ptr %1, align 16, !tbaa !12555 br label %5556 5574: ; preds = %5558 call void @llvm.lifetime.end.p0(i64 2147483648, ptr nonnull %2)559 call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %1)560 ret fp128 %3561 5625: ; preds = %0, %5563 %6 = phi i64 [ 0, %0 ], [ %9, %5 ]564 %7 = getelementptr inbounds [268435456 x i64], ptr %2, i64 0, i64 %6565 %8 = load volatile i64, ptr %7, align 8, !tbaa !3566 %9 = add nuw nsw i64 %6, 1567 %10 = icmp eq i64 %9, 268435456568 br i1 %10, label %4, label %5, !llvm.loop !15569}570 571; Function Attrs: argmemonly mustprogress nofree nounwind willreturn572define x86_fastcallcc fp128 @loadquad_stk_dyn(i64 noundef %0) {573; CHECK-LABEL: loadquad_stk_dyn:574; CHECK: # %bb.0:575; CHECK-NEXT: st %s9, (, %s11)576; CHECK-NEXT: st %s10, 8(, %s11)577; CHECK-NEXT: or %s9, 0, %s11578; CHECK-NEXT: lea %s11, -256(, %s11)579; CHECK-NEXT: brge.l.t %s11, %s8, .LBB10_2580; CHECK-NEXT: # %bb.1:581; CHECK-NEXT: ld %s61, 24(, %s14)582; CHECK-NEXT: or %s62, 0, %s0583; CHECK-NEXT: lea %s63, 315584; CHECK-NEXT: shm.l %s63, (%s61)585; CHECK-NEXT: shm.l %s8, 8(%s61)586; CHECK-NEXT: shm.l %s11, 16(%s61)587; CHECK-NEXT: monc588; CHECK-NEXT: or %s0, 0, %s62589; CHECK-NEXT: .LBB10_2:590; CHECK-NEXT: lea %s0, 15(, %s0)591; CHECK-NEXT: and %s0, -16, %s0592; CHECK-NEXT: lea %s1, __ve_grow_stack@lo593; CHECK-NEXT: and %s1, %s1, (32)0594; CHECK-NEXT: lea.sl %s12, __ve_grow_stack@hi(, %s1)595; CHECK-NEXT: bsic %s10, (, %s12)596; CHECK-NEXT: lea %s0, 240(, %s11)597; CHECK-NEXT: ld %s1, 8(, %s0)598; CHECK-NEXT: ld %s0, (, %s0)599; CHECK-NEXT: ld %s1, -16(, %s9)600; CHECK-NEXT: ld %s0, -8(, %s9)601; CHECK-NEXT: or %s11, 0, %s9602; CHECK-NEXT: ld %s10, 8(, %s11)603; CHECK-NEXT: ld %s9, (, %s11)604; CHECK-NEXT: b.l.t (, %s10)605 %2 = alloca fp128, align 16606 call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %2)607 %3 = alloca i8, i64 %0, align 16608 %4 = load volatile fp128, ptr %3, align 16, !tbaa !12609 %5 = load volatile fp128, ptr %2, align 16, !tbaa !12610 call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %2)611 ret fp128 %5612}613 614; Function Attrs: argmemonly mustprogress nofree nounwind willreturn615define x86_fastcallcc fp128 @loadquad_stk_dyn_align(i64 noundef %0) {616; CHECK-LABEL: loadquad_stk_dyn_align:617; CHECK: # %bb.0:618; CHECK-NEXT: st %s9, (, %s11)619; CHECK-NEXT: st %s10, 8(, %s11)620; CHECK-NEXT: st %s17, 40(, %s11)621; CHECK-NEXT: or %s9, 0, %s11622; CHECK-NEXT: lea %s11, -288(, %s11)623; CHECK-NEXT: and %s11, %s11, (59)1624; CHECK-NEXT: or %s17, 0, %s11625; CHECK-NEXT: brge.l.t %s11, %s8, .LBB11_2626; CHECK-NEXT: # %bb.1:627; CHECK-NEXT: ld %s61, 24(, %s14)628; CHECK-NEXT: or %s62, 0, %s0629; CHECK-NEXT: lea %s63, 315630; CHECK-NEXT: shm.l %s63, (%s61)631; CHECK-NEXT: shm.l %s8, 8(%s61)632; CHECK-NEXT: shm.l %s11, 16(%s61)633; CHECK-NEXT: monc634; CHECK-NEXT: or %s0, 0, %s62635; CHECK-NEXT: .LBB11_2:636; CHECK-NEXT: lea %s0, 15(, %s0)637; CHECK-NEXT: and %s0, -16, %s0638; CHECK-NEXT: lea %s1, __ve_grow_stack@lo639; CHECK-NEXT: and %s1, %s1, (32)0640; CHECK-NEXT: lea.sl %s12, __ve_grow_stack@hi(, %s1)641; CHECK-NEXT: bsic %s10, (, %s12)642; CHECK-NEXT: lea %s0, 240(, %s11)643; CHECK-NEXT: ld %s1, 8(, %s0)644; CHECK-NEXT: ld %s0, (, %s0)645; CHECK-NEXT: ld %s1, 256(, %s17)646; CHECK-NEXT: ld %s0, 264(, %s17)647; CHECK-NEXT: or %s11, 0, %s9648; CHECK-NEXT: ld %s17, 40(, %s11)649; CHECK-NEXT: ld %s10, 8(, %s11)650; CHECK-NEXT: ld %s9, (, %s11)651; CHECK-NEXT: b.l.t (, %s10)652 %2 = alloca fp128, align 32653 call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %2)654 %3 = alloca i8, i64 %0, align 16655 %4 = load volatile fp128, ptr %3, align 16, !tbaa !12656 %5 = load volatile fp128, ptr %2, align 32, !tbaa !16657 call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %2)658 ret fp128 %5659}660 661; Function Attrs: argmemonly mustprogress nofree nounwind willreturn662define x86_fastcallcc fp128 @loadquad_stk_dyn_align2(i64 noundef %0) {663; CHECK-LABEL: loadquad_stk_dyn_align2:664; CHECK: # %bb.0:665; CHECK-NEXT: st %s9, (, %s11)666; CHECK-NEXT: st %s10, 8(, %s11)667; CHECK-NEXT: st %s17, 40(, %s11)668; CHECK-NEXT: or %s9, 0, %s11669; CHECK-NEXT: lea %s11, -320(, %s11)670; CHECK-NEXT: and %s11, %s11, (58)1671; CHECK-NEXT: or %s17, 0, %s11672; CHECK-NEXT: brge.l.t %s11, %s8, .LBB12_2673; CHECK-NEXT: # %bb.1:674; CHECK-NEXT: ld %s61, 24(, %s14)675; CHECK-NEXT: or %s62, 0, %s0676; CHECK-NEXT: lea %s63, 315677; CHECK-NEXT: shm.l %s63, (%s61)678; CHECK-NEXT: shm.l %s8, 8(%s61)679; CHECK-NEXT: shm.l %s11, 16(%s61)680; CHECK-NEXT: monc681; CHECK-NEXT: or %s0, 0, %s62682; CHECK-NEXT: .LBB12_2:683; CHECK-NEXT: lea %s0, 15(, %s0)684; CHECK-NEXT: and %s0, -16, %s0685; CHECK-NEXT: lea %s1, __ve_grow_stack@lo686; CHECK-NEXT: and %s1, %s1, (32)0687; CHECK-NEXT: lea.sl %s12, __ve_grow_stack@hi(, %s1)688; CHECK-NEXT: bsic %s10, (, %s12)689; CHECK-NEXT: lea %s0, 240(, %s11)690; CHECK-NEXT: ld %s1, 8(, %s0)691; CHECK-NEXT: ld %s0, (, %s0)692; CHECK-NEXT: ld %s1, 288(, %s17)693; CHECK-NEXT: ld %s0, 296(, %s17)694; CHECK-NEXT: ld %s3, 256(, %s17)695; CHECK-NEXT: ld %s2, 264(, %s17)696; CHECK-NEXT: or %s11, 0, %s9697; CHECK-NEXT: ld %s17, 40(, %s11)698; CHECK-NEXT: ld %s10, 8(, %s11)699; CHECK-NEXT: ld %s9, (, %s11)700; CHECK-NEXT: b.l.t (, %s10)701 %2 = alloca fp128, align 32702 %3 = alloca fp128, align 64703 call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %2)704 %4 = alloca i8, i64 %0, align 16705 %5 = load volatile fp128, ptr %4, align 16, !tbaa !12706 %6 = load volatile fp128, ptr %2, align 32, !tbaa !16707 call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %3)708 %7 = load volatile fp128, ptr %3, align 64, !tbaa !16709 call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %3)710 call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %2)711 ret fp128 %6712}713 714; Function Attrs: nounwind715define x86_fastcallcc fp128 @loadquad_stk_dyn_align_spill(i64 noundef %0) {716; CHECK-LABEL: loadquad_stk_dyn_align_spill:717; CHECK: # %bb.0:718; CHECK-NEXT: st %s9, (, %s11)719; CHECK-NEXT: st %s10, 8(, %s11)720; CHECK-NEXT: st %s17, 40(, %s11)721; CHECK-NEXT: or %s9, 0, %s11722; CHECK-NEXT: lea %s11, -288(, %s11)723; CHECK-NEXT: and %s11, %s11, (59)1724; CHECK-NEXT: or %s17, 0, %s11725; CHECK-NEXT: brge.l.t %s11, %s8, .LBB13_2726; CHECK-NEXT: # %bb.1:727; CHECK-NEXT: ld %s61, 24(, %s14)728; CHECK-NEXT: or %s62, 0, %s0729; CHECK-NEXT: lea %s63, 315730; CHECK-NEXT: shm.l %s63, (%s61)731; CHECK-NEXT: shm.l %s8, 8(%s61)732; CHECK-NEXT: shm.l %s11, 16(%s61)733; CHECK-NEXT: monc734; CHECK-NEXT: or %s0, 0, %s62735; CHECK-NEXT: .LBB13_2:736; CHECK-NEXT: st %s18, 48(, %s9) # 8-byte Folded Spill737; CHECK-NEXT: st %s20, 64(, %s9) # 8-byte Folded Spill738; CHECK-NEXT: st %s21, 72(, %s9) # 8-byte Folded Spill739; CHECK-NEXT: or %s18, 0, %s0740; CHECK-NEXT: lea %s0, 15(, %s0)741; CHECK-NEXT: and %s0, -16, %s0742; CHECK-NEXT: lea %s1, __ve_grow_stack@lo743; CHECK-NEXT: and %s1, %s1, (32)0744; CHECK-NEXT: lea.sl %s12, __ve_grow_stack@hi(, %s1)745; CHECK-NEXT: bsic %s10, (, %s12)746; CHECK-NEXT: lea %s0, 240(, %s11)747; CHECK-NEXT: ld %s1, 8(, %s0)748; CHECK-NEXT: ld %s0, (, %s0)749; CHECK-NEXT: ld %s21, 256(, %s17)750; CHECK-NEXT: ld %s20, 264(, %s17)751; CHECK-NEXT: lea %s0, dummy@lo752; CHECK-NEXT: and %s0, %s0, (32)0753; CHECK-NEXT: lea.sl %s12, dummy@hi(, %s0)754; CHECK-NEXT: bsic %s10, (, %s12)755; CHECK-NEXT: lea %s0, pass@lo756; CHECK-NEXT: and %s0, %s0, (32)0757; CHECK-NEXT: lea.sl %s12, pass@hi(, %s0)758; CHECK-NEXT: or %s0, 0, %s18759; CHECK-NEXT: bsic %s10, (, %s12)760; CHECK-NEXT: or %s0, 0, %s20761; CHECK-NEXT: or %s1, 0, %s21762; CHECK-NEXT: ld %s21, 72(, %s9) # 8-byte Folded Reload763; CHECK-NEXT: ld %s20, 64(, %s9) # 8-byte Folded Reload764; CHECK-NEXT: ld %s18, 48(, %s9) # 8-byte Folded Reload765; CHECK-NEXT: or %s11, 0, %s9766; CHECK-NEXT: ld %s17, 40(, %s11)767; CHECK-NEXT: ld %s10, 8(, %s11)768; CHECK-NEXT: ld %s9, (, %s11)769; CHECK-NEXT: b.l.t (, %s10)770 %2 = alloca fp128, align 32771 call void @llvm.lifetime.start.p0(i64 16, ptr nonnull %2)772 %3 = alloca i8, i64 %0, align 16773 %4 = load volatile fp128, ptr %3, align 16, !tbaa !12774 %5 = load volatile fp128, ptr %2, align 32, !tbaa !16775 tail call void (...) @dummy()776 tail call void @pass(i64 noundef %0)777 call void @llvm.lifetime.end.p0(i64 16, ptr nonnull %2)778 ret fp128 %5779}780 781!3 = !{!4, !4, i64 0}782!4 = !{!"long", !5, i64 0}783!5 = !{!"omnipotent char", !6, i64 0}784!6 = !{!"Simple C/C++ TBAA"}785!7 = distinct !{!7, !8}786!8 = !{!"llvm.loop.mustprogress"}787!9 = distinct !{!9, !8}788!10 = !{!11, !4, i64 0}789!11 = !{!"", !4, i64 0}790!12 = !{!13, !13, i64 0}791!13 = !{!"long double", !5, i64 0}792!14 = distinct !{!14, !8}793!15 = distinct !{!15, !8}794!16 = !{!17, !13, i64 0}795!17 = !{!"", !13, i64 0}796