Sometimes we have something like:
preheader: guard(%c1)[]; %c2 =<some cond>; br i1 %loop loop: ... guard(%c2) ...
Despite %c2 being loop invariant, we cannot widen the 2nd guard into
the 1st one in case if %c2 is not available at the point of 1st guard. To
solve that situation, we can insert the fictive guard with true condition
like this:
preheader: guard(%c1)[]; %c2 =<some cond>; guard(true)[]; br i1 %loop loop: ... guard(%c2) ...
And then widen the condition of guard in loop into this fictive guard. In case
if it didn't help, we can just safely delete the fictive guard we've just inserted.