512 lines · plain
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-MID2 3; Test that the branch targets are correct after isel, even though the loop4; will sometimes be reverted anyway.5 6; CHECK-MID: name: check_loop_dec_brcond_combine7; CHECK-MID: bb.0.entry:8; CHECK-MID: renamable $lr = t2DoLoopStart killed renamable $r39; CHECK-MID: bb.1.for.header:10; CHECK-MID: renamable $lr = t2LoopEndDec killed renamable $lr, %bb.111; 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.preheader16 17for.body.preheader:18 %scevgep = getelementptr i32, ptr %a, i32 -119 %scevgep4 = getelementptr i32, ptr %c, i32 -120 %scevgep8 = getelementptr i32, ptr %b, i32 -121 br label %for.header22 23for.body:24 %scevgep11 = getelementptr i32, ptr %lsr.iv9, i32 125 %ld1 = load i32, ptr %scevgep11, align 426 %scevgep7 = getelementptr i32, ptr %lsr.iv5, i32 127 %ld2 = load i32, ptr %scevgep7, align 428 %mul = mul nsw i32 %ld2, %ld129 %scevgep3 = getelementptr i32, ptr %lsr.iv1, i32 130 store i32 %mul, ptr %scevgep3, align 431 %scevgep2 = getelementptr i32, ptr %lsr.iv1, i32 132 %scevgep6 = getelementptr i32, ptr %lsr.iv5, i32 133 %scevgep10 = getelementptr i32, ptr %lsr.iv9, i32 134 %count.next = call i32 @llvm.loop.decrement.reg.i32(i32 %count, i32 1)35 %cmp = icmp ne i32 %count.next, 036 br i1 %cmp, label %for.header, label %for.cond.cleanup37 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.body44 45for.cond.cleanup:46 ret void47}48 49; CHECK-MID: name: check_loop_dec_ugt_brcond_combine50; CHECK-MID: bb.0.entry:51; CHECK-MID: renamable $lr = t2DoLoopStart killed renamable $r352; CHECK-MID: bb.1.for.header:53; CHECK-MID: renamable $lr = t2LoopEndDec killed renamable $lr, %bb.154; CHECK-MID: tB %bb.2, 1455; 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.preheader60 61for.body.preheader:62 %scevgep = getelementptr i32, ptr %a, i32 -163 %scevgep4 = getelementptr i32, ptr %c, i32 -164 %scevgep8 = getelementptr i32, ptr %b, i32 -165 br label %for.header66 67for.body:68 %scevgep11 = getelementptr i32, ptr %lsr.iv9, i32 169 %ld1 = load i32, ptr %scevgep11, align 470 %scevgep7 = getelementptr i32, ptr %lsr.iv5, i32 171 %ld2 = load i32, ptr %scevgep7, align 472 %mul = mul nsw i32 %ld2, %ld173 %scevgep3 = getelementptr i32, ptr %lsr.iv1, i32 174 store i32 %mul, ptr %scevgep3, align 475 %scevgep2 = getelementptr i32, ptr %lsr.iv1, i32 176 %scevgep6 = getelementptr i32, ptr %lsr.iv5, i32 177 %scevgep10 = getelementptr i32, ptr %lsr.iv9, i32 178 %count.next = call i32 @llvm.loop.decrement.reg.i32(i32 %count, i32 1)79 %cmp = icmp ugt i32 %count.next, 080 br i1 %cmp, label %for.header, label %for.cond.cleanup81 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.body88 89for.cond.cleanup:90 ret void91}92 93; CHECK-MID: name: check_loop_dec_ult_brcond_combine94; CHECK-MID: bb.0.entry:95; CHECK-MID: renamable $lr = t2DoLoopStart killed renamable $r396; CHECK-MID: bb.1.for.header:97; CHECK-MID: renamable $lr = t2LoopEndDec killed renamable $lr, %bb.198; CHECK-MID: tB %bb.2, 1499; 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.preheader104 105for.body.preheader:106 %scevgep = getelementptr i32, ptr %a, i32 -1107 %scevgep4 = getelementptr i32, ptr %c, i32 -1108 %scevgep8 = getelementptr i32, ptr %b, i32 -1109 br label %for.header110 111for.body:112 %scevgep11 = getelementptr i32, ptr %lsr.iv9, i32 1113 %ld1 = load i32, ptr %scevgep11, align 4114 %scevgep7 = getelementptr i32, ptr %lsr.iv5, i32 1115 %ld2 = load i32, ptr %scevgep7, align 4116 %mul = mul nsw i32 %ld2, %ld1117 %scevgep3 = getelementptr i32, ptr %lsr.iv1, i32 1118 store i32 %mul, ptr %scevgep3, align 4119 %scevgep2 = getelementptr i32, ptr %lsr.iv1, i32 1120 %scevgep6 = getelementptr i32, ptr %lsr.iv5, i32 1121 %scevgep10 = getelementptr i32, ptr %lsr.iv9, i32 1122 %count.next = call i32 @llvm.loop.decrement.reg.i32(i32 %count, i32 1)123 %cmp = icmp ult i32 %count.next, 1124 br i1 %cmp, label %for.cond.cleanup, label %for.header125 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.body132 133for.cond.cleanup:134 ret void135}136 137; CHECK-MID: name: check_loop_dec_ult_xor_brcond_combine138; CHECK-MID: bb.0.entry:139; CHECK-MID: renamable $lr = t2DoLoopStart killed renamable $r3140; CHECK-MID: bb.1.for.header:141; CHECK-MID: renamable $lr = t2LoopEndDec killed renamable $lr, %bb.1142; CHECK-MID: tB %bb.2, 14143; 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.preheader148 149for.body.preheader:150 %scevgep = getelementptr i32, ptr %a, i32 -1151 %scevgep4 = getelementptr i32, ptr %c, i32 -1152 %scevgep8 = getelementptr i32, ptr %b, i32 -1153 br label %for.header154 155for.body:156 %scevgep11 = getelementptr i32, ptr %lsr.iv9, i32 1157 %ld1 = load i32, ptr %scevgep11, align 4158 %scevgep7 = getelementptr i32, ptr %lsr.iv5, i32 1159 %ld2 = load i32, ptr %scevgep7, align 4160 %mul = mul nsw i32 %ld2, %ld1161 %scevgep3 = getelementptr i32, ptr %lsr.iv1, i32 1162 store i32 %mul, ptr %scevgep3, align 4163 %scevgep2 = getelementptr i32, ptr %lsr.iv1, i32 1164 %scevgep6 = getelementptr i32, ptr %lsr.iv5, i32 1165 %scevgep10 = getelementptr i32, ptr %lsr.iv9, i32 1166 %count.next = call i32 @llvm.loop.decrement.reg.i32(i32 %count, i32 1)167 %cmp = icmp ult i32 %count.next, 1168 %negate = xor i1 %cmp, 1169 br i1 %negate, label %for.header, label %for.cond.cleanup170 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.body177 178for.cond.cleanup:179 ret void180}181 182; CHECK-MID: name: check_loop_dec_sgt_brcond_combine183; CHECK-MID: bb.0.entry:184; CHECK-MID: renamable $lr = t2DoLoopStart killed renamable $r3185; CHECK-MID: bb.1.for.header:186; CHECK-MID: renamable $lr = t2LoopEndDec killed renamable $lr, %bb.1187; CHECK-MID: tB %bb.2, 14188; 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.preheader193 194for.body.preheader:195 %scevgep = getelementptr i32, ptr %a, i32 -1196 %scevgep4 = getelementptr i32, ptr %c, i32 -1197 %scevgep8 = getelementptr i32, ptr %b, i32 -1198 br label %for.header199 200for.body:201 %scevgep11 = getelementptr i32, ptr %lsr.iv9, i32 1202 %ld1 = load i32, ptr %scevgep11, align 4203 %scevgep7 = getelementptr i32, ptr %lsr.iv5, i32 1204 %ld2 = load i32, ptr %scevgep7, align 4205 %mul = mul nsw i32 %ld2, %ld1206 %scevgep3 = getelementptr i32, ptr %lsr.iv1, i32 1207 store i32 %mul, ptr %scevgep3, align 4208 %scevgep2 = getelementptr i32, ptr %lsr.iv1, i32 1209 %scevgep6 = getelementptr i32, ptr %lsr.iv5, i32 1210 %scevgep10 = getelementptr i32, ptr %lsr.iv9, i32 1211 %count.next = call i32 @llvm.loop.decrement.reg.i32(i32 %count, i32 1)212 %cmp = icmp sgt i32 %count.next, 0213 br i1 %cmp, label %for.header, label %for.cond.cleanup214 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.body221 222for.cond.cleanup:223 ret void224}225 226; CHECK-MID: name: check_loop_dec_sge_brcond_combine227; CHECK-MID: bb.0.entry:228; CHECK-MID: renamable $lr = t2DoLoopStart killed renamable $r3229; CHECK-MID: bb.1.for.header:230; CHECK-MID: renamable $lr = t2LoopEndDec killed renamable $lr, %bb.1231; CHECK-MID: tB %bb.2, 14232; 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.preheader237 238for.body.preheader:239 %scevgep = getelementptr i32, ptr %a, i32 -1240 %scevgep4 = getelementptr i32, ptr %c, i32 -1241 %scevgep8 = getelementptr i32, ptr %b, i32 -1242 br label %for.header243 244for.body:245 %scevgep11 = getelementptr i32, ptr %lsr.iv9, i32 1246 %ld1 = load i32, ptr %scevgep11, align 4247 %scevgep7 = getelementptr i32, ptr %lsr.iv5, i32 1248 %ld2 = load i32, ptr %scevgep7, align 4249 %mul = mul nsw i32 %ld2, %ld1250 %scevgep3 = getelementptr i32, ptr %lsr.iv1, i32 1251 store i32 %mul, ptr %scevgep3, align 4252 %scevgep2 = getelementptr i32, ptr %lsr.iv1, i32 1253 %scevgep6 = getelementptr i32, ptr %lsr.iv5, i32 1254 %scevgep10 = getelementptr i32, ptr %lsr.iv9, i32 1255 %count.next = call i32 @llvm.loop.decrement.reg.i32(i32 %count, i32 1)256 %cmp = icmp sge i32 %count.next, 1257 br i1 %cmp, label %for.header, label %for.cond.cleanup258 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.body265 266for.cond.cleanup:267 ret void268}269 270; CHECK-MID: name: check_loop_dec_sge_xor_brcond_combine271; CHECK-MID: bb.0.entry:272; CHECK-MID: renamable $lr = t2DoLoopStart killed renamable $r3273; CHECK-MID: bb.1.for.header:274; CHECK-MID: renamable $lr = t2LoopEndDec killed renamable $lr, %bb.1275; CHECK-MID: tB %bb.2, 14276; 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.preheader281 282for.body.preheader:283 %scevgep = getelementptr i32, ptr %a, i32 -1284 %scevgep4 = getelementptr i32, ptr %c, i32 -1285 %scevgep8 = getelementptr i32, ptr %b, i32 -1286 br label %for.header287 288for.body:289 %scevgep11 = getelementptr i32, ptr %lsr.iv9, i32 1290 %ld1 = load i32, ptr %scevgep11, align 4291 %scevgep7 = getelementptr i32, ptr %lsr.iv5, i32 1292 %ld2 = load i32, ptr %scevgep7, align 4293 %mul = mul nsw i32 %ld2, %ld1294 %scevgep3 = getelementptr i32, ptr %lsr.iv1, i32 1295 store i32 %mul, ptr %scevgep3, align 4296 %scevgep2 = getelementptr i32, ptr %lsr.iv1, i32 1297 %scevgep6 = getelementptr i32, ptr %lsr.iv5, i32 1298 %scevgep10 = getelementptr i32, ptr %lsr.iv9, i32 1299 %count.next = call i32 @llvm.loop.decrement.reg.i32(i32 %count, i32 1)300 %cmp = icmp sge i32 %count.next, 1301 %negated = xor i1 %cmp, 1302 br i1 %negated, label %for.cond.cleanup, label %for.header303 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.body310 311for.cond.cleanup:312 ret void313}314 315; CHECK-MID: name: check_loop_dec_uge_brcond_combine316; CHECK-MID: bb.0.entry:317; CHECK-MID: renamable $lr = t2DoLoopStart killed renamable $r3318; CHECK-MID: bb.1.for.header:319; CHECK-MID: renamable $lr = t2LoopEndDec killed renamable $lr, %bb.1320; CHECK-MID: tB %bb.2, 14321; 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.preheader326 327for.body.preheader:328 %scevgep = getelementptr i32, ptr %a, i32 -1329 %scevgep4 = getelementptr i32, ptr %c, i32 -1330 %scevgep8 = getelementptr i32, ptr %b, i32 -1331 br label %for.header332 333for.body:334 %scevgep11 = getelementptr i32, ptr %lsr.iv9, i32 1335 %ld1 = load i32, ptr %scevgep11, align 4336 %scevgep7 = getelementptr i32, ptr %lsr.iv5, i32 1337 %ld2 = load i32, ptr %scevgep7, align 4338 %mul = mul nsw i32 %ld2, %ld1339 %scevgep3 = getelementptr i32, ptr %lsr.iv1, i32 1340 store i32 %mul, ptr %scevgep3, align 4341 %scevgep2 = getelementptr i32, ptr %lsr.iv1, i32 1342 %scevgep6 = getelementptr i32, ptr %lsr.iv5, i32 1343 %scevgep10 = getelementptr i32, ptr %lsr.iv9, i32 1344 %count.next = call i32 @llvm.loop.decrement.reg.i32(i32 %count, i32 1)345 %cmp = icmp uge i32 %count.next, 1346 br i1 %cmp, label %for.header, label %for.cond.cleanup347 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.body354 355for.cond.cleanup:356 ret void357}358 359; CHECK-MID: name: check_loop_dec_uge_xor_brcond_combine360; CHECK-MID: bb.0.entry:361; CHECK-MID: renamable $lr = t2DoLoopStart killed renamable $r3362; CHECK-MID: bb.1.for.header:363; CHECK-MID: renamable $lr = t2LoopEndDec killed renamable $lr, %bb.1364; CHECK-MID: tB %bb.2, 14365; 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.preheader370 371for.body.preheader:372 %scevgep = getelementptr i32, ptr %a, i32 -1373 %scevgep4 = getelementptr i32, ptr %c, i32 -1374 %scevgep8 = getelementptr i32, ptr %b, i32 -1375 br label %for.header376 377for.body:378 %scevgep11 = getelementptr i32, ptr %lsr.iv9, i32 1379 %ld1 = load i32, ptr %scevgep11, align 4380 %scevgep7 = getelementptr i32, ptr %lsr.iv5, i32 1381 %ld2 = load i32, ptr %scevgep7, align 4382 %mul = mul nsw i32 %ld2, %ld1383 %scevgep3 = getelementptr i32, ptr %lsr.iv1, i32 1384 store i32 %mul, ptr %scevgep3, align 4385 %scevgep2 = getelementptr i32, ptr %lsr.iv1, i32 1386 %scevgep6 = getelementptr i32, ptr %lsr.iv5, i32 1387 %scevgep10 = getelementptr i32, ptr %lsr.iv9, i32 1388 %count.next = call i32 @llvm.loop.decrement.reg.i32(i32 %count, i32 1)389 %cmp = icmp uge i32 %count.next, 1390 %negated = xor i1 %cmp, 1391 br i1 %negated, label %for.cond.cleanup, label %for.header392 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.body399 400for.cond.cleanup:401 ret void402}403 404; CHECK-MID: check_negated_xor_wls405; CHECK-MID: $lr = t2WhileLoopStartLR killed renamable $r2406; CHECK-MID: tB %bb.1407; CHECK-MID: bb.1.while.body:408; CHECK-MID: renamable $lr = t2LoopEndDec killed renamable $lr, %bb.1409; CHECK-MID: tB %bb.2410; 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, 0415 %wls1 = extractvalue {i32, i1} %wls, 1416 %xor = xor i1 %wls1, 1417 br i1 %xor, label %while.end, label %while.body.preheader418 419while.body.preheader:420 br label %while.body421 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 1427 %ld.b = load i16, ptr %b.addr.05, align 2428 %incdec.ptr1 = getelementptr inbounds i16, ptr %a.addr.06, i32 1429 store i16 %ld.b, ptr %a.addr.06, align 2430 %count.next = call i32 @llvm.loop.decrement.reg.i32(i32 %count, i32 1)431 %cmp = icmp ne i32 %count.next, 0432 br i1 %cmp, label %while.body, label %while.end433 434while.end:435 ret void436}437 438; CHECK-MID: check_negated_cmp_wls439; CHECK-MID: $lr = t2WhileLoopStartLR killed renamable $r2440; CHECK-MID: tB %bb.1441; CHECK-MID: bb.1.while.body:442; CHECK-MID: renamable $lr = t2LoopEndDec killed renamable $lr, %bb.1443; CHECK-MID: tB %bb.2444; 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, 0449 %wls1 = extractvalue {i32, i1} %wls, 1450 %cmp = icmp ne i1 %wls1, 1451 br i1 %cmp, label %while.end, label %while.body.preheader452 453while.body.preheader:454 br label %while.body455 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 1461 %ld.b = load i16, ptr %b.addr.05, align 2462 %incdec.ptr1 = getelementptr inbounds i16, ptr %a.addr.06, i32 1463 store i16 %ld.b, ptr %a.addr.06, align 2464 %count.next = call i32 @llvm.loop.decrement.reg.i32(i32 %count, i32 1)465 %cmp.1 = icmp ne i32 %count.next, 0466 br i1 %cmp.1, label %while.body, label %while.end467 468while.end:469 ret void470}471 472; CHECK-MID: check_negated_reordered_wls473; CHECK-MID: $lr = t2WhileLoopStartLR killed renamable $r2474; CHECK-MID: tB %bb.1475; CHECK-MID: bb.1.while.body:476; CHECK-MID: renamable $lr = t2LoopEndDec killed renamable $lr, %bb.1477; CHECK-MID: tB %bb.2478; 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 %while482 483while.body.preheader:484 br label %while.body485 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 1491 %ld.b = load i16, ptr %b.addr.05, align 2492 %incdec.ptr1 = getelementptr inbounds i16, ptr %a.addr.06, i32 1493 store i16 %ld.b, ptr %a.addr.06, align 2494 %count.next = call i32 @llvm.loop.decrement.reg.i32(i32 %count, i32 1)495 %cmp = icmp ne i32 %count.next, 0496 br i1 %cmp, label %while.body, label %while.end497 498while:499 %wls = call {i32, i1} @llvm.test.start.loop.iterations.i32(i32 %N)500 %wls0 = extractvalue {i32, i1} %wls, 0501 %wls1 = extractvalue {i32, i1} %wls, 1502 %xor = xor i1 %wls1, 1503 br i1 %xor, label %while.end, label %while.body.preheader504 505while.end:506 ret void507}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