217 lines · plain
1; Like frame-05.ll, but with i64s rather than i32s. Internally this2; uses a different register class, but the set of saved and restored3; registers should be the same.4;5; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s6 7; This function should require all GPRs, but no other spill slots. The caller8; allocates room for the GPR save slots, so we shouldn't need to allocate any9; extra space.10;11; Use a different address for the final store, so that we can check that12; %r15 isn't referenced again until after that.13define void @f1(ptr %ptr) {14; CHECK-LABEL: f1:15; CHECK: stmg %r6, %r15, 48(%r15)16; CHECK-NOT: %r1517; CHECK: .cfi_offset %r6, -11218; CHECK: .cfi_offset %r7, -10419; CHECK: .cfi_offset %r8, -9620; CHECK: .cfi_offset %r9, -8821; CHECK: .cfi_offset %r10, -8022; CHECK: .cfi_offset %r11, -7223; CHECK: .cfi_offset %r12, -6424; CHECK: .cfi_offset %r13, -5625; CHECK: .cfi_offset %r14, -4826; CHECK: .cfi_offset %r15, -4027; ...main function body...28; CHECK-NOT: %r1529; CHECK: stg {{.*}}, 8(%r2)30; CHECK: lmg %r6, %r15, 48(%r15)31; CHECK: br %r1432 %l0 = load volatile i64, ptr %ptr33 %l1 = load volatile i64, ptr %ptr34 %l3 = load volatile i64, ptr %ptr35 %l4 = load volatile i64, ptr %ptr36 %l5 = load volatile i64, ptr %ptr37 %l6 = load volatile i64, ptr %ptr38 %l7 = load volatile i64, ptr %ptr39 %l8 = load volatile i64, ptr %ptr40 %l9 = load volatile i64, ptr %ptr41 %l10 = load volatile i64, ptr %ptr42 %l11 = load volatile i64, ptr %ptr43 %l12 = load volatile i64, ptr %ptr44 %l13 = load volatile i64, ptr %ptr45 %l14 = load volatile i64, ptr %ptr46 %add0 = add i64 %l0, %l047 %add1 = add i64 %l1, %add048 %add3 = add i64 %l3, %add149 %add4 = add i64 %l4, %add350 %add5 = add i64 %l5, %add451 %add6 = add i64 %l6, %add552 %add7 = add i64 %l7, %add653 %add8 = add i64 %l8, %add754 %add9 = add i64 %l9, %add855 %add10 = add i64 %l10, %add956 %add11 = add i64 %l11, %add1057 %add12 = add i64 %l12, %add1158 %add13 = add i64 %l13, %add1259 %add14 = add i64 %l14, %add1360 store volatile i64 %add0, ptr %ptr61 store volatile i64 %add1, ptr %ptr62 store volatile i64 %add3, ptr %ptr63 store volatile i64 %add4, ptr %ptr64 store volatile i64 %add5, ptr %ptr65 store volatile i64 %add6, ptr %ptr66 store volatile i64 %add7, ptr %ptr67 store volatile i64 %add8, ptr %ptr68 store volatile i64 %add9, ptr %ptr69 store volatile i64 %add10, ptr %ptr70 store volatile i64 %add11, ptr %ptr71 store volatile i64 %add12, ptr %ptr72 store volatile i64 %add13, ptr %ptr73 %final = getelementptr i64, ptr %ptr, i64 174 store volatile i64 %add14, ptr %final75 ret void76}77 78; Like f1, but requires one fewer GPR. We allocate the call-saved GPRs79; from %r14 down, so that the STMG/LMG sequences aren't any longer than80; they need to be.81define void @f2(ptr %ptr) {82; CHECK-LABEL: f2:83; CHECK: stmg %r7, %r15, 56(%r15)84; CHECK-NOT: %r1585; CHECK: .cfi_offset %r7, -10486; CHECK: .cfi_offset %r8, -9687; CHECK: .cfi_offset %r9, -8888; CHECK: .cfi_offset %r10, -8089; CHECK: .cfi_offset %r11, -7290; CHECK: .cfi_offset %r12, -6491; CHECK: .cfi_offset %r13, -5692; CHECK: .cfi_offset %r14, -4893; CHECK: .cfi_offset %r15, -4094; ...main function body...95; CHECK-NOT: %r1596; CHECK-NOT: %r697; CHECK: stg {{.*}}, 8(%r2)98; CHECK: lmg %r7, %r15, 56(%r15)99; CHECK: br %r14100 %l0 = load volatile i64, ptr %ptr101 %l1 = load volatile i64, ptr %ptr102 %l3 = load volatile i64, ptr %ptr103 %l4 = load volatile i64, ptr %ptr104 %l5 = load volatile i64, ptr %ptr105 %l7 = load volatile i64, ptr %ptr106 %l8 = load volatile i64, ptr %ptr107 %l9 = load volatile i64, ptr %ptr108 %l10 = load volatile i64, ptr %ptr109 %l11 = load volatile i64, ptr %ptr110 %l12 = load volatile i64, ptr %ptr111 %l13 = load volatile i64, ptr %ptr112 %l14 = load volatile i64, ptr %ptr113 %add0 = add i64 %l0, %l0114 %add1 = add i64 %l1, %add0115 %add3 = add i64 %l3, %add1116 %add4 = add i64 %l4, %add3117 %add5 = add i64 %l5, %add4118 %add7 = add i64 %l7, %add5119 %add8 = add i64 %l8, %add7120 %add9 = add i64 %l9, %add8121 %add10 = add i64 %l10, %add9122 %add11 = add i64 %l11, %add10123 %add12 = add i64 %l12, %add11124 %add13 = add i64 %l13, %add12125 %add14 = add i64 %l14, %add13126 store volatile i64 %add0, ptr %ptr127 store volatile i64 %add1, ptr %ptr128 store volatile i64 %add3, ptr %ptr129 store volatile i64 %add4, ptr %ptr130 store volatile i64 %add5, ptr %ptr131 store volatile i64 %add7, ptr %ptr132 store volatile i64 %add8, ptr %ptr133 store volatile i64 %add9, ptr %ptr134 store volatile i64 %add10, ptr %ptr135 store volatile i64 %add11, ptr %ptr136 store volatile i64 %add12, ptr %ptr137 store volatile i64 %add13, ptr %ptr138 %final = getelementptr i64, ptr %ptr, i64 1139 store volatile i64 %add14, ptr %final140 ret void141}142 143; Like f1, but only needs one call-saved GPR, which ought to be %r14.144define void @f3(ptr %ptr) {145; CHECK-LABEL: f3:146; CHECK: stmg %r14, %r15, 112(%r15)147; CHECK-NOT: %r15148; CHECK: .cfi_offset %r14, -48149; CHECK: .cfi_offset %r15, -40150; ...main function body...151; CHECK-NOT: %r15152; CHECK-NOT: %r6153; CHECK-NOT: %r7154; CHECK-NOT: %r8155; CHECK-NOT: %r9156; CHECK-NOT: %r10157; CHECK-NOT: %r11158; CHECK-NOT: %r12159; CHECK-NOT: %r13160; CHECK: stg {{.*}}, 8(%r2)161; CHECK: lmg %r14, %r15, 112(%r15)162; CHECK: br %r14163 %l0 = load volatile i64, ptr %ptr164 %l1 = load volatile i64, ptr %ptr165 %l3 = load volatile i64, ptr %ptr166 %l4 = load volatile i64, ptr %ptr167 %l5 = load volatile i64, ptr %ptr168 %l14 = load volatile i64, ptr %ptr169 %add0 = add i64 %l0, %l0170 %add1 = add i64 %l1, %add0171 %add3 = add i64 %l3, %add1172 %add4 = add i64 %l4, %add3173 %add5 = add i64 %l5, %add4174 %add14 = add i64 %l14, %add5175 store volatile i64 %add0, ptr %ptr176 store volatile i64 %add1, ptr %ptr177 store volatile i64 %add3, ptr %ptr178 store volatile i64 %add4, ptr %ptr179 store volatile i64 %add5, ptr %ptr180 %final = getelementptr i64, ptr %ptr, i64 1181 store volatile i64 %add14, ptr %final182 ret void183}184 185; This function should use all call-clobbered GPRs but no call-saved ones.186; It shouldn't need to touch the stack at all.187define void @f4(ptr %ptr) {188; CHECK-LABEL: f4:189; CHECK-NOT: %r15190; CHECK-NOT: %r6191; CHECK-NOT: %r7192; CHECK-NOT: %r8193; CHECK-NOT: %r9194; CHECK-NOT: %r10195; CHECK-NOT: %r11196; CHECK-NOT: %r12197; CHECK-NOT: %r13198; CHECK: br %r14199 %l0 = load volatile i64, ptr %ptr200 %l1 = load volatile i64, ptr %ptr201 %l3 = load volatile i64, ptr %ptr202 %l4 = load volatile i64, ptr %ptr203 %l5 = load volatile i64, ptr %ptr204 %add0 = add i64 %l0, %l0205 %add1 = add i64 %l1, %add0206 %add3 = add i64 %l3, %add1207 %add4 = add i64 %l4, %add3208 %add5 = add i64 %l5, %add4209 store volatile i64 %add0, ptr %ptr210 store volatile i64 %add1, ptr %ptr211 store volatile i64 %add3, ptr %ptr212 store volatile i64 %add4, ptr %ptr213 %final = getelementptr i64, ptr %ptr, i64 1214 store volatile i64 %add5, ptr %final215 ret void216}217