295 lines · plain
1; Test 64-bit additions of constants to memory.2;3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s4 5; Check additions of 1.6define void @f1(ptr %ptr) {7; CHECK-LABEL: f1:8; CHECK: agsi 0(%r2), 19; CHECK: br %r1410 %val = load i64, ptr %ptr11 %add = add i64 %val, 12712 store i64 %add, ptr %ptr13 ret void14}15 16; Check the high end of the constant range.17define void @f2(ptr %ptr) {18; CHECK-LABEL: f2:19; CHECK: agsi 0(%r2), 12720; CHECK: br %r1421 %val = load i64, ptr %ptr22 %add = add i64 %val, 12723 store i64 %add, ptr %ptr24 ret void25}26 27; Check the next constant up, which must use an addition and a store.28; Both LG/AGHI and LGHI/AG would be OK.29define void @f3(ptr %ptr) {30; CHECK-LABEL: f3:31; CHECK-NOT: agsi32; CHECK: stg %r0, 0(%r2)33; CHECK: br %r1434 %val = load i64, ptr %ptr35 %add = add i64 %val, 12836 store i64 %add, ptr %ptr37 ret void38}39 40; Check the low end of the constant range.41define void @f4(ptr %ptr) {42; CHECK-LABEL: f4:43; CHECK: agsi 0(%r2), -12844; CHECK: br %r1445 %val = load i64, ptr %ptr46 %add = add i64 %val, -12847 store i64 %add, ptr %ptr48 ret void49}50 51; Check the next value down, with the same comment as f3.52define void @f5(ptr %ptr) {53; CHECK-LABEL: f5:54; CHECK-NOT: agsi55; CHECK: stg %r0, 0(%r2)56; CHECK: br %r1457 %val = load i64, ptr %ptr58 %add = add i64 %val, -12959 store i64 %add, ptr %ptr60 ret void61}62 63; Check the high end of the aligned AGSI range.64define void @f6(ptr %base) {65; CHECK-LABEL: f6:66; CHECK: agsi 524280(%r2), 167; CHECK: br %r1468 %ptr = getelementptr i64, ptr %base, i64 6553569 %val = load i64, ptr %ptr70 %add = add i64 %val, 171 store i64 %add, ptr %ptr72 ret void73}74 75; Check the next doubleword up, which must use separate address logic.76; Other sequences besides this one would be OK.77define void @f7(ptr %base) {78; CHECK-LABEL: f7:79; CHECK: agfi %r2, 52428880; CHECK: agsi 0(%r2), 181; CHECK: br %r1482 %ptr = getelementptr i64, ptr %base, i64 6553683 %val = load i64, ptr %ptr84 %add = add i64 %val, 185 store i64 %add, ptr %ptr86 ret void87}88 89; Check the low end of the AGSI range.90define void @f8(ptr %base) {91; CHECK-LABEL: f8:92; CHECK: agsi -524288(%r2), 193; CHECK: br %r1494 %ptr = getelementptr i64, ptr %base, i64 -6553695 %val = load i64, ptr %ptr96 %add = add i64 %val, 197 store i64 %add, ptr %ptr98 ret void99}100 101; Check the next doubleword down, which must use separate address logic.102; Other sequences besides this one would be OK.103define void @f9(ptr %base) {104; CHECK-LABEL: f9:105; CHECK: agfi %r2, -524296106; CHECK: agsi 0(%r2), 1107; CHECK: br %r14108 %ptr = getelementptr i64, ptr %base, i64 -65537109 %val = load i64, ptr %ptr110 %add = add i64 %val, 1111 store i64 %add, ptr %ptr112 ret void113}114 115; Check that AGSI does not allow indices.116define void @f10(i64 %base, i64 %index) {117; CHECK-LABEL: f10:118; CHECK: agr %r2, %r3119; CHECK: agsi 8(%r2), 1120; CHECK: br %r14121 %add1 = add i64 %base, %index122 %add2 = add i64 %add1, 8123 %ptr = inttoptr i64 %add2 to ptr124 %val = load i64, ptr %ptr125 %add = add i64 %val, 1126 store i64 %add, ptr %ptr127 ret void128}129 130; Check that adding 127 to a spilled value can use AGSI.131define void @f11(ptr %ptr, i32 %sel) {132; CHECK-LABEL: f11:133; CHECK: agsi {{[0-9]+}}(%r15), 127134; CHECK: br %r14135entry:136 %val0 = load volatile i64, ptr %ptr137 %val1 = load volatile i64, ptr %ptr138 %val2 = load volatile i64, ptr %ptr139 %val3 = load volatile i64, ptr %ptr140 %val4 = load volatile i64, ptr %ptr141 %val5 = load volatile i64, ptr %ptr142 %val6 = load volatile i64, ptr %ptr143 %val7 = load volatile i64, ptr %ptr144 %val8 = load volatile i64, ptr %ptr145 %val9 = load volatile i64, ptr %ptr146 %val10 = load volatile i64, ptr %ptr147 %val11 = load volatile i64, ptr %ptr148 %val12 = load volatile i64, ptr %ptr149 %val13 = load volatile i64, ptr %ptr150 %val14 = load volatile i64, ptr %ptr151 %val15 = load volatile i64, ptr %ptr152 153 %test = icmp ne i32 %sel, 0154 br i1 %test, label %add, label %store155 156add:157 %add0 = add i64 %val0, 127158 %add1 = add i64 %val1, 127159 %add2 = add i64 %val2, 127160 %add3 = add i64 %val3, 127161 %add4 = add i64 %val4, 127162 %add5 = add i64 %val5, 127163 %add6 = add i64 %val6, 127164 %add7 = add i64 %val7, 127165 %add8 = add i64 %val8, 127166 %add9 = add i64 %val9, 127167 %add10 = add i64 %val10, 127168 %add11 = add i64 %val11, 127169 %add12 = add i64 %val12, 127170 %add13 = add i64 %val13, 127171 %add14 = add i64 %val14, 127172 %add15 = add i64 %val15, 127173 br label %store174 175store:176 %new0 = phi i64 [ %val0, %entry ], [ %add0, %add ]177 %new1 = phi i64 [ %val1, %entry ], [ %add1, %add ]178 %new2 = phi i64 [ %val2, %entry ], [ %add2, %add ]179 %new3 = phi i64 [ %val3, %entry ], [ %add3, %add ]180 %new4 = phi i64 [ %val4, %entry ], [ %add4, %add ]181 %new5 = phi i64 [ %val5, %entry ], [ %add5, %add ]182 %new6 = phi i64 [ %val6, %entry ], [ %add6, %add ]183 %new7 = phi i64 [ %val7, %entry ], [ %add7, %add ]184 %new8 = phi i64 [ %val8, %entry ], [ %add8, %add ]185 %new9 = phi i64 [ %val9, %entry ], [ %add9, %add ]186 %new10 = phi i64 [ %val10, %entry ], [ %add10, %add ]187 %new11 = phi i64 [ %val11, %entry ], [ %add11, %add ]188 %new12 = phi i64 [ %val12, %entry ], [ %add12, %add ]189 %new13 = phi i64 [ %val13, %entry ], [ %add13, %add ]190 %new14 = phi i64 [ %val14, %entry ], [ %add14, %add ]191 %new15 = phi i64 [ %val15, %entry ], [ %add15, %add ]192 193 store volatile i64 %new0, ptr %ptr194 store volatile i64 %new1, ptr %ptr195 store volatile i64 %new2, ptr %ptr196 store volatile i64 %new3, ptr %ptr197 store volatile i64 %new4, ptr %ptr198 store volatile i64 %new5, ptr %ptr199 store volatile i64 %new6, ptr %ptr200 store volatile i64 %new7, ptr %ptr201 store volatile i64 %new8, ptr %ptr202 store volatile i64 %new9, ptr %ptr203 store volatile i64 %new10, ptr %ptr204 store volatile i64 %new11, ptr %ptr205 store volatile i64 %new12, ptr %ptr206 store volatile i64 %new13, ptr %ptr207 store volatile i64 %new14, ptr %ptr208 store volatile i64 %new15, ptr %ptr209 210 ret void211}212 213; Check that adding -128 to a spilled value can use AGSI.214define void @f12(ptr %ptr, i32 %sel) {215; CHECK-LABEL: f12:216; CHECK: agsi {{[0-9]+}}(%r15), -128217; CHECK: br %r14218entry:219 %val0 = load volatile i64, ptr %ptr220 %val1 = load volatile i64, ptr %ptr221 %val2 = load volatile i64, ptr %ptr222 %val3 = load volatile i64, ptr %ptr223 %val4 = load volatile i64, ptr %ptr224 %val5 = load volatile i64, ptr %ptr225 %val6 = load volatile i64, ptr %ptr226 %val7 = load volatile i64, ptr %ptr227 %val8 = load volatile i64, ptr %ptr228 %val9 = load volatile i64, ptr %ptr229 %val10 = load volatile i64, ptr %ptr230 %val11 = load volatile i64, ptr %ptr231 %val12 = load volatile i64, ptr %ptr232 %val13 = load volatile i64, ptr %ptr233 %val14 = load volatile i64, ptr %ptr234 %val15 = load volatile i64, ptr %ptr235 236 %test = icmp ne i32 %sel, 0237 br i1 %test, label %add, label %store238 239add:240 %add0 = add i64 %val0, -128241 %add1 = add i64 %val1, -128242 %add2 = add i64 %val2, -128243 %add3 = add i64 %val3, -128244 %add4 = add i64 %val4, -128245 %add5 = add i64 %val5, -128246 %add6 = add i64 %val6, -128247 %add7 = add i64 %val7, -128248 %add8 = add i64 %val8, -128249 %add9 = add i64 %val9, -128250 %add10 = add i64 %val10, -128251 %add11 = add i64 %val11, -128252 %add12 = add i64 %val12, -128253 %add13 = add i64 %val13, -128254 %add14 = add i64 %val14, -128255 %add15 = add i64 %val15, -128256 br label %store257 258store:259 %new0 = phi i64 [ %val0, %entry ], [ %add0, %add ]260 %new1 = phi i64 [ %val1, %entry ], [ %add1, %add ]261 %new2 = phi i64 [ %val2, %entry ], [ %add2, %add ]262 %new3 = phi i64 [ %val3, %entry ], [ %add3, %add ]263 %new4 = phi i64 [ %val4, %entry ], [ %add4, %add ]264 %new5 = phi i64 [ %val5, %entry ], [ %add5, %add ]265 %new6 = phi i64 [ %val6, %entry ], [ %add6, %add ]266 %new7 = phi i64 [ %val7, %entry ], [ %add7, %add ]267 %new8 = phi i64 [ %val8, %entry ], [ %add8, %add ]268 %new9 = phi i64 [ %val9, %entry ], [ %add9, %add ]269 %new10 = phi i64 [ %val10, %entry ], [ %add10, %add ]270 %new11 = phi i64 [ %val11, %entry ], [ %add11, %add ]271 %new12 = phi i64 [ %val12, %entry ], [ %add12, %add ]272 %new13 = phi i64 [ %val13, %entry ], [ %add13, %add ]273 %new14 = phi i64 [ %val14, %entry ], [ %add14, %add ]274 %new15 = phi i64 [ %val15, %entry ], [ %add15, %add ]275 276 store volatile i64 %new0, ptr %ptr277 store volatile i64 %new1, ptr %ptr278 store volatile i64 %new2, ptr %ptr279 store volatile i64 %new3, ptr %ptr280 store volatile i64 %new4, ptr %ptr281 store volatile i64 %new5, ptr %ptr282 store volatile i64 %new6, ptr %ptr283 store volatile i64 %new7, ptr %ptr284 store volatile i64 %new8, ptr %ptr285 store volatile i64 %new9, ptr %ptr286 store volatile i64 %new10, ptr %ptr287 store volatile i64 %new11, ptr %ptr288 store volatile i64 %new12, ptr %ptr289 store volatile i64 %new13, ptr %ptr290 store volatile i64 %new14, ptr %ptr291 store volatile i64 %new15, ptr %ptr292 293 ret void294}295