Before this commit, initModelTypes always looked at uses of each
instructions to see if its knowledge of the instruction's model type
could be improved.
This is useful in some cases, but it's detrimental when building model
casts, because this requires to see the exact type computed for an
instruction.
This commit introduces a new function initModeTypesConsideringUses,
which works like old initModelTypes, considering uses.
In this way we can make sure that uses are considered when necessary,
like when computing types to build new local variables, and ignored when
necessary, e.g. when building model casts.
Now ModelGEPs emitted by MakeModelGEP always forward the LLVM Type of
the operand representing the base address.
Before this commit they were occasionally using an integer type with the
size of the underlying `model::QualifiedType`, but that is not necessary
and may end up requiring `llvm::IntegerType`s that are very large, to
the point of not being supported by LLVM, for no additional advantage.
Before this commit, many passes in revng-c were skipping over
non-isolated functions.
Now revng-pipeline takes care of removing non-isolated functions so that
check can be omitted everywhere.