Currently `isGuaranteedToExecute` is too pessimistic about blocks in loops that contain
throwing instructions. It may return `false` for any instruction in non-header block if the
loop contains throwers, even if this instruction is executed before any potential thrower.
This patch reworks `LoopSafetyInfo` to use implicit control flow logic for checks. As result,
it may now answer queries "is it possible to throw before we executed given bb/instruction?"
This gives more accurate analysis results for LICM and other transforms. In particular, it allows
hoisting of non-speculable loads from non-header mustexecute blocks.