1 target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64" 2 target triple = "powerpc64-unknown-linux-gnu" 3 ; RUN: llc < %s -march=ppc64 | FileCheck %s 4 5 ; CHECK: test_pos1_ir_ne 6 ; CHECK: bdnz 7 ; a < b 8 define void @test_pos1_ir_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { 9 entry: 10 %cmp3 = icmp slt i32 32623, %b 11 br i1 %cmp3, label %for.body.lr.ph, label %for.end 12 13 for.body.lr.ph: ; preds = %entry 14 br label %for.body 15 16 for.body: ; preds = %for.body.lr.ph, %for.body 17 %i.04 = phi i32 [ 32623, %for.body.lr.ph ], [ %inc, %for.body ] 18 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04 19 %0 = load i8, i8* %arrayidx, align 1 20 %conv = zext i8 %0 to i32 21 %add = add nsw i32 %conv, 1 22 %conv1 = trunc i32 %add to i8 23 store i8 %conv1, i8* %arrayidx, align 1 24 %inc = add nsw i32 %i.04, 1 25 %cmp = icmp ne i32 %inc, %b 26 br i1 %cmp, label %for.body, label %for.end 27 28 for.end: ; preds = %for.body, %entry 29 ret void 30 } 31 32 33 34 ; CHECK: test_pos2_ir_ne 35 ; FIXME: Support this loop! 36 ; CHECK-NOT: bdnz 37 ; a < b 38 define void @test_pos2_ir_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { 39 entry: 40 %cmp3 = icmp slt i32 29554, %b 41 br i1 %cmp3, label %for.body.lr.ph, label %for.end 42 43 for.body.lr.ph: ; preds = %entry 44 br label %for.body 45 46 for.body: ; preds = %for.body.lr.ph, %for.body 47 %i.04 = phi i32 [ 29554, %for.body.lr.ph ], [ %inc, %for.body ] 48 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04 49 %0 = load i8, i8* %arrayidx, align 1 50 %conv = zext i8 %0 to i32 51 %add = add nsw i32 %conv, 1 52 %conv1 = trunc i32 %add to i8 53 store i8 %conv1, i8* %arrayidx, align 1 54 %inc = add nsw i32 %i.04, 2 55 %cmp = icmp ne i32 %inc, %b 56 br i1 %cmp, label %for.body, label %for.end 57 58 for.end: ; preds = %for.body, %entry 59 ret void 60 } 61 62 63 64 ; CHECK: test_pos4_ir_ne 65 ; FIXME: Support this loop! 66 ; CHECK-NOT: bdnz 67 ; a < b 68 define void @test_pos4_ir_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { 69 entry: 70 %cmp3 = icmp slt i32 15692, %b 71 br i1 %cmp3, label %for.body.lr.ph, label %for.end 72 73 for.body.lr.ph: ; preds = %entry 74 br label %for.body 75 76 for.body: ; preds = %for.body.lr.ph, %for.body 77 %i.04 = phi i32 [ 15692, %for.body.lr.ph ], [ %inc, %for.body ] 78 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04 79 %0 = load i8, i8* %arrayidx, align 1 80 %conv = zext i8 %0 to i32 81 %add = add nsw i32 %conv, 1 82 %conv1 = trunc i32 %add to i8 83 store i8 %conv1, i8* %arrayidx, align 1 84 %inc = add nsw i32 %i.04, 4 85 %cmp = icmp ne i32 %inc, %b 86 br i1 %cmp, label %for.body, label %for.end 87 88 for.end: ; preds = %for.body, %entry 89 ret void 90 } 91 92 93 94 ; CHECK: test_pos8_ir_ne 95 ; FIXME: Support this loop! 96 ; CHECK-NOT: bdnz 97 ; a < b 98 define void @test_pos8_ir_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { 99 entry: 100 %cmp3 = icmp slt i32 10449, %b 101 br i1 %cmp3, label %for.body.lr.ph, label %for.end 102 103 for.body.lr.ph: ; preds = %entry 104 br label %for.body 105 106 for.body: ; preds = %for.body.lr.ph, %for.body 107 %i.04 = phi i32 [ 10449, %for.body.lr.ph ], [ %inc, %for.body ] 108 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04 109 %0 = load i8, i8* %arrayidx, align 1 110 %conv = zext i8 %0 to i32 111 %add = add nsw i32 %conv, 1 112 %conv1 = trunc i32 %add to i8 113 store i8 %conv1, i8* %arrayidx, align 1 114 %inc = add nsw i32 %i.04, 8 115 %cmp = icmp ne i32 %inc, %b 116 br i1 %cmp, label %for.body, label %for.end 117 118 for.end: ; preds = %for.body, %entry 119 ret void 120 } 121 122 123 124 ; CHECK: test_pos16_ir_ne 125 ; FIXME: Support this loop! 126 ; CHECK-NOT: bdnz 127 ; a < b 128 define void @test_pos16_ir_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { 129 entry: 130 %cmp3 = icmp slt i32 32087, %b 131 br i1 %cmp3, label %for.body.lr.ph, label %for.end 132 133 for.body.lr.ph: ; preds = %entry 134 br label %for.body 135 136 for.body: ; preds = %for.body.lr.ph, %for.body 137 %i.04 = phi i32 [ 32087, %for.body.lr.ph ], [ %inc, %for.body ] 138 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04 139 %0 = load i8, i8* %arrayidx, align 1 140 %conv = zext i8 %0 to i32 141 %add = add nsw i32 %conv, 1 142 %conv1 = trunc i32 %add to i8 143 store i8 %conv1, i8* %arrayidx, align 1 144 %inc = add nsw i32 %i.04, 16 145 %cmp = icmp ne i32 %inc, %b 146 br i1 %cmp, label %for.body, label %for.end 147 148 for.end: ; preds = %for.body, %entry 149 ret void 150 } 151 152 153 154 ; CHECK: test_pos1_ri_ne 155 ; CHECK: bdnz 156 ; a < b 157 define void @test_pos1_ri_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { 158 entry: 159 %cmp3 = icmp slt i32 %a, 3472 160 br i1 %cmp3, label %for.body.lr.ph, label %for.end 161 162 for.body.lr.ph: ; preds = %entry 163 br label %for.body 164 165 for.body: ; preds = %for.body.lr.ph, %for.body 166 %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] 167 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04 168 %0 = load i8, i8* %arrayidx, align 1 169 %conv = zext i8 %0 to i32 170 %add = add nsw i32 %conv, 1 171 %conv1 = trunc i32 %add to i8 172 store i8 %conv1, i8* %arrayidx, align 1 173 %inc = add nsw i32 %i.04, 1 174 %cmp = icmp ne i32 %inc, 3472 175 br i1 %cmp, label %for.body, label %for.end 176 177 for.end: ; preds = %for.body, %entry 178 ret void 179 } 180 181 182 183 ; CHECK: test_pos2_ri_ne 184 ; FIXME: Support this loop! 185 ; CHECK-NOT: bdnz 186 ; a < b 187 define void @test_pos2_ri_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { 188 entry: 189 %cmp3 = icmp slt i32 %a, 8730 190 br i1 %cmp3, label %for.body.lr.ph, label %for.end 191 192 for.body.lr.ph: ; preds = %entry 193 br label %for.body 194 195 for.body: ; preds = %for.body.lr.ph, %for.body 196 %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] 197 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04 198 %0 = load i8, i8* %arrayidx, align 1 199 %conv = zext i8 %0 to i32 200 %add = add nsw i32 %conv, 1 201 %conv1 = trunc i32 %add to i8 202 store i8 %conv1, i8* %arrayidx, align 1 203 %inc = add nsw i32 %i.04, 2 204 %cmp = icmp ne i32 %inc, 8730 205 br i1 %cmp, label %for.body, label %for.end 206 207 for.end: ; preds = %for.body, %entry 208 ret void 209 } 210 211 212 213 ; CHECK: test_pos4_ri_ne 214 ; FIXME: Support this loop! 215 ; CHECK-NOT: bdnz 216 ; a < b 217 define void @test_pos4_ri_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { 218 entry: 219 %cmp3 = icmp slt i32 %a, 1493 220 br i1 %cmp3, label %for.body.lr.ph, label %for.end 221 222 for.body.lr.ph: ; preds = %entry 223 br label %for.body 224 225 for.body: ; preds = %for.body.lr.ph, %for.body 226 %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] 227 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04 228 %0 = load i8, i8* %arrayidx, align 1 229 %conv = zext i8 %0 to i32 230 %add = add nsw i32 %conv, 1 231 %conv1 = trunc i32 %add to i8 232 store i8 %conv1, i8* %arrayidx, align 1 233 %inc = add nsw i32 %i.04, 4 234 %cmp = icmp ne i32 %inc, 1493 235 br i1 %cmp, label %for.body, label %for.end 236 237 for.end: ; preds = %for.body, %entry 238 ret void 239 } 240 241 242 243 ; CHECK: test_pos8_ri_ne 244 ; FIXME: Support this loop! 245 ; CHECK-NOT: bdnz 246 ; a < b 247 define void @test_pos8_ri_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { 248 entry: 249 %cmp3 = icmp slt i32 %a, 1706 250 br i1 %cmp3, label %for.body.lr.ph, label %for.end 251 252 for.body.lr.ph: ; preds = %entry 253 br label %for.body 254 255 for.body: ; preds = %for.body.lr.ph, %for.body 256 %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] 257 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04 258 %0 = load i8, i8* %arrayidx, align 1 259 %conv = zext i8 %0 to i32 260 %add = add nsw i32 %conv, 1 261 %conv1 = trunc i32 %add to i8 262 store i8 %conv1, i8* %arrayidx, align 1 263 %inc = add nsw i32 %i.04, 8 264 %cmp = icmp ne i32 %inc, 1706 265 br i1 %cmp, label %for.body, label %for.end 266 267 for.end: ; preds = %for.body, %entry 268 ret void 269 } 270 271 272 273 ; CHECK: test_pos16_ri_ne 274 ; FIXME: Support this loop! 275 ; CHECK-NOT: bdnz 276 ; a < b 277 define void @test_pos16_ri_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { 278 entry: 279 %cmp3 = icmp slt i32 %a, 1886 280 br i1 %cmp3, label %for.body.lr.ph, label %for.end 281 282 for.body.lr.ph: ; preds = %entry 283 br label %for.body 284 285 for.body: ; preds = %for.body.lr.ph, %for.body 286 %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] 287 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04 288 %0 = load i8, i8* %arrayidx, align 1 289 %conv = zext i8 %0 to i32 290 %add = add nsw i32 %conv, 1 291 %conv1 = trunc i32 %add to i8 292 store i8 %conv1, i8* %arrayidx, align 1 293 %inc = add nsw i32 %i.04, 16 294 %cmp = icmp ne i32 %inc, 1886 295 br i1 %cmp, label %for.body, label %for.end 296 297 for.end: ; preds = %for.body, %entry 298 ret void 299 } 300 301 302 303 ; CHECK: test_pos1_rr_ne 304 ; CHECK: bdnz 305 ; a < b 306 define void @test_pos1_rr_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { 307 entry: 308 %cmp3 = icmp slt i32 %a, %b 309 br i1 %cmp3, label %for.body.lr.ph, label %for.end 310 311 for.body.lr.ph: ; preds = %entry 312 br label %for.body 313 314 for.body: ; preds = %for.body.lr.ph, %for.body 315 %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] 316 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04 317 %0 = load i8, i8* %arrayidx, align 1 318 %conv = zext i8 %0 to i32 319 %add = add nsw i32 %conv, 1 320 %conv1 = trunc i32 %add to i8 321 store i8 %conv1, i8* %arrayidx, align 1 322 %inc = add nsw i32 %i.04, 1 323 %cmp = icmp ne i32 %inc, %b 324 br i1 %cmp, label %for.body, label %for.end 325 326 for.end: ; preds = %for.body, %entry 327 ret void 328 } 329 330 331 332 ; CHECK: test_pos2_rr_ne 333 ; FIXME: Support this loop! 334 ; CHECK-NOT: bdnz 335 ; a < b 336 define void @test_pos2_rr_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { 337 entry: 338 %cmp3 = icmp slt i32 %a, %b 339 br i1 %cmp3, label %for.body.lr.ph, label %for.end 340 341 for.body.lr.ph: ; preds = %entry 342 br label %for.body 343 344 for.body: ; preds = %for.body.lr.ph, %for.body 345 %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] 346 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04 347 %0 = load i8, i8* %arrayidx, align 1 348 %conv = zext i8 %0 to i32 349 %add = add nsw i32 %conv, 1 350 %conv1 = trunc i32 %add to i8 351 store i8 %conv1, i8* %arrayidx, align 1 352 %inc = add nsw i32 %i.04, 2 353 %cmp = icmp ne i32 %inc, %b 354 br i1 %cmp, label %for.body, label %for.end 355 356 for.end: ; preds = %for.body, %entry 357 ret void 358 } 359 360 361 362 ; CHECK: test_pos4_rr_ne 363 ; FIXME: Support this loop! 364 ; CHECK-NOT: bdnz 365 ; a < b 366 define void @test_pos4_rr_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { 367 entry: 368 %cmp3 = icmp slt i32 %a, %b 369 br i1 %cmp3, label %for.body.lr.ph, label %for.end 370 371 for.body.lr.ph: ; preds = %entry 372 br label %for.body 373 374 for.body: ; preds = %for.body.lr.ph, %for.body 375 %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] 376 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04 377 %0 = load i8, i8* %arrayidx, align 1 378 %conv = zext i8 %0 to i32 379 %add = add nsw i32 %conv, 1 380 %conv1 = trunc i32 %add to i8 381 store i8 %conv1, i8* %arrayidx, align 1 382 %inc = add nsw i32 %i.04, 4 383 %cmp = icmp ne i32 %inc, %b 384 br i1 %cmp, label %for.body, label %for.end 385 386 for.end: ; preds = %for.body, %entry 387 ret void 388 } 389 390 391 392 ; CHECK: test_pos8_rr_ne 393 ; FIXME: Support this loop! 394 ; CHECK-NOT: bdnz 395 ; a < b 396 define void @test_pos8_rr_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { 397 entry: 398 %cmp3 = icmp slt i32 %a, %b 399 br i1 %cmp3, label %for.body.lr.ph, label %for.end 400 401 for.body.lr.ph: ; preds = %entry 402 br label %for.body 403 404 for.body: ; preds = %for.body.lr.ph, %for.body 405 %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] 406 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04 407 %0 = load i8, i8* %arrayidx, align 1 408 %conv = zext i8 %0 to i32 409 %add = add nsw i32 %conv, 1 410 %conv1 = trunc i32 %add to i8 411 store i8 %conv1, i8* %arrayidx, align 1 412 %inc = add nsw i32 %i.04, 8 413 %cmp = icmp ne i32 %inc, %b 414 br i1 %cmp, label %for.body, label %for.end 415 416 for.end: ; preds = %for.body, %entry 417 ret void 418 } 419 420 421 422 ; CHECK: test_pos16_rr_ne 423 ; FIXME: Support this loop! 424 ; CHECK-NOT: bdnz 425 ; a < b 426 define void @test_pos16_rr_ne(i8* nocapture %p, i32 %a, i32 %b) nounwind { 427 entry: 428 %cmp3 = icmp slt i32 %a, %b 429 br i1 %cmp3, label %for.body.lr.ph, label %for.end 430 431 for.body.lr.ph: ; preds = %entry 432 br label %for.body 433 434 for.body: ; preds = %for.body.lr.ph, %for.body 435 %i.04 = phi i32 [ %a, %for.body.lr.ph ], [ %inc, %for.body ] 436 %arrayidx = getelementptr inbounds i8, i8* %p, i32 %i.04 437 %0 = load i8, i8* %arrayidx, align 1 438 %conv = zext i8 %0 to i32 439 %add = add nsw i32 %conv, 1 440 %conv1 = trunc i32 %add to i8 441 store i8 %conv1, i8* %arrayidx, align 1 442 %inc = add nsw i32 %i.04, 16 443 %cmp = icmp ne i32 %inc, %b 444 br i1 %cmp, label %for.body, label %for.end 445 446 for.end: ; preds = %for.body, %entry 447 ret void 448 } 449 450