296 lines · plain
1; Test 32-bit additions of constants to memory. The tests here2; assume z10 register pressure, without the high words being available.3;4; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z10 | FileCheck %s5 6; Check additions of 1.7define void @f1(ptr %ptr) {8; CHECK-LABEL: f1:9; CHECK: asi 0(%r2), 110; CHECK: br %r1411 %val = load i32, ptr %ptr12 %add = add i32 %val, 12713 store i32 %add, ptr %ptr14 ret void15}16 17; Check the high end of the constant range.18define void @f2(ptr %ptr) {19; CHECK-LABEL: f2:20; CHECK: asi 0(%r2), 12721; CHECK: br %r1422 %val = load i32, ptr %ptr23 %add = add i32 %val, 12724 store i32 %add, ptr %ptr25 ret void26}27 28; Check the next constant up, which must use an addition and a store.29; Both L/AHI and LHI/A would be OK.30define void @f3(ptr %ptr) {31; CHECK-LABEL: f3:32; CHECK-NOT: asi33; CHECK: st %r0, 0(%r2)34; CHECK: br %r1435 %val = load i32, ptr %ptr36 %add = add i32 %val, 12837 store i32 %add, ptr %ptr38 ret void39}40 41; Check the low end of the constant range.42define void @f4(ptr %ptr) {43; CHECK-LABEL: f4:44; CHECK: asi 0(%r2), -12845; CHECK: br %r1446 %val = load i32, ptr %ptr47 %add = add i32 %val, -12848 store i32 %add, ptr %ptr49 ret void50}51 52; Check the next value down, with the same comment as f3.53define void @f5(ptr %ptr) {54; CHECK-LABEL: f5:55; CHECK-NOT: asi56; CHECK: st %r0, 0(%r2)57; CHECK: br %r1458 %val = load i32, ptr %ptr59 %add = add i32 %val, -12960 store i32 %add, ptr %ptr61 ret void62}63 64; Check the high end of the aligned ASI range.65define void @f6(ptr %base) {66; CHECK-LABEL: f6:67; CHECK: asi 524284(%r2), 168; CHECK: br %r1469 %ptr = getelementptr i32, ptr %base, i64 13107170 %val = load i32, ptr %ptr71 %add = add i32 %val, 172 store i32 %add, ptr %ptr73 ret void74}75 76; Check the next word up, which must use separate address logic.77; Other sequences besides this one would be OK.78define void @f7(ptr %base) {79; CHECK-LABEL: f7:80; CHECK: agfi %r2, 52428881; CHECK: asi 0(%r2), 182; CHECK: br %r1483 %ptr = getelementptr i32, ptr %base, i64 13107284 %val = load i32, ptr %ptr85 %add = add i32 %val, 186 store i32 %add, ptr %ptr87 ret void88}89 90; Check the low end of the ASI range.91define void @f8(ptr %base) {92; CHECK-LABEL: f8:93; CHECK: asi -524288(%r2), 194; CHECK: br %r1495 %ptr = getelementptr i32, ptr %base, i64 -13107296 %val = load i32, ptr %ptr97 %add = add i32 %val, 198 store i32 %add, ptr %ptr99 ret void100}101 102; Check the next word down, which must use separate address logic.103; Other sequences besides this one would be OK.104define void @f9(ptr %base) {105; CHECK-LABEL: f9:106; CHECK: agfi %r2, -524292107; CHECK: asi 0(%r2), 1108; CHECK: br %r14109 %ptr = getelementptr i32, ptr %base, i64 -131073110 %val = load i32, ptr %ptr111 %add = add i32 %val, 1112 store i32 %add, ptr %ptr113 ret void114}115 116; Check that ASI does not allow indices.117define void @f10(i64 %base, i64 %index) {118; CHECK-LABEL: f10:119; CHECK: agr %r2, %r3120; CHECK: asi 4(%r2), 1121; CHECK: br %r14122 %add1 = add i64 %base, %index123 %add2 = add i64 %add1, 4124 %ptr = inttoptr i64 %add2 to ptr125 %val = load i32, ptr %ptr126 %add = add i32 %val, 1127 store i32 %add, ptr %ptr128 ret void129}130 131; Check that adding 127 to a spilled value can use ASI.132define void @f11(ptr %ptr, i32 %sel) {133; CHECK-LABEL: f11:134; CHECK: asi {{[0-9]+}}(%r15), 127135; CHECK: br %r14136entry:137 %val0 = load volatile i32, ptr %ptr138 %val1 = load volatile i32, ptr %ptr139 %val2 = load volatile i32, ptr %ptr140 %val3 = load volatile i32, ptr %ptr141 %val4 = load volatile i32, ptr %ptr142 %val5 = load volatile i32, ptr %ptr143 %val6 = load volatile i32, ptr %ptr144 %val7 = load volatile i32, ptr %ptr145 %val8 = load volatile i32, ptr %ptr146 %val9 = load volatile i32, ptr %ptr147 %val10 = load volatile i32, ptr %ptr148 %val11 = load volatile i32, ptr %ptr149 %val12 = load volatile i32, ptr %ptr150 %val13 = load volatile i32, ptr %ptr151 %val14 = load volatile i32, ptr %ptr152 %val15 = load volatile i32, ptr %ptr153 154 %test = icmp ne i32 %sel, 0155 br i1 %test, label %add, label %store156 157add:158 %add0 = add i32 %val0, 127159 %add1 = add i32 %val1, 127160 %add2 = add i32 %val2, 127161 %add3 = add i32 %val3, 127162 %add4 = add i32 %val4, 127163 %add5 = add i32 %val5, 127164 %add6 = add i32 %val6, 127165 %add7 = add i32 %val7, 127166 %add8 = add i32 %val8, 127167 %add9 = add i32 %val9, 127168 %add10 = add i32 %val10, 127169 %add11 = add i32 %val11, 127170 %add12 = add i32 %val12, 127171 %add13 = add i32 %val13, 127172 %add14 = add i32 %val14, 127173 %add15 = add i32 %val15, 127174 br label %store175 176store:177 %new0 = phi i32 [ %val0, %entry ], [ %add0, %add ]178 %new1 = phi i32 [ %val1, %entry ], [ %add1, %add ]179 %new2 = phi i32 [ %val2, %entry ], [ %add2, %add ]180 %new3 = phi i32 [ %val3, %entry ], [ %add3, %add ]181 %new4 = phi i32 [ %val4, %entry ], [ %add4, %add ]182 %new5 = phi i32 [ %val5, %entry ], [ %add5, %add ]183 %new6 = phi i32 [ %val6, %entry ], [ %add6, %add ]184 %new7 = phi i32 [ %val7, %entry ], [ %add7, %add ]185 %new8 = phi i32 [ %val8, %entry ], [ %add8, %add ]186 %new9 = phi i32 [ %val9, %entry ], [ %add9, %add ]187 %new10 = phi i32 [ %val10, %entry ], [ %add10, %add ]188 %new11 = phi i32 [ %val11, %entry ], [ %add11, %add ]189 %new12 = phi i32 [ %val12, %entry ], [ %add12, %add ]190 %new13 = phi i32 [ %val13, %entry ], [ %add13, %add ]191 %new14 = phi i32 [ %val14, %entry ], [ %add14, %add ]192 %new15 = phi i32 [ %val15, %entry ], [ %add15, %add ]193 194 store volatile i32 %new0, ptr %ptr195 store volatile i32 %new1, ptr %ptr196 store volatile i32 %new2, ptr %ptr197 store volatile i32 %new3, ptr %ptr198 store volatile i32 %new4, ptr %ptr199 store volatile i32 %new5, ptr %ptr200 store volatile i32 %new6, ptr %ptr201 store volatile i32 %new7, ptr %ptr202 store volatile i32 %new8, ptr %ptr203 store volatile i32 %new9, ptr %ptr204 store volatile i32 %new10, ptr %ptr205 store volatile i32 %new11, ptr %ptr206 store volatile i32 %new12, ptr %ptr207 store volatile i32 %new13, ptr %ptr208 store volatile i32 %new14, ptr %ptr209 store volatile i32 %new15, ptr %ptr210 211 ret void212}213 214; Check that adding -128 to a spilled value can use ASI.215define void @f12(ptr %ptr, i32 %sel) {216; CHECK-LABEL: f12:217; CHECK: asi {{[0-9]+}}(%r15), -128218; CHECK: br %r14219entry:220 %val0 = load volatile i32, ptr %ptr221 %val1 = load volatile i32, ptr %ptr222 %val2 = load volatile i32, ptr %ptr223 %val3 = load volatile i32, ptr %ptr224 %val4 = load volatile i32, ptr %ptr225 %val5 = load volatile i32, ptr %ptr226 %val6 = load volatile i32, ptr %ptr227 %val7 = load volatile i32, ptr %ptr228 %val8 = load volatile i32, ptr %ptr229 %val9 = load volatile i32, ptr %ptr230 %val10 = load volatile i32, ptr %ptr231 %val11 = load volatile i32, ptr %ptr232 %val12 = load volatile i32, ptr %ptr233 %val13 = load volatile i32, ptr %ptr234 %val14 = load volatile i32, ptr %ptr235 %val15 = load volatile i32, ptr %ptr236 237 %test = icmp ne i32 %sel, 0238 br i1 %test, label %add, label %store239 240add:241 %add0 = add i32 %val0, -128242 %add1 = add i32 %val1, -128243 %add2 = add i32 %val2, -128244 %add3 = add i32 %val3, -128245 %add4 = add i32 %val4, -128246 %add5 = add i32 %val5, -128247 %add6 = add i32 %val6, -128248 %add7 = add i32 %val7, -128249 %add8 = add i32 %val8, -128250 %add9 = add i32 %val9, -128251 %add10 = add i32 %val10, -128252 %add11 = add i32 %val11, -128253 %add12 = add i32 %val12, -128254 %add13 = add i32 %val13, -128255 %add14 = add i32 %val14, -128256 %add15 = add i32 %val15, -128257 br label %store258 259store:260 %new0 = phi i32 [ %val0, %entry ], [ %add0, %add ]261 %new1 = phi i32 [ %val1, %entry ], [ %add1, %add ]262 %new2 = phi i32 [ %val2, %entry ], [ %add2, %add ]263 %new3 = phi i32 [ %val3, %entry ], [ %add3, %add ]264 %new4 = phi i32 [ %val4, %entry ], [ %add4, %add ]265 %new5 = phi i32 [ %val5, %entry ], [ %add5, %add ]266 %new6 = phi i32 [ %val6, %entry ], [ %add6, %add ]267 %new7 = phi i32 [ %val7, %entry ], [ %add7, %add ]268 %new8 = phi i32 [ %val8, %entry ], [ %add8, %add ]269 %new9 = phi i32 [ %val9, %entry ], [ %add9, %add ]270 %new10 = phi i32 [ %val10, %entry ], [ %add10, %add ]271 %new11 = phi i32 [ %val11, %entry ], [ %add11, %add ]272 %new12 = phi i32 [ %val12, %entry ], [ %add12, %add ]273 %new13 = phi i32 [ %val13, %entry ], [ %add13, %add ]274 %new14 = phi i32 [ %val14, %entry ], [ %add14, %add ]275 %new15 = phi i32 [ %val15, %entry ], [ %add15, %add ]276 277 store volatile i32 %new0, ptr %ptr278 store volatile i32 %new1, ptr %ptr279 store volatile i32 %new2, ptr %ptr280 store volatile i32 %new3, ptr %ptr281 store volatile i32 %new4, ptr %ptr282 store volatile i32 %new5, ptr %ptr283 store volatile i32 %new6, ptr %ptr284 store volatile i32 %new7, ptr %ptr285 store volatile i32 %new8, ptr %ptr286 store volatile i32 %new9, ptr %ptr287 store volatile i32 %new10, ptr %ptr288 store volatile i32 %new11, ptr %ptr289 store volatile i32 %new12, ptr %ptr290 store volatile i32 %new13, ptr %ptr291 store volatile i32 %new14, ptr %ptr292 store volatile i32 %new15, ptr %ptr293 294 ret void295}296