<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/57336>57336</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            "PHI nodes not grouped at top of basic block!" with opt -passes='indvars'
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          mikaelholmen
      </td>
    </tr>
</table>

<pre>
    llvm commit: eed6151ffb8
Reproduce with:
```
opt -passes='indvars' bbi-72884.ll -o /dev/null
```
with bbi-72884.ll being
```
define void @f() {
entry:
  br label %for.body

for.body:                                         ; preds = %for.body, %entry
  %inc8 = phi i16 [ %inc, %for.body ], [ undef, %entry ]
  %inc137 = phi i32 [ %inc1, %for.body ], [ undef, %entry ]
  %inc1 = add nsw i32 %inc137, 1
  %inc = add nsw i16 %inc8, 1
  %mul = mul nsw i16 undef, %inc8
  %cmp.not = icmp slt i16 undef, %mul
  br i1 %cmp.not, label %crit_edge, label %for.body, !llvm.loop !1

crit_edge:                                        ; preds = %for.body
  %inc137.lcssa = phi i32 [ %inc137, %for.body ]
  %conv = trunc i32 %inc137.lcssa to i16
  ret void
}

!llvm.ident = !{!0}

!0 = !{!"clang version 16.0.0.prerel"}
!1 = distinct !{!1, !2}
!2 = !{!"llvm.loop.mustprogress"}
```
Result:
```
PHI nodes not grouped at top of basic block!
  %inc137 = phi i32 [ %inc1, %for.body ], [ undef, %entry ]
label %for.body
LLVM ERROR: Broken module found, compilation aborted!
PLEASE submit a bug report to https://github.com/llvm/llvm-project/issues/ and include the crash backtrace.
Stack dump:
0.      Program arguments: ../../main-github/llvm/build-all/bin/opt -passes=indvars bbi-72884.ll -o /dev/null
 #0 0x0000000002d4a363 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (../../main-github/llvm/build-all/bin/opt+0x2d4a363)
 #1 0x0000000002d4807e llvm::sys::RunSignalHandlers() (../../main-github/llvm/build-all/bin/opt+0x2d4807e)
 #2 0x0000000002d4a6e6 SignalHandler(int) (../../main-github/llvm/build-all/bin/opt+0x2d4a6e6)
 #3 0x00007f9ae21e3630 __restore_rt (/lib64/libpthread.so.0+0xf630)
 #4 0x00007f9adf92a387 raise (/lib64/libc.so.6+0x36387)
 #5 0x00007f9adf92ba78 abort (/lib64/libc.so.6+0x37a78)
 #6 0x0000000002cb739b llvm::report_fatal_error(llvm::Twine const&, bool) (../../main-github/llvm/build-all/bin/opt+0x2cb739b)
 #7 0x0000000002cb71b8 (../../main-github/llvm/build-all/bin/opt+0x2cb71b8)
 #8 0x000000000256ec94 (../../main-github/llvm/build-all/bin/opt+0x256ec94)
 #9 0x000000000072224d llvm::detail::PassModel<llvm::Module, llvm::VerifierPass, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Module> >::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (../../main-github/llvm/build-all/bin/opt+0x72224d)
#10 0x000000000253a934 llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module> >::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) (../../main-github/llvm/build-all/bin/opt+0x253a934)
#11 0x000000000071a880 llvm::runPassPipeline(llvm::StringRef, llvm::Module&, llvm::TargetMachine*, llvm::TargetLibraryInfoImpl*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::ToolOutputFile*, llvm::StringRef, llvm::ArrayRef<llvm::StringRef>, llvm::ArrayRef<llvm::PassPlugin>, llvm::opt_tool::OutputKind, llvm::opt_tool::VerifierKind, bool, bool, bool, bool, bool, bool) (../../main-github/llvm/build-all/bin/opt+0x71a880)
#12 0x000000000072cbf1 main (../../main-github/llvm/build-all/bin/opt+0x72cbf1)
#13 0x00007f9adf916555 __libc_start_main (/lib64/libc.so.6+0x22555)
#14 0x0000000000712e80 _start (../../main-github/llvm/build-all/bin/opt+0x712e80)
Abort
```
This starts happening with commit 3bc09c7da50a
```
    [SCEVExpander] Allow udiv with isKnownNonZero(RHS) + add vscale case
    
    Motivation here is to unblock LSRs ability to use ICmpZero uses - the major effect of which is to enable count down IVs. The test changes reflect this goal, but the potential impact is much broader since this isn't a change in LSR at all.
    
    SCEVExpander needs(*) to prove that expanding the expression is safe anywhere the SCEV expression is valid. In general, we can't expand any node which might fault (or exhibit UB) unless we can either a) prove it won't fault, or b) guard the faulting case. We'd been allowing non-zero constants here; this change extends it to non-zero values.
    
    vscale is never zero. This is already implemented in ValueTracking, and this change just adds the same logic in SCEV's range computation (which in turn drives isKnownNonZero). We should common up some logic here, but let's do that in separate changes.
    
    (*) As an aside, "needs" is such an interesting word here. First, we don't actually need to guard this at all; we could choose to emit a select for the RHS of ever udiv and remove this code entirely. Secondly, the property being checked here is way too strong. What the client actually needs is to expand the SCEV at some particular point in some particular loop. In the examples, the original urem dominates that loop and yet we completely ignore that information when analyzing legality. I don't plan to actively pursue either direction, just noting it for future reference.
    
    Differential Revision: https://reviews.llvm.org/D129710
```

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzdWdty2zgS_Rr5BWUVL7o--EGO7Ypr4h2Xnc1W7YsLJFsSYohgAaAUzdfvaZC6UJZnsvHsyzopWSQap7tPX3BxZortldbrlcjNaqV8L50JomIUD-P5PJv0opteNHuiypqizklslF9CpHndG0Xt__BoKi8uK-kcuV5600vGqizW0jp8E1mmLsfJZDLoay0ujegldwWt8VnWWp9FY03daRmpcnFWtqC5KkmsjSpEbxDNe8mkl0xFb3zdjFPp7XZvthCZFVpmpGHGcG5sPwMJLXD43L8DGT_700uvRWWpcPh20wFOPvFjY0NrAJ5VmU-CaLVUQsUj0Rtet-_bGTsAjNyEVxCoS_h6jBgGO6hxOj7gpskRbvxB4AAri0KUbtNA7xTyxLgr3RVm_xqfT0VXtQ6i_HsnemxMmHMQz1dVvzQ-TFF4EE77N3OAdRRqFR9NZIl97HOr_AsVC-q87QYu5uLoa2MqfoiP0-Qw_efz5P00OQ1iX-fOyfdC2XB-Gswjnky5DnO9rRGMTrRaZG-YuN0cSz4UUOvg-ObY0x0NqkButJbHXF5JHL0VjboSvSTJtSwXYk3WKVOKeNSP8A80WNIYPSCA4DC3UM7DVn8AaXM37ggnbxTtg9Vf1c6jay0sOdfR0W0dT-Rq7d9raY-f70VpCnKCc25hTV1RIaQHd5Uwc5FJp3KRaZO_sv7_bR2-07K-fPn2IG6fnn5_4jS8tuaVSrFCu9Yk5gZ4jIbmXiktPdMvM2M9FXuDH7_czp5vhasz9H8hRVYvkA0VhDhFlt5XjvlJ7vB_ga5cZ33A4YHJbn9dgurvlKO87pRzNVaA5E7IshBwV9cFCb8kkVvp0NNl_uqtzKnfqH_2eCGKelXtoxBhaPrIwZMrIe2iXoEKNkL0-wAOHyupysvGnIMpWa10cSmxpOC7KvHZXZTaFelnliO8SyMR_Yh2P0kxkOkoFUEVLE1nbuuaL49WlT748ZUdw_JzELJy82KctyRh4IhjAdmwOiWTX_Gml1xHP1pbAHMwNj4xdhKN6ZyxT3X5rBal1J8RH028Pk_-BntYXcee5JS8EY1ERzM0_k1cALqjO211j-dTSUlM4CoSLy_oBd5YerHcWCYMrrLRoPld-SViVPSd6UcBd445HdDBEWgxnyYynYyFlcrRW7SccUYBB7on4w7Q8AQok-NJU5V_DjSGXAdo1KE4z8bpNDsKeVPEL3PppX4ha43tZObXDW-asFA432ZmZoz-cDgaMzp2jk_tjLPJh5UAo6Nk0lEyHFE-HXxMSYPRUTI9VhKNkyQZFEeMF-Sl0m1TQNN5wNqBx08HiYfQmMN-Y__uG1k1V2R5RnfkERlLdk3FDFWz5R7WGW7eKvcgS7lAPZ1RlN5iEbpt86EuOwmws2X0C6hh1scypWFvTy-3sG7DHaZyiqo7ooMpfd-q_yNuWt875MTd3IvlZBIdV3tdMj-PqiKNwu548-yxQi2emp3FXzr5FUsu-QeZLwPO7NzoF5VZabf35dzcryr9Vgqt5PfaV7W_U_oMyIeG33FnZq3c8tvjqBxkOTB_KR4o1PUC0TiVR2xePHfI8NSY95tq9lfvSe1KeyfXdNif_f3B-goZ0kmh5KR95dk8Fgz7wUJmnI6itLvExaPhcIgFmBe0F-clVqWd1neXuyTBnA7o4KQAEkIBNHAfJIqR9qpmvBKfPQ58XSongj4nlrKqqERqhTuR9vZEpFkeTfNxIYeRPAsRzoDD6-dPt99uf1TYB6GJDG_ETGuzEXWh1g2ccr-VZlP-w5T_Jmvg3NPn5yYfrsOheu1yif19Lh0d4e6_PRiv1s1uf4lDFuB4K1-X4aQivjw_Oew3lFZ-G95jB3P_aVWxKn5w4jLs11fyu7GC5nNs7Pm0s1mqfNliUSkzNgAHDC8KmCruv7m--IppHrsskS9x4gOSpbnm6Z6pWxjZZHftg4LKeGzsldRCrSoJKcisaujIrJFgRjgcH6iZqxxCNubzSQONbTQ7wocxxLR_joVjkkVJOHSHfJsxkXABR5Y1gwOBghQHk83CE58amT2Ot5wTjjLbTWCSxxn3RGgttSr64r4UCyrJNm5uOECN1Y0ChgnnyZbKlVosvZhLnEA5gZnsH0uVIY_-ec1G1qWGihZHEBIDjkgeaWyH4MY0CgIIKwUIb77Eopa2COaGIfaNs6Uv_oV-Oi5ERjgmSk47HipNefkHhz9sB2XJCQ53-bYisN9yTj8QsMKxYhC4nwTvceQ7G4M2UQFREs7_guU5TUJEoZ_33FsOvyY-5BGfGMU3xuOj1Cvf-MEp5u7Yju843HMduOCgkyucdMwCR3FM5ujAQ6ReEOWTb-2bWgDHbQ6Xwte2FIVVa3Jvqm3KLAm3NLUuQmVjbl0JZ_Z6AjltJmvyQV9hmmQCuKNKWulpVwZnqTkk4wxMIBhOFdQc_ZM2W5OQgFwRGMdZifgEE3qOQXDZiL64U9b5Nt2KNhtQSzViuw1Zz6HaZQNzHgqGI7sJ9csuLo1BD-Cybq4AHIWinSOZmGA0H67_EMDQozgellZN_XBYOKe5lC3pbV88E9Ko0OEGLdS5NRVZNJtwhQt1lL9SsW9NG8ltyKCzWlMuwD2zGC4MtOL7po43bteAmora1yOmhPiAeK_yWkuL9gLKQjhOBsIFERdrU-2Ss8_tjDVWYfVHT6rhIRhd4QEtrYltuAdkvVvyDX8818NrgZOtsbRLAVC3apIOfQOx5X3jH-y8poXkxgv9-3BVGuGFT3AU-Qisqraupl3FF6A1Zyw2MaR-aUIWqCZE8xrJTNxqQWi5v1jpZtuNmofh0G6faK24dfGVSveCx2KENq4fLtKMRfXd3cTJdBxHZ5ezC7qKR6M4HUTTOLoortJimk7lhVde0xXy97-8QEPCh-XvT_6UcFFbffXrl1LDcZqOLpZXg1GaJjLPo8kkjYf5MI3HoySjyXQymM4H4_gi3La5K6zVoRw3IkDwTeLw5kJdJVGSRJNkEMfpMJr2R_lgQsMoGyU0iOIs6Q0iwi5E73m8sOGvLJdZvXAY1Mr5A8kX8BTpQxTUAV_Wfmns1Uq9StJLo9EaL4L-q2D_fwAuZ8Of">