brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.6 KiB · 98b0669 Raw
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