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

    <tr>
        <th>Summary</th>
        <td>
            [Pass Manager] Infinite loop of scheduled passes
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

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

    <tr>
      <th>Reporter</th>
      <td>
          patrick-rivos
      </td>
    </tr>
</table>

<pre>
    Affects LLVM 13 up to and including trunk.

Program:
```c
short a, b;
signed char c;
short d[52];
static char e() {
  for (;; b--) {
    a = 0;
    for (; a <= 3; a++) {
      c = 2;
      for (; c >= 0; c--)
        if ((short)(b * (c + 1) * 4))
          if (d[c * 4 + a])
            return 0;
    }
  }
}
void f() { e(); }
```
Godbolt: https://godbolt.org/z/hKcezobh8

Reduced LLVM IR:
```llvm ir
@b = external global i16
@c = external global i8
@d = external global [52 x i16]

define void @f() {
entry:
 %call = call i8 @e()
  ret void
}

define internal i8 @e() {
entry:
  br label %for.cond

for.cond: ; preds = %for.inc21, %entry
  br label %for.cond1

for.cond1:                                        ; preds = %for.inc19, %for.cond
  %0 = phi i16 [ 0, %for.cond ], [ %inc, %for.inc19 ]
  %cmp = icmp slt i16 %0, 4
  br i1 %cmp, label %for.cond3, label %for.inc21

for.cond3:                                        ; preds = %for.inc, %for.cond1
  %1 = phi i8 [ %dec, %for.inc ], [ 2, %for.cond1 ]
  store i8 %1, ptr @c, align 1
  %cmp5 = icmp sgt i8 %1, -1
  br i1 %cmp5, label %for.body7, label %for.inc19

for.body7: ; preds = %for.cond3
  %2 = load i16, ptr @b, align 2
  %narrow = add i8 %1, 1
  %add = zext i8 %narrow to i16
 %mul = mul i16 %2, %add
  %mul10.mask = and i16 %mul, 16383
 %tobool.not = icmp eq i16 %mul10.mask, 0
  br i1 %tobool.not, label %for.inc, label %if.then

if.then: ; preds = %for.body7
  %conv12 = zext i8 %1 to i32
  %mul13 = shl i32 %conv12, 2
  %conv14 = sext i16 %0 to i32
  %add15 = or i32 %mul13, %conv14
  %idxprom = sext i32 %add15 to i64
  %arrayidx = getelementptr [52 x i16], ptr @d, i64 0, i64 %idxprom
  %3 = load i16, ptr %arrayidx, align 2
  %tobool16.not = icmp eq i16 %3, 0
  br i1 %tobool16.not, label %for.inc, label %if.then17

if.then17: ; preds = %if.then
  ret i8 0

for.inc: ; preds = %if.then, %for.body7
  %dec = add i8 %1, -1
  br label %for.cond3

for.inc19: ; preds = %for.cond3
  %inc = add i16 %0, 1
  br label %for.cond1

for.inc21:                                        ; preds = %for.cond1
  %4 = load i16, ptr @b, align 2
  %dec22 = add i16 %4, 1
  store i16 %dec22, ptr @b, align 2
  br label %for.cond
}
```
Godbolt: https://godbolt.org/z/xzr8bEx8W

>From `-opt-bisect-limit=3000` it seems like it gets into a loop with these 6 passes:
```
SimpleLoopUnswitchPass on for.inc.i.us186.us3650.us.us.us
LoopInstSimplifyPass on for.inc.i.us186.us3650.us.us.us
LoopSimplifyCFGPass on for.inc.i.us186.us3650.us.us.us
LICMPass on for.inc.i.us186.us3650.us.us.us
LoopRotatePass on for.inc.i.us186.us3650.us.us.us
LICMPass on for.inc.i.us186.us3650.us.us.us
... (repeat)
```

Found via fuzzer.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0V19v46gX_TTk5SqWjf_EfshD20xG1W9GGs1Pu_uMDY7ZEuMF3En76VeAHTtO2p1qdkfR1MC558K5B7CJ1vzQMrZF6T1KdyvSm0aqbUeM4tXTWvFnqVelpC_bu7pmldHw5cvvXyGKoe_ASCAtBd5Woqe8PYBRffsUoHCHwjv__zclD4ocUTy0URb6X-XbupHKAEH4AUoU3w-ddkoUqoYoqKZeB6UovU8xSndTvyGGVx7NEM4RLgBthkGAWiqwvfE9iu-hXK8X4wAEULyD8Exo-6YoN_xgEbFrIXzvfgsSgMrR4AuaCyIL-DSmgsrNZA4F4LXD4tyt1Q7jvASE72x3BQjfQ-Qy4ztI3PCCYKSwKlUe5qKIFewaDKCY6VW7WDza7MbG-fH88Cw5hXrSedTcrmlCj2X2zc-SllIYFN9BY0ynrR3wHuH9wQ8EUh0Q3r8ivG_-V7FXWTb53EXfGe0rRr33Hr9fu0mI5yNwNfQmYelqwU6GqZYIOAhZEgE8ys6I6jYiPwPoTYBzH5wcVbqbz5GymrcMnDwoCeulE1lr1Mt55oBwWhEhXBL3wHMbNoo5yK-YcYyLGlxk5O0wxQuGNxNDqUCQkgk7hVqqoJItndOe--I7sEXtFKPazXMI4G2FI7tjEU49-TvM0S3qyHL_5L-3phAVwxQu1wC2K3TYruG2TrZmEC7A4DbEgxtDOOVtNQM4djjX11FWx86RcvughfHMOHXEyUwBHg1wO3AlR3zV69W8IVL8L4i0WHU0W1A0aZSPMlC2kGEuE16SzRXSRirmmHDqvNEZZd3o-IjghxaiSzXTmZwHMw9dR7fkTK-Us9fS5paeUbHU00PfMrRXe5oddoNCEur2-bSacloNnuFbopT84YIIpfOlzNdshyzklZ3G5Q6BRk5Hk-0-9v5csH8Hm43iEzr3-bEXURgciX7yyVs64o-9cPmzOI8nYiNLKUXQSjOJz_6axQxsNjS8KsIUfUv0iz5eB6Zh7bwMY9dbRfAlmllEts8RXioWObFivBAhdjjdCDs2Rds54SVn4rGOc9jD16SE0sg7VKqR0yUa6uCZZgGcnjoljzNuH-SJLH82hxOlyAunJ4c_MMMEO7LWOJ9dXjGT-6h95lniDzP7MOWdUce33TvlvG1iX90oe8sd8Xum8GE_a4toc8MY0e39eeEkfyHyfJzHtMFtpvfCp6Nr6TPKqls79-IQunGMX-ePip8-YNzJOuac3SPv5ry6JPzN8YuXxPJaSD549lFWYbxcTHKxmOFu8EMO_w-077yh_PoL5ulV5eWnU_7HXM6927pZuJadWZdcs8qsBT9yg-JdHIY2EXADmrGjBsGfmG0dmNH27UsCASFlBz-4acA0TDPIoCNaM339quqb_-fHTrAvUna_tfoHN1XzjWgNsoWhsgEPeh3lWdDrOEvDoNf-58Nt4GOrjaPh9cuHg8fAh_3nj8U-Pnz9cLLv0hDD_ts8QRDYDx_FOkbM-Q16ofpQbNm3FJ45gbp_fWUqWNFtTIu4ICu2jTZhgeMsSsJVs82zNEuyLIrrTVHXNY43eUSqPMsrXGxIkq34Foc4CTEuoiIpwjCgRbkJWbSpyyJNaBjbF_Ij4SKwXyjWhSuudc-2eZxkxcq5XI_f3mprQeuyP2iUhIJro6cww41wX-lOla-kJQemULqDx7bmLTfMW1DWoKuG0V4wOlhw1SuxXewKbpq-DCp5RHhvUwx_1p2Sf7LKILx309QI791M_w4AAP__8TdkXw">