If an integer PHI has an illegal type (according to the data layout) and
it is only used by trunc or trunc(lshr) operations, we split the PHI
into various instructions in its predecessors:
https://github.com/llvm/llvm-project/blob/6d1543a16797fa07eecea7e542df5b42422fc721/llvm/lib/Transforms/InstCombine/InstCombinePHI.cpp#L1536-L1543
So this can produce code like the following:
Before:
pred: ... bb: %p = phi i8 [ %somevalue, %pred ], ... ... %tobool = trunc i8 %p to i1 use %tobool ...
In this code, %p has an illegal integer type, i8, and its only used
in a trunc instruction later. In this case this pass puts extraction
code in its predecessors:
After:
pred: ... %t = and i8 %somevalue, 1 %extract = icmp ne i8 %t, 0 bb: %p.new = phi i1 [ %extract, %pred ], ... use %p.new instead of %tobool
But this doesn't work if pred is a catchswitch BB because it cannot
have any non-PHI instructions. This CL ensures we bail out in that case.
The correct way to check this is whether getFirstInsertionPt() is end().