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