575 lines · plain
1; RUN: opt < %s -passes=loop-simplify,lcssa -verify-loop-info -verify-dom-info -S | FileCheck %s2 3; LCSSA should work correctly in the case of an indirectbr that exits4; the loop, and the loop has exits with predecessors not within the loop5; (and btw these edges are unsplittable due to the indirectbr).6; PR54377define i32 @test0(i1 %arg) nounwind {8; CHECK-LABEL: @test09entry:10 br i1 %arg, label %"4", label %"3"11 12"3": ; preds = %entry13 ret i32 014 15"4": ; preds = %entry16 br i1 %arg, label %"6", label %"5"17 18"5": ; preds = %"4"19 unreachable20 21"6": ; preds = %"4"22 br i1 %arg, label %"10", label %"13"23 24"10": ; preds = %"6"25 br i1 %arg, label %"22", label %"15"26 27"13": ; preds = %"6"28 unreachable29 30"15": ; preds = %"23", %"10"31 unreachable32 33"22": ; preds = %"10"34 br label %"23"35 36"23": ; preds = %"1375", %"22"37 %0 = phi i32 [ undef, %"22" ], [ %1, %"1375" ] ; <i32> [#uses=1]38 indirectbr ptr undef, [label %"15", label %"24", label %"25", label %"26", label %"27", label %"28", label %"29", label %"30", label %"32", label %"32", label %"33", label %"167", label %"173", label %"173", label %"173", label %"173", label %"173", label %"192", label %"193", label %"194", label %"196", label %"206", label %"231", label %"241", label %"251", label %"261", label %"307", label %"353", label %"354", label %"355", label %"361", label %"367", label %"400", label %"433", label %"466", label %"499", label %"509", label %"519", label %"529", label %"571", label %"589", label %"607", label %"635", label %"655", label %"664", label %"671", label %"680", label %"687", label %"692", label %"698", label %"704", label %"715", label %"715", label %"716", label %"725", label %"725", label %"725", label %"725", label %"724", label %"724", label %"724", label %"724", label %"737", label %"737", label %"737", label %"737", label %"761", label %"758", label %"759", label %"760", label %"766", label %"763", label %"764", label %"765", label %"771", label %"768", label %"769", label %"770", label %"780", label %"777", label %"778", label %"779", label %"821", label %"826", label %"831", label %"832", label %"833", label %"836", label %"836", label %"886", label %"905", label %"978", label %"978", label %"1136", label %"1166", label %"1179", label %"1201", label %"1212", label %"1212", label %"1274", label %"1284", label %"1284", label %"1346", label %"1347", label %"1348", label %"1349", label %"1350", label %"1353", label %"1353", label %"1353", label %"1355", label %"1355", label %"1357", label %"1357", label %"1358", label %"1359", label %"1374", label %"1375", label %"1376", label %"1377", label %"1378", label %"1379", label %"1386", label %"1395", label %"1394", label %"1425", label %"1426", label %"1440", label %"1449", label %"1455", label %"1461", label %"1471", label %"1482", label %"1484", label %"1486", label %"1489", label %"1489", label %"1492", label %"1494", label %"1494", label %"1497", label %"1499", label %"1499", label %"1515", label %"1546", label %"1546", label %"1566", label %"1584", label %"1587", label %"1591", label %"1605", label %"1609", label %"1609", label %"1640", label %"1648", label %"1651", label %"1703", label %"1710", label %"1718", label %"1724", label %"1725", label %"1726", label %"1727", label %"1728", label %"1731", label %"1732", label %"1733", label %"1734", label %"1735", label %"1741", label %"1750", label %"1752", label %"1754", label %"1755", label %"1757", label %"1759", label %"1761", label %"1764", label %"1764", label %"1766", label %"1768", label %"1775", label %"1775", label %"1781", label %"1781", label %"1790", label %"1827", label %"1836", label %"1836", label %"1845", label %"1845", label %"1848", label %"1849", label %"1851", label %"1853", label %"1856", label %"1861", label %"1861"]39 40"24": ; preds = %"23"41 unreachable42 43"25": ; preds = %"23"44 unreachable45 46"26": ; preds = %"23"47 unreachable48 49"27": ; preds = %"23"50 unreachable51 52"28": ; preds = %"23"53 unreachable54 55"29": ; preds = %"23"56 unreachable57 58"30": ; preds = %"23"59 unreachable60 61"32": ; preds = %"23", %"23"62 unreachable63 64"33": ; preds = %"23"65 unreachable66 67"167": ; preds = %"23"68 unreachable69 70"173": ; preds = %"23", %"23", %"23", %"23", %"23"71 unreachable72 73"192": ; preds = %"23"74 unreachable75 76"193": ; preds = %"23"77 unreachable78 79"194": ; preds = %"23"80 unreachable81 82"196": ; preds = %"23"83 unreachable84 85"206": ; preds = %"23"86 unreachable87 88"231": ; preds = %"23"89 unreachable90 91"241": ; preds = %"23"92 unreachable93 94"251": ; preds = %"23"95 unreachable96 97"261": ; preds = %"23"98 unreachable99 100"307": ; preds = %"23"101 unreachable102 103"353": ; preds = %"23"104 unreachable105 106"354": ; preds = %"23"107 unreachable108 109"355": ; preds = %"23"110 unreachable111 112"361": ; preds = %"23"113 unreachable114 115"367": ; preds = %"23"116 unreachable117 118"400": ; preds = %"23"119 unreachable120 121"433": ; preds = %"23"122 unreachable123 124"466": ; preds = %"23"125 unreachable126 127"499": ; preds = %"23"128 unreachable129 130"509": ; preds = %"23"131 unreachable132 133"519": ; preds = %"23"134 unreachable135 136"529": ; preds = %"23"137 unreachable138 139"571": ; preds = %"23"140 unreachable141 142"589": ; preds = %"23"143 unreachable144 145"607": ; preds = %"23"146 unreachable147 148"635": ; preds = %"23"149 unreachable150 151"655": ; preds = %"23"152 unreachable153 154"664": ; preds = %"23"155 unreachable156 157"671": ; preds = %"23"158 unreachable159 160"680": ; preds = %"23"161 unreachable162 163"687": ; preds = %"23"164 unreachable165 166"692": ; preds = %"23"167 br label %"1862"168 169"698": ; preds = %"23"170 unreachable171 172"704": ; preds = %"23"173 unreachable174 175"715": ; preds = %"23", %"23"176 unreachable177 178"716": ; preds = %"23"179 unreachable180 181"724": ; preds = %"23", %"23", %"23", %"23"182 unreachable183 184"725": ; preds = %"23", %"23", %"23", %"23"185 unreachable186 187"737": ; preds = %"23", %"23", %"23", %"23"188 unreachable189 190"758": ; preds = %"23"191 unreachable192 193"759": ; preds = %"23"194 unreachable195 196"760": ; preds = %"23"197 unreachable198 199"761": ; preds = %"23"200 unreachable201 202"763": ; preds = %"23"203 unreachable204 205"764": ; preds = %"23"206 unreachable207 208"765": ; preds = %"23"209 br label %"766"210 211"766": ; preds = %"765", %"23"212 unreachable213 214"768": ; preds = %"23"215 unreachable216 217"769": ; preds = %"23"218 unreachable219 220"770": ; preds = %"23"221 unreachable222 223"771": ; preds = %"23"224 unreachable225 226"777": ; preds = %"23"227 unreachable228 229"778": ; preds = %"23"230 unreachable231 232"779": ; preds = %"23"233 unreachable234 235"780": ; preds = %"23"236 unreachable237 238"821": ; preds = %"23"239 unreachable240 241"826": ; preds = %"23"242 unreachable243 244"831": ; preds = %"23"245 unreachable246 247"832": ; preds = %"23"248 unreachable249 250"833": ; preds = %"23"251 unreachable252 253"836": ; preds = %"23", %"23"254 unreachable255 256"886": ; preds = %"23"257 unreachable258 259"905": ; preds = %"23"260 unreachable261 262"978": ; preds = %"23", %"23"263 unreachable264 265"1136": ; preds = %"23"266 unreachable267 268"1166": ; preds = %"23"269 unreachable270 271"1179": ; preds = %"23"272 unreachable273 274"1201": ; preds = %"23"275 unreachable276 277"1212": ; preds = %"23", %"23"278 unreachable279 280"1274": ; preds = %"23"281 unreachable282 283"1284": ; preds = %"23", %"23"284 unreachable285 286"1346": ; preds = %"23"287 unreachable288 289"1347": ; preds = %"23"290 unreachable291 292"1348": ; preds = %"23"293 unreachable294 295"1349": ; preds = %"23"296 unreachable297 298"1350": ; preds = %"23"299 unreachable300 301"1353": ; preds = %"23", %"23", %"23"302 unreachable303 304"1355": ; preds = %"23", %"23"305 unreachable306 307"1357": ; preds = %"23", %"23"308 unreachable309 310"1358": ; preds = %"23"311 unreachable312 313"1359": ; preds = %"23"314 unreachable315 316"1374": ; preds = %"23"317 unreachable318 319"1375": ; preds = %"23"320 %1 = zext i8 undef to i32 ; <i32> [#uses=1]321 br label %"23"322 323"1376": ; preds = %"23"324 unreachable325 326"1377": ; preds = %"23"327 unreachable328 329"1378": ; preds = %"23"330 unreachable331 332"1379": ; preds = %"23"333 unreachable334 335"1386": ; preds = %"23"336 unreachable337 338"1394": ; preds = %"23"339 unreachable340 341"1395": ; preds = %"23"342 unreachable343 344"1425": ; preds = %"23"345 unreachable346 347"1426": ; preds = %"23"348 unreachable349 350"1440": ; preds = %"23"351 unreachable352 353"1449": ; preds = %"23"354 unreachable355 356"1455": ; preds = %"23"357 unreachable358 359"1461": ; preds = %"23"360 unreachable361 362"1471": ; preds = %"23"363 unreachable364 365"1482": ; preds = %"23"366 unreachable367 368"1484": ; preds = %"23"369 unreachable370 371"1486": ; preds = %"23"372 unreachable373 374"1489": ; preds = %"23", %"23"375 unreachable376 377"1492": ; preds = %"23"378 unreachable379 380"1494": ; preds = %"23", %"23"381 unreachable382 383"1497": ; preds = %"23"384 unreachable385 386"1499": ; preds = %"23", %"23"387 unreachable388 389"1515": ; preds = %"23"390 unreachable391 392"1546": ; preds = %"23", %"23"393 unreachable394 395"1566": ; preds = %"23"396 br i1 %arg, label %"1569", label %"1568"397 398"1568": ; preds = %"1566"399 unreachable400 401"1569": ; preds = %"1566"402 unreachable403 404"1584": ; preds = %"23"405 unreachable406 407"1587": ; preds = %"23"408 unreachable409 410"1591": ; preds = %"23"411 unreachable412 413"1605": ; preds = %"23"414 unreachable415 416"1609": ; preds = %"23", %"23"417 unreachable418 419"1640": ; preds = %"23"420 unreachable421 422"1648": ; preds = %"23"423 unreachable424 425"1651": ; preds = %"23"426 unreachable427 428"1703": ; preds = %"23"429 unreachable430 431"1710": ; preds = %"23"432 unreachable433 434"1718": ; preds = %"23"435 unreachable436 437"1724": ; preds = %"23"438 unreachable439 440"1725": ; preds = %"23"441 unreachable442 443"1726": ; preds = %"23"444 unreachable445 446"1727": ; preds = %"23"447 unreachable448 449"1728": ; preds = %"23"450 unreachable451 452"1731": ; preds = %"23"453 unreachable454 455"1732": ; preds = %"23"456 unreachable457 458"1733": ; preds = %"23"459 unreachable460 461"1734": ; preds = %"23"462 unreachable463 464"1735": ; preds = %"23"465 unreachable466 467"1741": ; preds = %"23"468 unreachable469 470"1750": ; preds = %"23"471 unreachable472 473"1752": ; preds = %"23"474 unreachable475 476"1754": ; preds = %"23"477 unreachable478 479"1755": ; preds = %"23"480 unreachable481 482"1757": ; preds = %"23"483 unreachable484 485"1759": ; preds = %"23"486 unreachable487 488"1761": ; preds = %"23"489 unreachable490 491"1764": ; preds = %"23", %"23"492 %2 = icmp eq i32 %0, 168 ; <i1> [#uses=0]493 unreachable494 495"1766": ; preds = %"23"496 unreachable497 498"1768": ; preds = %"23"499 unreachable500 501"1775": ; preds = %"23", %"23"502 unreachable503 504"1781": ; preds = %"23", %"23"505 unreachable506 507"1790": ; preds = %"23"508 unreachable509 510"1827": ; preds = %"23"511 unreachable512 513"1836": ; preds = %"23", %"23"514 br label %"1862"515 516"1845": ; preds = %"23", %"23"517 unreachable518 519"1848": ; preds = %"23"520 unreachable521 522"1849": ; preds = %"23"523 unreachable524 525"1851": ; preds = %"23"526 unreachable527 528"1853": ; preds = %"23"529 unreachable530 531"1856": ; preds = %"23"532 unreachable533 534"1861": ; preds = %"23", %"23"535 unreachable536 537"41": ; preds = %"23", %"23"538 unreachable539 540"1862": ; preds = %"1836", %"692"541 unreachable542}543 544; An exit for Loop L1 may be the header of a disjoint Loop L2. Thus, when we545; create PHIs in one of such exits we are also inserting PHIs in L2 header. This546; could break LCSSA form for L2 because these inserted PHIs can also have uses547; in L2 exits. Test that we don't assert/crash on that.548define void @test1(i1 %arg) {549; CHECK-LABEL: @test1550 br label %lab1551 552lab1:553 %tmp21 = add i32 undef, 677038203554 br i1 %arg, label %lab2, label %exit555 556lab2:557 indirectbr ptr undef, [label %lab1, label %lab3]558 559lab3:560; CHECK: %tmp21.lcssa1 = phi i32 [ %tmp21.lcssa1, %lab4 ], [ %tmp21, %lab2 ]561 %tmp12 = phi i32 [ %tmp21, %lab2 ], [ %tmp12, %lab4 ]562 br i1 %arg, label %lab5, label %lab4563 564lab4:565 br label %lab3566 567lab5:568; CHECK: %tmp21.lcssa1.lcssa = phi i32 [ %tmp21.lcssa1, %lab3 ]569 %tmp15 = add i32 %tmp12, undef570 br label %exit571 572exit:573 ret void574}575