1; RUN: llc -mtriple=thumbv8.1m.main -mattr=+lob -disable-arm-loloops=false -start-after=hardware-loops -stop-before=arm-low-overhead-loops %s -o - | FileCheck %s --check-prefix=CHECK-MID 2 3; Test that the branch targets are correct after isel, even though the loop 4; will sometimes be reverted anyway. 5 6; CHECK-MID: name: check_loop_dec_brcond_combine 7; CHECK-MID: bb.0.entry: 8; CHECK-MID: renamable $lr = t2DoLoopStart killed renamable $r3 9; CHECK-MID: bb.1.for.header: 10; CHECK-MID: renamable $lr = t2LoopEndDec killed renamable $lr, %bb.1 11; CHECK-MID: bb.2.for.cond.cleanup: 12define void @check_loop_dec_brcond_combine(ptr nocapture %a, ptr nocapture readonly %b, ptr nocapture readonly %c, i32 %N) { 13entry: 14 %start = call i32 @llvm.start.loop.iterations.i32(i32 %N) 15 br label %for.body.preheader 16 17for.body.preheader: 18 %scevgep = getelementptr i32, ptr %a, i32 -1 19 %scevgep4 = getelementptr i32, ptr %c, i32 -1 20 %scevgep8 = getelementptr i32, ptr %b, i32 -1 21 br label %for.header 22 23for.body: 24 %scevgep11 = getelementptr i32, ptr %lsr.iv9, i32 1 25 %ld1 = load i32, ptr %scevgep11, align 4 26 %scevgep7 = getelementptr i32, ptr %lsr.iv5, i32 1 27 %ld2 = load i32, ptr %scevgep7, align 4 28 %mul = mul nsw i32 %ld2, %ld1 29 %scevgep3 = getelementptr i32, ptr %lsr.iv1, i32 1 30 store i32 %mul, ptr %scevgep3, align 4 31 %scevgep2 = getelementptr i32, ptr %lsr.iv1, i32 1 32 %scevgep6 = getelementptr i32, ptr %lsr.iv5, i32 1 33 %scevgep10 = getelementptr i32, ptr %lsr.iv9, i32 1 34 %count.next = call i32 @llvm.loop.decrement.reg.i32(i32 %count, i32 1) 35 %cmp = icmp ne i32 %count.next, 0 36 br i1 %cmp, label %for.header, label %for.cond.cleanup 37 38for.header: 39 %lsr.iv9 = phi ptr [ %scevgep8, %for.body.preheader ], [ %scevgep10, %for.body ] 40 %lsr.iv5 = phi ptr [ %scevgep4, %for.body.preheader ], [ %scevgep6, %for.body ] 41 %lsr.iv1 = phi ptr [ %scevgep, %for.body.preheader ], [ %scevgep2, %for.body ] 42 %count = phi i32 [ %start, %for.body.preheader ], [ %count.next, %for.body ] 43 br label %for.body 44 45for.cond.cleanup: 46 ret void 47} 48 49; CHECK-MID: name: check_loop_dec_ugt_brcond_combine 50; CHECK-MID: bb.0.entry: 51; CHECK-MID: renamable $lr = t2DoLoopStart killed renamable $r3 52; CHECK-MID: bb.1.for.header: 53; CHECK-MID: renamable $lr = t2LoopEndDec killed renamable $lr, %bb.1 54; CHECK-MID: tB %bb.2, 14 55; CHECK-MID: bb.2.for.cond.cleanup: 56define void @check_loop_dec_ugt_brcond_combine(ptr nocapture %a, ptr nocapture readonly %b, ptr nocapture readonly %c, i32 %N) { 57entry: 58 %start = call i32 @llvm.start.loop.iterations.i32(i32 %N) 59 br label %for.body.preheader 60 61for.body.preheader: 62 %scevgep = getelementptr i32, ptr %a, i32 -1 63 %scevgep4 = getelementptr i32, ptr %c, i32 -1 64 %scevgep8 = getelementptr i32, ptr %b, i32 -1 65 br label %for.header 66 67for.body: 68 %scevgep11 = getelementptr i32, ptr %lsr.iv9, i32 1 69 %ld1 = load i32, ptr %scevgep11, align 4 70 %scevgep7 = getelementptr i32, ptr %lsr.iv5, i32 1 71 %ld2 = load i32, ptr %scevgep7, align 4 72 %mul = mul nsw i32 %ld2, %ld1 73 %scevgep3 = getelementptr i32, ptr %lsr.iv1, i32 1 74 store i32 %mul, ptr %scevgep3, align 4 75 %scevgep2 = getelementptr i32, ptr %lsr.iv1, i32 1 76 %scevgep6 = getelementptr i32, ptr %lsr.iv5, i32 1 77 %scevgep10 = getelementptr i32, ptr %lsr.iv9, i32 1 78 %count.next = call i32 @llvm.loop.decrement.reg.i32(i32 %count, i32 1) 79 %cmp = icmp ugt i32 %count.next, 0 80 br i1 %cmp, label %for.header, label %for.cond.cleanup 81 82for.header: 83 %lsr.iv9 = phi ptr [ %scevgep8, %for.body.preheader ], [ %scevgep10, %for.body ] 84 %lsr.iv5 = phi ptr [ %scevgep4, %for.body.preheader ], [ %scevgep6, %for.body ] 85 %lsr.iv1 = phi ptr [ %scevgep, %for.body.preheader ], [ %scevgep2, %for.body ] 86 %count = phi i32 [ %start, %for.body.preheader ], [ %count.next, %for.body ] 87 br label %for.body 88 89for.cond.cleanup: 90 ret void 91} 92 93; CHECK-MID: name: check_loop_dec_ult_brcond_combine 94; CHECK-MID: bb.0.entry: 95; CHECK-MID: renamable $lr = t2DoLoopStart killed renamable $r3 96; CHECK-MID: bb.1.for.header: 97; CHECK-MID: renamable $lr = t2LoopEndDec killed renamable $lr, %bb.1 98; CHECK-MID: tB %bb.2, 14 99; CHECK-MID: bb.2.for.cond.cleanup: 100define void @check_loop_dec_ult_brcond_combine(ptr nocapture %a, ptr nocapture readonly %b, ptr nocapture readonly %c, i32 %N) { 101entry: 102 %start = call i32 @llvm.start.loop.iterations.i32(i32 %N) 103 br label %for.body.preheader 104 105for.body.preheader: 106 %scevgep = getelementptr i32, ptr %a, i32 -1 107 %scevgep4 = getelementptr i32, ptr %c, i32 -1 108 %scevgep8 = getelementptr i32, ptr %b, i32 -1 109 br label %for.header 110 111for.body: 112 %scevgep11 = getelementptr i32, ptr %lsr.iv9, i32 1 113 %ld1 = load i32, ptr %scevgep11, align 4 114 %scevgep7 = getelementptr i32, ptr %lsr.iv5, i32 1 115 %ld2 = load i32, ptr %scevgep7, align 4 116 %mul = mul nsw i32 %ld2, %ld1 117 %scevgep3 = getelementptr i32, ptr %lsr.iv1, i32 1 118 store i32 %mul, ptr %scevgep3, align 4 119 %scevgep2 = getelementptr i32, ptr %lsr.iv1, i32 1 120 %scevgep6 = getelementptr i32, ptr %lsr.iv5, i32 1 121 %scevgep10 = getelementptr i32, ptr %lsr.iv9, i32 1 122 %count.next = call i32 @llvm.loop.decrement.reg.i32(i32 %count, i32 1) 123 %cmp = icmp ult i32 %count.next, 1 124 br i1 %cmp, label %for.cond.cleanup, label %for.header 125 126for.header: 127 %lsr.iv9 = phi ptr [ %scevgep8, %for.body.preheader ], [ %scevgep10, %for.body ] 128 %lsr.iv5 = phi ptr [ %scevgep4, %for.body.preheader ], [ %scevgep6, %for.body ] 129 %lsr.iv1 = phi ptr [ %scevgep, %for.body.preheader ], [ %scevgep2, %for.body ] 130 %count = phi i32 [ %start, %for.body.preheader ], [ %count.next, %for.body ] 131 br label %for.body 132 133for.cond.cleanup: 134 ret void 135} 136 137; CHECK-MID: name: check_loop_dec_ult_xor_brcond_combine 138; CHECK-MID: bb.0.entry: 139; CHECK-MID: renamable $lr = t2DoLoopStart killed renamable $r3 140; CHECK-MID: bb.1.for.header: 141; CHECK-MID: renamable $lr = t2LoopEndDec killed renamable $lr, %bb.1 142; CHECK-MID: tB %bb.2, 14 143; CHECK-MID: bb.2.for.cond.cleanup: 144define void @check_loop_dec_ult_xor_brcond_combine(ptr nocapture %a, ptr nocapture readonly %b, ptr nocapture readonly %c, i32 %N) { 145entry: 146 %start = call i32 @llvm.start.loop.iterations.i32(i32 %N) 147 br label %for.body.preheader 148 149for.body.preheader: 150 %scevgep = getelementptr i32, ptr %a, i32 -1 151 %scevgep4 = getelementptr i32, ptr %c, i32 -1 152 %scevgep8 = getelementptr i32, ptr %b, i32 -1 153 br label %for.header 154 155for.body: 156 %scevgep11 = getelementptr i32, ptr %lsr.iv9, i32 1 157 %ld1 = load i32, ptr %scevgep11, align 4 158 %scevgep7 = getelementptr i32, ptr %lsr.iv5, i32 1 159 %ld2 = load i32, ptr %scevgep7, align 4 160 %mul = mul nsw i32 %ld2, %ld1 161 %scevgep3 = getelementptr i32, ptr %lsr.iv1, i32 1 162 store i32 %mul, ptr %scevgep3, align 4 163 %scevgep2 = getelementptr i32, ptr %lsr.iv1, i32 1 164 %scevgep6 = getelementptr i32, ptr %lsr.iv5, i32 1 165 %scevgep10 = getelementptr i32, ptr %lsr.iv9, i32 1 166 %count.next = call i32 @llvm.loop.decrement.reg.i32(i32 %count, i32 1) 167 %cmp = icmp ult i32 %count.next, 1 168 %negate = xor i1 %cmp, 1 169 br i1 %negate, label %for.header, label %for.cond.cleanup 170 171for.header: 172 %lsr.iv9 = phi ptr [ %scevgep8, %for.body.preheader ], [ %scevgep10, %for.body ] 173 %lsr.iv5 = phi ptr [ %scevgep4, %for.body.preheader ], [ %scevgep6, %for.body ] 174 %lsr.iv1 = phi ptr [ %scevgep, %for.body.preheader ], [ %scevgep2, %for.body ] 175 %count = phi i32 [ %start, %for.body.preheader ], [ %count.next, %for.body ] 176 br label %for.body 177 178for.cond.cleanup: 179 ret void 180} 181 182; CHECK-MID: name: check_loop_dec_sgt_brcond_combine 183; CHECK-MID: bb.0.entry: 184; CHECK-MID: renamable $lr = t2DoLoopStart killed renamable $r3 185; CHECK-MID: bb.1.for.header: 186; CHECK-MID: renamable $lr = t2LoopEndDec killed renamable $lr, %bb.1 187; CHECK-MID: tB %bb.2, 14 188; CHECK-MID: bb.2.for.cond.cleanup: 189define void @check_loop_dec_sgt_brcond_combine(ptr nocapture %a, ptr nocapture readonly %b, ptr nocapture readonly %c, i32 %N) { 190entry: 191 %start = call i32 @llvm.start.loop.iterations.i32(i32 %N) 192 br label %for.body.preheader 193 194for.body.preheader: 195 %scevgep = getelementptr i32, ptr %a, i32 -1 196 %scevgep4 = getelementptr i32, ptr %c, i32 -1 197 %scevgep8 = getelementptr i32, ptr %b, i32 -1 198 br label %for.header 199 200for.body: 201 %scevgep11 = getelementptr i32, ptr %lsr.iv9, i32 1 202 %ld1 = load i32, ptr %scevgep11, align 4 203 %scevgep7 = getelementptr i32, ptr %lsr.iv5, i32 1 204 %ld2 = load i32, ptr %scevgep7, align 4 205 %mul = mul nsw i32 %ld2, %ld1 206 %scevgep3 = getelementptr i32, ptr %lsr.iv1, i32 1 207 store i32 %mul, ptr %scevgep3, align 4 208 %scevgep2 = getelementptr i32, ptr %lsr.iv1, i32 1 209 %scevgep6 = getelementptr i32, ptr %lsr.iv5, i32 1 210 %scevgep10 = getelementptr i32, ptr %lsr.iv9, i32 1 211 %count.next = call i32 @llvm.loop.decrement.reg.i32(i32 %count, i32 1) 212 %cmp = icmp sgt i32 %count.next, 0 213 br i1 %cmp, label %for.header, label %for.cond.cleanup 214 215for.header: 216 %lsr.iv9 = phi ptr [ %scevgep8, %for.body.preheader ], [ %scevgep10, %for.body ] 217 %lsr.iv5 = phi ptr [ %scevgep4, %for.body.preheader ], [ %scevgep6, %for.body ] 218 %lsr.iv1 = phi ptr [ %scevgep, %for.body.preheader ], [ %scevgep2, %for.body ] 219 %count = phi i32 [ %start, %for.body.preheader ], [ %count.next, %for.body ] 220 br label %for.body 221 222for.cond.cleanup: 223 ret void 224} 225 226; CHECK-MID: name: check_loop_dec_sge_brcond_combine 227; CHECK-MID: bb.0.entry: 228; CHECK-MID: renamable $lr = t2DoLoopStart killed renamable $r3 229; CHECK-MID: bb.1.for.header: 230; CHECK-MID: renamable $lr = t2LoopEndDec killed renamable $lr, %bb.1 231; CHECK-MID: tB %bb.2, 14 232; CHECK-MID: bb.2.for.cond.cleanup: 233define void @check_loop_dec_sge_brcond_combine(ptr nocapture %a, ptr nocapture readonly %b, ptr nocapture readonly %c, i32 %N) { 234entry: 235 %start = call i32 @llvm.start.loop.iterations.i32(i32 %N) 236 br label %for.body.preheader 237 238for.body.preheader: 239 %scevgep = getelementptr i32, ptr %a, i32 -1 240 %scevgep4 = getelementptr i32, ptr %c, i32 -1 241 %scevgep8 = getelementptr i32, ptr %b, i32 -1 242 br label %for.header 243 244for.body: 245 %scevgep11 = getelementptr i32, ptr %lsr.iv9, i32 1 246 %ld1 = load i32, ptr %scevgep11, align 4 247 %scevgep7 = getelementptr i32, ptr %lsr.iv5, i32 1 248 %ld2 = load i32, ptr %scevgep7, align 4 249 %mul = mul nsw i32 %ld2, %ld1 250 %scevgep3 = getelementptr i32, ptr %lsr.iv1, i32 1 251 store i32 %mul, ptr %scevgep3, align 4 252 %scevgep2 = getelementptr i32, ptr %lsr.iv1, i32 1 253 %scevgep6 = getelementptr i32, ptr %lsr.iv5, i32 1 254 %scevgep10 = getelementptr i32, ptr %lsr.iv9, i32 1 255 %count.next = call i32 @llvm.loop.decrement.reg.i32(i32 %count, i32 1) 256 %cmp = icmp sge i32 %count.next, 1 257 br i1 %cmp, label %for.header, label %for.cond.cleanup 258 259for.header: 260 %lsr.iv9 = phi ptr [ %scevgep8, %for.body.preheader ], [ %scevgep10, %for.body ] 261 %lsr.iv5 = phi ptr [ %scevgep4, %for.body.preheader ], [ %scevgep6, %for.body ] 262 %lsr.iv1 = phi ptr [ %scevgep, %for.body.preheader ], [ %scevgep2, %for.body ] 263 %count = phi i32 [ %start, %for.body.preheader ], [ %count.next, %for.body ] 264 br label %for.body 265 266for.cond.cleanup: 267 ret void 268} 269 270; CHECK-MID: name: check_loop_dec_sge_xor_brcond_combine 271; CHECK-MID: bb.0.entry: 272; CHECK-MID: renamable $lr = t2DoLoopStart killed renamable $r3 273; CHECK-MID: bb.1.for.header: 274; CHECK-MID: renamable $lr = t2LoopEndDec killed renamable $lr, %bb.1 275; CHECK-MID: tB %bb.2, 14 276; CHECK-MID: bb.2.for.cond.cleanup: 277define void @check_loop_dec_sge_xor_brcond_combine(ptr nocapture %a, ptr nocapture readonly %b, ptr nocapture readonly %c, i32 %N) { 278entry: 279 %start = call i32 @llvm.start.loop.iterations.i32(i32 %N) 280 br label %for.body.preheader 281 282for.body.preheader: 283 %scevgep = getelementptr i32, ptr %a, i32 -1 284 %scevgep4 = getelementptr i32, ptr %c, i32 -1 285 %scevgep8 = getelementptr i32, ptr %b, i32 -1 286 br label %for.header 287 288for.body: 289 %scevgep11 = getelementptr i32, ptr %lsr.iv9, i32 1 290 %ld1 = load i32, ptr %scevgep11, align 4 291 %scevgep7 = getelementptr i32, ptr %lsr.iv5, i32 1 292 %ld2 = load i32, ptr %scevgep7, align 4 293 %mul = mul nsw i32 %ld2, %ld1 294 %scevgep3 = getelementptr i32, ptr %lsr.iv1, i32 1 295 store i32 %mul, ptr %scevgep3, align 4 296 %scevgep2 = getelementptr i32, ptr %lsr.iv1, i32 1 297 %scevgep6 = getelementptr i32, ptr %lsr.iv5, i32 1 298 %scevgep10 = getelementptr i32, ptr %lsr.iv9, i32 1 299 %count.next = call i32 @llvm.loop.decrement.reg.i32(i32 %count, i32 1) 300 %cmp = icmp sge i32 %count.next, 1 301 %negated = xor i1 %cmp, 1 302 br i1 %negated, label %for.cond.cleanup, label %for.header 303 304for.header: 305 %lsr.iv9 = phi ptr [ %scevgep8, %for.body.preheader ], [ %scevgep10, %for.body ] 306 %lsr.iv5 = phi ptr [ %scevgep4, %for.body.preheader ], [ %scevgep6, %for.body ] 307 %lsr.iv1 = phi ptr [ %scevgep, %for.body.preheader ], [ %scevgep2, %for.body ] 308 %count = phi i32 [ %start, %for.body.preheader ], [ %count.next, %for.body ] 309 br label %for.body 310 311for.cond.cleanup: 312 ret void 313} 314 315; CHECK-MID: name: check_loop_dec_uge_brcond_combine 316; CHECK-MID: bb.0.entry: 317; CHECK-MID: renamable $lr = t2DoLoopStart killed renamable $r3 318; CHECK-MID: bb.1.for.header: 319; CHECK-MID: renamable $lr = t2LoopEndDec killed renamable $lr, %bb.1 320; CHECK-MID: tB %bb.2, 14 321; CHECK-MID: bb.2.for.cond.cleanup: 322define void @check_loop_dec_uge_brcond_combine(ptr nocapture %a, ptr nocapture readonly %b, ptr nocapture readonly %c, i32 %N) { 323entry: 324 %start = call i32 @llvm.start.loop.iterations.i32(i32 %N) 325 br label %for.body.preheader 326 327for.body.preheader: 328 %scevgep = getelementptr i32, ptr %a, i32 -1 329 %scevgep4 = getelementptr i32, ptr %c, i32 -1 330 %scevgep8 = getelementptr i32, ptr %b, i32 -1 331 br label %for.header 332 333for.body: 334 %scevgep11 = getelementptr i32, ptr %lsr.iv9, i32 1 335 %ld1 = load i32, ptr %scevgep11, align 4 336 %scevgep7 = getelementptr i32, ptr %lsr.iv5, i32 1 337 %ld2 = load i32, ptr %scevgep7, align 4 338 %mul = mul nsw i32 %ld2, %ld1 339 %scevgep3 = getelementptr i32, ptr %lsr.iv1, i32 1 340 store i32 %mul, ptr %scevgep3, align 4 341 %scevgep2 = getelementptr i32, ptr %lsr.iv1, i32 1 342 %scevgep6 = getelementptr i32, ptr %lsr.iv5, i32 1 343 %scevgep10 = getelementptr i32, ptr %lsr.iv9, i32 1 344 %count.next = call i32 @llvm.loop.decrement.reg.i32(i32 %count, i32 1) 345 %cmp = icmp uge i32 %count.next, 1 346 br i1 %cmp, label %for.header, label %for.cond.cleanup 347 348for.header: 349 %lsr.iv9 = phi ptr [ %scevgep8, %for.body.preheader ], [ %scevgep10, %for.body ] 350 %lsr.iv5 = phi ptr [ %scevgep4, %for.body.preheader ], [ %scevgep6, %for.body ] 351 %lsr.iv1 = phi ptr [ %scevgep, %for.body.preheader ], [ %scevgep2, %for.body ] 352 %count = phi i32 [ %start, %for.body.preheader ], [ %count.next, %for.body ] 353 br label %for.body 354 355for.cond.cleanup: 356 ret void 357} 358 359; CHECK-MID: name: check_loop_dec_uge_xor_brcond_combine 360; CHECK-MID: bb.0.entry: 361; CHECK-MID: renamable $lr = t2DoLoopStart killed renamable $r3 362; CHECK-MID: bb.1.for.header: 363; CHECK-MID: renamable $lr = t2LoopEndDec killed renamable $lr, %bb.1 364; CHECK-MID: tB %bb.2, 14 365; CHECK-MID: bb.2.for.cond.cleanup: 366define void @check_loop_dec_uge_xor_brcond_combine(ptr nocapture %a, ptr nocapture readonly %b, ptr nocapture readonly %c, i32 %N) { 367entry: 368 %start = call i32 @llvm.start.loop.iterations.i32(i32 %N) 369 br label %for.body.preheader 370 371for.body.preheader: 372 %scevgep = getelementptr i32, ptr %a, i32 -1 373 %scevgep4 = getelementptr i32, ptr %c, i32 -1 374 %scevgep8 = getelementptr i32, ptr %b, i32 -1 375 br label %for.header 376 377for.body: 378 %scevgep11 = getelementptr i32, ptr %lsr.iv9, i32 1 379 %ld1 = load i32, ptr %scevgep11, align 4 380 %scevgep7 = getelementptr i32, ptr %lsr.iv5, i32 1 381 %ld2 = load i32, ptr %scevgep7, align 4 382 %mul = mul nsw i32 %ld2, %ld1 383 %scevgep3 = getelementptr i32, ptr %lsr.iv1, i32 1 384 store i32 %mul, ptr %scevgep3, align 4 385 %scevgep2 = getelementptr i32, ptr %lsr.iv1, i32 1 386 %scevgep6 = getelementptr i32, ptr %lsr.iv5, i32 1 387 %scevgep10 = getelementptr i32, ptr %lsr.iv9, i32 1 388 %count.next = call i32 @llvm.loop.decrement.reg.i32(i32 %count, i32 1) 389 %cmp = icmp uge i32 %count.next, 1 390 %negated = xor i1 %cmp, 1 391 br i1 %negated, label %for.cond.cleanup, label %for.header 392 393for.header: 394 %lsr.iv9 = phi ptr [ %scevgep8, %for.body.preheader ], [ %scevgep10, %for.body ] 395 %lsr.iv5 = phi ptr [ %scevgep4, %for.body.preheader ], [ %scevgep6, %for.body ] 396 %lsr.iv1 = phi ptr [ %scevgep, %for.body.preheader ], [ %scevgep2, %for.body ] 397 %count = phi i32 [ %start, %for.body.preheader ], [ %count.next, %for.body ] 398 br label %for.body 399 400for.cond.cleanup: 401 ret void 402} 403 404; CHECK-MID: check_negated_xor_wls 405; CHECK-MID: $lr = t2WhileLoopStartLR killed renamable $r2 406; CHECK-MID: tB %bb.1 407; CHECK-MID: bb.1.while.body: 408; CHECK-MID: renamable $lr = t2LoopEndDec killed renamable $lr, %bb.1 409; CHECk-MID: tB %bb.2 410; CHECK-MID: bb.2.while.end: 411define void @check_negated_xor_wls(ptr nocapture %a, ptr nocapture readonly %b, i32 %N) { 412entry: 413 %wls = call {i32, i1} @llvm.test.start.loop.iterations.i32(i32 %N) 414 %wls0 = extractvalue {i32, i1} %wls, 0 415 %wls1 = extractvalue {i32, i1} %wls, 1 416 %xor = xor i1 %wls1, 1 417 br i1 %xor, label %while.end, label %while.body.preheader 418 419while.body.preheader: 420 br label %while.body 421 422while.body: 423 %a.addr.06 = phi ptr [ %incdec.ptr1, %while.body ], [ %a, %while.body.preheader ] 424 %b.addr.05 = phi ptr [ %incdec.ptr, %while.body ], [ %b, %while.body.preheader ] 425 %count = phi i32 [ %wls0, %while.body.preheader ], [ %count.next, %while.body ] 426 %incdec.ptr = getelementptr inbounds i16, ptr %b.addr.05, i32 1 427 %ld.b = load i16, ptr %b.addr.05, align 2 428 %incdec.ptr1 = getelementptr inbounds i16, ptr %a.addr.06, i32 1 429 store i16 %ld.b, ptr %a.addr.06, align 2 430 %count.next = call i32 @llvm.loop.decrement.reg.i32(i32 %count, i32 1) 431 %cmp = icmp ne i32 %count.next, 0 432 br i1 %cmp, label %while.body, label %while.end 433 434while.end: 435 ret void 436} 437 438; CHECK-MID: check_negated_cmp_wls 439; CHECK-MID: $lr = t2WhileLoopStartLR killed renamable $r2 440; CHECK-MID: tB %bb.1 441; CHECK-MID: bb.1.while.body: 442; CHECK-MID: renamable $lr = t2LoopEndDec killed renamable $lr, %bb.1 443; CHECk-MID: tB %bb.2 444; CHECK-MID: bb.2.while.end: 445define void @check_negated_cmp_wls(ptr nocapture %a, ptr nocapture readonly %b, i32 %N) { 446entry: 447 %wls = call {i32, i1} @llvm.test.start.loop.iterations.i32(i32 %N) 448 %wls0 = extractvalue {i32, i1} %wls, 0 449 %wls1 = extractvalue {i32, i1} %wls, 1 450 %cmp = icmp ne i1 %wls1, 1 451 br i1 %cmp, label %while.end, label %while.body.preheader 452 453while.body.preheader: 454 br label %while.body 455 456while.body: 457 %a.addr.06 = phi ptr [ %incdec.ptr1, %while.body ], [ %a, %while.body.preheader ] 458 %b.addr.05 = phi ptr [ %incdec.ptr, %while.body ], [ %b, %while.body.preheader ] 459 %count = phi i32 [ %wls0, %while.body.preheader ], [ %count.next, %while.body ] 460 %incdec.ptr = getelementptr inbounds i16, ptr %b.addr.05, i32 1 461 %ld.b = load i16, ptr %b.addr.05, align 2 462 %incdec.ptr1 = getelementptr inbounds i16, ptr %a.addr.06, i32 1 463 store i16 %ld.b, ptr %a.addr.06, align 2 464 %count.next = call i32 @llvm.loop.decrement.reg.i32(i32 %count, i32 1) 465 %cmp.1 = icmp ne i32 %count.next, 0 466 br i1 %cmp.1, label %while.body, label %while.end 467 468while.end: 469 ret void 470} 471 472; CHECK-MID: check_negated_reordered_wls 473; CHECK-MID: $lr = t2WhileLoopStartLR killed renamable $r2 474; CHECK-MID: tB %bb.1 475; CHECK-MID: bb.1.while.body: 476; CHECK-MID: renamable $lr = t2LoopEndDec killed renamable $lr, %bb.1 477; CHECk-MID: tB %bb.2 478; CHECK-MID: bb.2.while.end: 479define void @check_negated_reordered_wls(ptr nocapture %a, ptr nocapture readonly %b, i32 %N) { 480entry: 481 br label %while 482 483while.body.preheader: 484 br label %while.body 485 486while.body: 487 %a.addr.06 = phi ptr [ %incdec.ptr1, %while.body ], [ %a, %while.body.preheader ] 488 %b.addr.05 = phi ptr [ %incdec.ptr, %while.body ], [ %b, %while.body.preheader ] 489 %count = phi i32 [ %wls0, %while.body.preheader ], [ %count.next, %while.body ] 490 %incdec.ptr = getelementptr inbounds i16, ptr %b.addr.05, i32 1 491 %ld.b = load i16, ptr %b.addr.05, align 2 492 %incdec.ptr1 = getelementptr inbounds i16, ptr %a.addr.06, i32 1 493 store i16 %ld.b, ptr %a.addr.06, align 2 494 %count.next = call i32 @llvm.loop.decrement.reg.i32(i32 %count, i32 1) 495 %cmp = icmp ne i32 %count.next, 0 496 br i1 %cmp, label %while.body, label %while.end 497 498while: 499 %wls = call {i32, i1} @llvm.test.start.loop.iterations.i32(i32 %N) 500 %wls0 = extractvalue {i32, i1} %wls, 0 501 %wls1 = extractvalue {i32, i1} %wls, 1 502 %xor = xor i1 %wls1, 1 503 br i1 %xor, label %while.end, label %while.body.preheader 504 505while.end: 506 ret void 507} 508 509declare i32 @llvm.start.loop.iterations.i32(i32) 510declare {i32, i1} @llvm.test.start.loop.iterations.i32(i32) 511declare i32 @llvm.loop.decrement.reg.i32(i32, i32) 512