Richard Sandiford | 21235a2 | 2013-10-01 12:49:07 +0000 | [diff] [blame] | 1 | ; Test spills of zero extensions when high GR32s are available. |
| 2 | ; |
| 3 | ; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z196 | FileCheck %s |
| 4 | |
| 5 | ; Test a case where we spill the source of at least one LLCRMux. We want |
| 6 | ; to use LLC(H) if possible. |
| 7 | define void @f1(i32 *%ptr) { |
| 8 | ; CHECK-LABEL: f1: |
| 9 | ; CHECK: llc{{h?}} {{%r[0-9]+}}, 16{{[37]}}(%r15) |
| 10 | ; CHECK: br %r14 |
| 11 | %val0 = load volatile i32 *%ptr |
| 12 | %val1 = load volatile i32 *%ptr |
| 13 | %val2 = load volatile i32 *%ptr |
| 14 | %val3 = load volatile i32 *%ptr |
| 15 | %val4 = load volatile i32 *%ptr |
| 16 | %val5 = load volatile i32 *%ptr |
| 17 | %val6 = load volatile i32 *%ptr |
| 18 | %val7 = load volatile i32 *%ptr |
| 19 | %val8 = load volatile i32 *%ptr |
| 20 | %val9 = load volatile i32 *%ptr |
| 21 | %val10 = load volatile i32 *%ptr |
| 22 | %val11 = load volatile i32 *%ptr |
| 23 | %val12 = load volatile i32 *%ptr |
| 24 | %val13 = load volatile i32 *%ptr |
| 25 | %val14 = load volatile i32 *%ptr |
| 26 | %val15 = load volatile i32 *%ptr |
| 27 | %val16 = load volatile i32 *%ptr |
| 28 | %val17 = load volatile i32 *%ptr |
| 29 | %val18 = load volatile i32 *%ptr |
| 30 | %val19 = load volatile i32 *%ptr |
| 31 | %val20 = load volatile i32 *%ptr |
| 32 | %val21 = load volatile i32 *%ptr |
| 33 | %val22 = load volatile i32 *%ptr |
| 34 | %val23 = load volatile i32 *%ptr |
| 35 | %val24 = load volatile i32 *%ptr |
| 36 | %val25 = load volatile i32 *%ptr |
| 37 | %val26 = load volatile i32 *%ptr |
| 38 | %val27 = load volatile i32 *%ptr |
| 39 | %val28 = load volatile i32 *%ptr |
| 40 | %val29 = load volatile i32 *%ptr |
| 41 | %val30 = load volatile i32 *%ptr |
| 42 | %val31 = load volatile i32 *%ptr |
| 43 | |
| 44 | %trunc0 = trunc i32 %val0 to i8 |
| 45 | %trunc1 = trunc i32 %val1 to i8 |
| 46 | %trunc2 = trunc i32 %val2 to i8 |
| 47 | %trunc3 = trunc i32 %val3 to i8 |
| 48 | %trunc4 = trunc i32 %val4 to i8 |
| 49 | %trunc5 = trunc i32 %val5 to i8 |
| 50 | %trunc6 = trunc i32 %val6 to i8 |
| 51 | %trunc7 = trunc i32 %val7 to i8 |
| 52 | %trunc8 = trunc i32 %val8 to i8 |
| 53 | %trunc9 = trunc i32 %val9 to i8 |
| 54 | %trunc10 = trunc i32 %val10 to i8 |
| 55 | %trunc11 = trunc i32 %val11 to i8 |
| 56 | %trunc12 = trunc i32 %val12 to i8 |
| 57 | %trunc13 = trunc i32 %val13 to i8 |
| 58 | %trunc14 = trunc i32 %val14 to i8 |
| 59 | %trunc15 = trunc i32 %val15 to i8 |
| 60 | %trunc16 = trunc i32 %val16 to i8 |
| 61 | %trunc17 = trunc i32 %val17 to i8 |
| 62 | %trunc18 = trunc i32 %val18 to i8 |
| 63 | %trunc19 = trunc i32 %val19 to i8 |
| 64 | %trunc20 = trunc i32 %val20 to i8 |
| 65 | %trunc21 = trunc i32 %val21 to i8 |
| 66 | %trunc22 = trunc i32 %val22 to i8 |
| 67 | %trunc23 = trunc i32 %val23 to i8 |
| 68 | %trunc24 = trunc i32 %val24 to i8 |
| 69 | %trunc25 = trunc i32 %val25 to i8 |
| 70 | %trunc26 = trunc i32 %val26 to i8 |
| 71 | %trunc27 = trunc i32 %val27 to i8 |
| 72 | %trunc28 = trunc i32 %val28 to i8 |
| 73 | %trunc29 = trunc i32 %val29 to i8 |
| 74 | %trunc30 = trunc i32 %val30 to i8 |
| 75 | %trunc31 = trunc i32 %val31 to i8 |
| 76 | |
| 77 | %ext0 = zext i8 %trunc0 to i32 |
| 78 | %ext1 = zext i8 %trunc1 to i32 |
| 79 | %ext2 = zext i8 %trunc2 to i32 |
| 80 | %ext3 = zext i8 %trunc3 to i32 |
| 81 | %ext4 = zext i8 %trunc4 to i32 |
| 82 | %ext5 = zext i8 %trunc5 to i32 |
| 83 | %ext6 = zext i8 %trunc6 to i32 |
| 84 | %ext7 = zext i8 %trunc7 to i32 |
| 85 | %ext8 = zext i8 %trunc8 to i32 |
| 86 | %ext9 = zext i8 %trunc9 to i32 |
| 87 | %ext10 = zext i8 %trunc10 to i32 |
| 88 | %ext11 = zext i8 %trunc11 to i32 |
| 89 | %ext12 = zext i8 %trunc12 to i32 |
| 90 | %ext13 = zext i8 %trunc13 to i32 |
| 91 | %ext14 = zext i8 %trunc14 to i32 |
| 92 | %ext15 = zext i8 %trunc15 to i32 |
| 93 | %ext16 = zext i8 %trunc16 to i32 |
| 94 | %ext17 = zext i8 %trunc17 to i32 |
| 95 | %ext18 = zext i8 %trunc18 to i32 |
| 96 | %ext19 = zext i8 %trunc19 to i32 |
| 97 | %ext20 = zext i8 %trunc20 to i32 |
| 98 | %ext21 = zext i8 %trunc21 to i32 |
| 99 | %ext22 = zext i8 %trunc22 to i32 |
| 100 | %ext23 = zext i8 %trunc23 to i32 |
| 101 | %ext24 = zext i8 %trunc24 to i32 |
| 102 | %ext25 = zext i8 %trunc25 to i32 |
| 103 | %ext26 = zext i8 %trunc26 to i32 |
| 104 | %ext27 = zext i8 %trunc27 to i32 |
| 105 | %ext28 = zext i8 %trunc28 to i32 |
| 106 | %ext29 = zext i8 %trunc29 to i32 |
| 107 | %ext30 = zext i8 %trunc30 to i32 |
| 108 | %ext31 = zext i8 %trunc31 to i32 |
| 109 | |
| 110 | store volatile i32 %val0, i32 *%ptr |
| 111 | store volatile i32 %val1, i32 *%ptr |
| 112 | store volatile i32 %val2, i32 *%ptr |
| 113 | store volatile i32 %val3, i32 *%ptr |
| 114 | store volatile i32 %val4, i32 *%ptr |
| 115 | store volatile i32 %val5, i32 *%ptr |
| 116 | store volatile i32 %val6, i32 *%ptr |
| 117 | store volatile i32 %val7, i32 *%ptr |
| 118 | store volatile i32 %val8, i32 *%ptr |
| 119 | store volatile i32 %val9, i32 *%ptr |
| 120 | store volatile i32 %val10, i32 *%ptr |
| 121 | store volatile i32 %val11, i32 *%ptr |
| 122 | store volatile i32 %val12, i32 *%ptr |
| 123 | store volatile i32 %val13, i32 *%ptr |
| 124 | store volatile i32 %val14, i32 *%ptr |
| 125 | store volatile i32 %val15, i32 *%ptr |
| 126 | store volatile i32 %val16, i32 *%ptr |
| 127 | store volatile i32 %val17, i32 *%ptr |
| 128 | store volatile i32 %val18, i32 *%ptr |
| 129 | store volatile i32 %val19, i32 *%ptr |
| 130 | store volatile i32 %val20, i32 *%ptr |
| 131 | store volatile i32 %val21, i32 *%ptr |
| 132 | store volatile i32 %val22, i32 *%ptr |
| 133 | store volatile i32 %val23, i32 *%ptr |
| 134 | store volatile i32 %val24, i32 *%ptr |
| 135 | store volatile i32 %val25, i32 *%ptr |
| 136 | store volatile i32 %val26, i32 *%ptr |
| 137 | store volatile i32 %val27, i32 *%ptr |
| 138 | store volatile i32 %val28, i32 *%ptr |
| 139 | store volatile i32 %val29, i32 *%ptr |
| 140 | store volatile i32 %val30, i32 *%ptr |
| 141 | store volatile i32 %val31, i32 *%ptr |
| 142 | |
| 143 | store volatile i32 %ext0, i32 *%ptr |
| 144 | store volatile i32 %ext1, i32 *%ptr |
| 145 | store volatile i32 %ext2, i32 *%ptr |
| 146 | store volatile i32 %ext3, i32 *%ptr |
| 147 | store volatile i32 %ext4, i32 *%ptr |
| 148 | store volatile i32 %ext5, i32 *%ptr |
| 149 | store volatile i32 %ext6, i32 *%ptr |
| 150 | store volatile i32 %ext7, i32 *%ptr |
| 151 | store volatile i32 %ext8, i32 *%ptr |
| 152 | store volatile i32 %ext9, i32 *%ptr |
| 153 | store volatile i32 %ext10, i32 *%ptr |
| 154 | store volatile i32 %ext11, i32 *%ptr |
| 155 | store volatile i32 %ext12, i32 *%ptr |
| 156 | store volatile i32 %ext13, i32 *%ptr |
| 157 | store volatile i32 %ext14, i32 *%ptr |
| 158 | store volatile i32 %ext15, i32 *%ptr |
| 159 | store volatile i32 %ext16, i32 *%ptr |
| 160 | store volatile i32 %ext17, i32 *%ptr |
| 161 | store volatile i32 %ext18, i32 *%ptr |
| 162 | store volatile i32 %ext19, i32 *%ptr |
| 163 | store volatile i32 %ext20, i32 *%ptr |
| 164 | store volatile i32 %ext21, i32 *%ptr |
| 165 | store volatile i32 %ext22, i32 *%ptr |
| 166 | store volatile i32 %ext23, i32 *%ptr |
| 167 | store volatile i32 %ext24, i32 *%ptr |
| 168 | store volatile i32 %ext25, i32 *%ptr |
| 169 | store volatile i32 %ext26, i32 *%ptr |
| 170 | store volatile i32 %ext27, i32 *%ptr |
| 171 | store volatile i32 %ext28, i32 *%ptr |
| 172 | store volatile i32 %ext29, i32 *%ptr |
| 173 | store volatile i32 %ext30, i32 *%ptr |
| 174 | store volatile i32 %ext31, i32 *%ptr |
| 175 | |
| 176 | ret void |
| 177 | } |
| 178 | |
| 179 | ; Same again with i16, which should use LLH(H). |
| 180 | define void @f2(i32 *%ptr) { |
| 181 | ; CHECK-LABEL: f2: |
| 182 | ; CHECK: llh{{h?}} {{%r[0-9]+}}, 16{{[26]}}(%r15) |
| 183 | ; CHECK: br %r14 |
| 184 | %val0 = load volatile i32 *%ptr |
| 185 | %val1 = load volatile i32 *%ptr |
| 186 | %val2 = load volatile i32 *%ptr |
| 187 | %val3 = load volatile i32 *%ptr |
| 188 | %val4 = load volatile i32 *%ptr |
| 189 | %val5 = load volatile i32 *%ptr |
| 190 | %val6 = load volatile i32 *%ptr |
| 191 | %val7 = load volatile i32 *%ptr |
| 192 | %val8 = load volatile i32 *%ptr |
| 193 | %val9 = load volatile i32 *%ptr |
| 194 | %val10 = load volatile i32 *%ptr |
| 195 | %val11 = load volatile i32 *%ptr |
| 196 | %val12 = load volatile i32 *%ptr |
| 197 | %val13 = load volatile i32 *%ptr |
| 198 | %val14 = load volatile i32 *%ptr |
| 199 | %val15 = load volatile i32 *%ptr |
| 200 | %val16 = load volatile i32 *%ptr |
| 201 | %val17 = load volatile i32 *%ptr |
| 202 | %val18 = load volatile i32 *%ptr |
| 203 | %val19 = load volatile i32 *%ptr |
| 204 | %val20 = load volatile i32 *%ptr |
| 205 | %val21 = load volatile i32 *%ptr |
| 206 | %val22 = load volatile i32 *%ptr |
| 207 | %val23 = load volatile i32 *%ptr |
| 208 | %val24 = load volatile i32 *%ptr |
| 209 | %val25 = load volatile i32 *%ptr |
| 210 | %val26 = load volatile i32 *%ptr |
| 211 | %val27 = load volatile i32 *%ptr |
| 212 | %val28 = load volatile i32 *%ptr |
| 213 | %val29 = load volatile i32 *%ptr |
| 214 | %val30 = load volatile i32 *%ptr |
| 215 | %val31 = load volatile i32 *%ptr |
| 216 | |
| 217 | %trunc0 = trunc i32 %val0 to i16 |
| 218 | %trunc1 = trunc i32 %val1 to i16 |
| 219 | %trunc2 = trunc i32 %val2 to i16 |
| 220 | %trunc3 = trunc i32 %val3 to i16 |
| 221 | %trunc4 = trunc i32 %val4 to i16 |
| 222 | %trunc5 = trunc i32 %val5 to i16 |
| 223 | %trunc6 = trunc i32 %val6 to i16 |
| 224 | %trunc7 = trunc i32 %val7 to i16 |
| 225 | %trunc8 = trunc i32 %val8 to i16 |
| 226 | %trunc9 = trunc i32 %val9 to i16 |
| 227 | %trunc10 = trunc i32 %val10 to i16 |
| 228 | %trunc11 = trunc i32 %val11 to i16 |
| 229 | %trunc12 = trunc i32 %val12 to i16 |
| 230 | %trunc13 = trunc i32 %val13 to i16 |
| 231 | %trunc14 = trunc i32 %val14 to i16 |
| 232 | %trunc15 = trunc i32 %val15 to i16 |
| 233 | %trunc16 = trunc i32 %val16 to i16 |
| 234 | %trunc17 = trunc i32 %val17 to i16 |
| 235 | %trunc18 = trunc i32 %val18 to i16 |
| 236 | %trunc19 = trunc i32 %val19 to i16 |
| 237 | %trunc20 = trunc i32 %val20 to i16 |
| 238 | %trunc21 = trunc i32 %val21 to i16 |
| 239 | %trunc22 = trunc i32 %val22 to i16 |
| 240 | %trunc23 = trunc i32 %val23 to i16 |
| 241 | %trunc24 = trunc i32 %val24 to i16 |
| 242 | %trunc25 = trunc i32 %val25 to i16 |
| 243 | %trunc26 = trunc i32 %val26 to i16 |
| 244 | %trunc27 = trunc i32 %val27 to i16 |
| 245 | %trunc28 = trunc i32 %val28 to i16 |
| 246 | %trunc29 = trunc i32 %val29 to i16 |
| 247 | %trunc30 = trunc i32 %val30 to i16 |
| 248 | %trunc31 = trunc i32 %val31 to i16 |
| 249 | |
| 250 | %ext0 = zext i16 %trunc0 to i32 |
| 251 | %ext1 = zext i16 %trunc1 to i32 |
| 252 | %ext2 = zext i16 %trunc2 to i32 |
| 253 | %ext3 = zext i16 %trunc3 to i32 |
| 254 | %ext4 = zext i16 %trunc4 to i32 |
| 255 | %ext5 = zext i16 %trunc5 to i32 |
| 256 | %ext6 = zext i16 %trunc6 to i32 |
| 257 | %ext7 = zext i16 %trunc7 to i32 |
| 258 | %ext8 = zext i16 %trunc8 to i32 |
| 259 | %ext9 = zext i16 %trunc9 to i32 |
| 260 | %ext10 = zext i16 %trunc10 to i32 |
| 261 | %ext11 = zext i16 %trunc11 to i32 |
| 262 | %ext12 = zext i16 %trunc12 to i32 |
| 263 | %ext13 = zext i16 %trunc13 to i32 |
| 264 | %ext14 = zext i16 %trunc14 to i32 |
| 265 | %ext15 = zext i16 %trunc15 to i32 |
| 266 | %ext16 = zext i16 %trunc16 to i32 |
| 267 | %ext17 = zext i16 %trunc17 to i32 |
| 268 | %ext18 = zext i16 %trunc18 to i32 |
| 269 | %ext19 = zext i16 %trunc19 to i32 |
| 270 | %ext20 = zext i16 %trunc20 to i32 |
| 271 | %ext21 = zext i16 %trunc21 to i32 |
| 272 | %ext22 = zext i16 %trunc22 to i32 |
| 273 | %ext23 = zext i16 %trunc23 to i32 |
| 274 | %ext24 = zext i16 %trunc24 to i32 |
| 275 | %ext25 = zext i16 %trunc25 to i32 |
| 276 | %ext26 = zext i16 %trunc26 to i32 |
| 277 | %ext27 = zext i16 %trunc27 to i32 |
| 278 | %ext28 = zext i16 %trunc28 to i32 |
| 279 | %ext29 = zext i16 %trunc29 to i32 |
| 280 | %ext30 = zext i16 %trunc30 to i32 |
| 281 | %ext31 = zext i16 %trunc31 to i32 |
| 282 | |
| 283 | store volatile i32 %val0, i32 *%ptr |
| 284 | store volatile i32 %val1, i32 *%ptr |
| 285 | store volatile i32 %val2, i32 *%ptr |
| 286 | store volatile i32 %val3, i32 *%ptr |
| 287 | store volatile i32 %val4, i32 *%ptr |
| 288 | store volatile i32 %val5, i32 *%ptr |
| 289 | store volatile i32 %val6, i32 *%ptr |
| 290 | store volatile i32 %val7, i32 *%ptr |
| 291 | store volatile i32 %val8, i32 *%ptr |
| 292 | store volatile i32 %val9, i32 *%ptr |
| 293 | store volatile i32 %val10, i32 *%ptr |
| 294 | store volatile i32 %val11, i32 *%ptr |
| 295 | store volatile i32 %val12, i32 *%ptr |
| 296 | store volatile i32 %val13, i32 *%ptr |
| 297 | store volatile i32 %val14, i32 *%ptr |
| 298 | store volatile i32 %val15, i32 *%ptr |
| 299 | store volatile i32 %val16, i32 *%ptr |
| 300 | store volatile i32 %val17, i32 *%ptr |
| 301 | store volatile i32 %val18, i32 *%ptr |
| 302 | store volatile i32 %val19, i32 *%ptr |
| 303 | store volatile i32 %val20, i32 *%ptr |
| 304 | store volatile i32 %val21, i32 *%ptr |
| 305 | store volatile i32 %val22, i32 *%ptr |
| 306 | store volatile i32 %val23, i32 *%ptr |
| 307 | store volatile i32 %val24, i32 *%ptr |
| 308 | store volatile i32 %val25, i32 *%ptr |
| 309 | store volatile i32 %val26, i32 *%ptr |
| 310 | store volatile i32 %val27, i32 *%ptr |
| 311 | store volatile i32 %val28, i32 *%ptr |
| 312 | store volatile i32 %val29, i32 *%ptr |
| 313 | store volatile i32 %val30, i32 *%ptr |
| 314 | store volatile i32 %val31, i32 *%ptr |
| 315 | |
| 316 | store volatile i32 %ext0, i32 *%ptr |
| 317 | store volatile i32 %ext1, i32 *%ptr |
| 318 | store volatile i32 %ext2, i32 *%ptr |
| 319 | store volatile i32 %ext3, i32 *%ptr |
| 320 | store volatile i32 %ext4, i32 *%ptr |
| 321 | store volatile i32 %ext5, i32 *%ptr |
| 322 | store volatile i32 %ext6, i32 *%ptr |
| 323 | store volatile i32 %ext7, i32 *%ptr |
| 324 | store volatile i32 %ext8, i32 *%ptr |
| 325 | store volatile i32 %ext9, i32 *%ptr |
| 326 | store volatile i32 %ext10, i32 *%ptr |
| 327 | store volatile i32 %ext11, i32 *%ptr |
| 328 | store volatile i32 %ext12, i32 *%ptr |
| 329 | store volatile i32 %ext13, i32 *%ptr |
| 330 | store volatile i32 %ext14, i32 *%ptr |
| 331 | store volatile i32 %ext15, i32 *%ptr |
| 332 | store volatile i32 %ext16, i32 *%ptr |
| 333 | store volatile i32 %ext17, i32 *%ptr |
| 334 | store volatile i32 %ext18, i32 *%ptr |
| 335 | store volatile i32 %ext19, i32 *%ptr |
| 336 | store volatile i32 %ext20, i32 *%ptr |
| 337 | store volatile i32 %ext21, i32 *%ptr |
| 338 | store volatile i32 %ext22, i32 *%ptr |
| 339 | store volatile i32 %ext23, i32 *%ptr |
| 340 | store volatile i32 %ext24, i32 *%ptr |
| 341 | store volatile i32 %ext25, i32 *%ptr |
| 342 | store volatile i32 %ext26, i32 *%ptr |
| 343 | store volatile i32 %ext27, i32 *%ptr |
| 344 | store volatile i32 %ext28, i32 *%ptr |
| 345 | store volatile i32 %ext29, i32 *%ptr |
| 346 | store volatile i32 %ext30, i32 *%ptr |
| 347 | store volatile i32 %ext31, i32 *%ptr |
| 348 | |
| 349 | ret void |
| 350 | } |