Type checking and preservation proof for LTL#206
Type checking and preservation proof for LTL#206gergo- wants to merge 5 commits intoAbsInt:masterfrom
Conversation
The BR_splitlong constructor used to be recursive, meaning that a long result could in theory be split into an arbitrary tree of atomic parts. But we only ever split longs into exactly two ints, so this generality was not needed. This simplification will help with the LTL typing proof.
If LTLtyping finds that the program after register allocation is well-typed, then execution preserves well-typedness of the state. In particular, this typing property ensures that Locmap accesses are well-typed: All register writes are of values with a type compatible with the register's type.
Locmap.set now uniformly uses `Val.load_result` to model stores to registers and to stack slots equivalently.
|
Some general comments. (We'll go over the code when you're back.)
|
|
Thanks for your comments.
That may be possible, I didn't try to approach it that way. The type-checking pass is convenient for reasoning of the form "if I do use the Allocation checker where the information from the type checker is not precise enough, i.e., in the case we discussed of spills from a general register (e.g.,
I'm not sure this is true. |
In addressing modes for load and store instructions, the offset must be a multiple of the memory size being accessed. When accessing global variables, this may not be the case if the alignment of the variable is less than its size. Errors occur at link time. This PR extends the check for a representable offset for the addressing of global variables to also check whether the variable is correctly aligned. Only if both conditions are met can we generate the short sequence Padrp / ADadr. Otherwise we go through the generic loadsymbol sequence.
The main reason for the patches in this branch is to strengthen the
Locmap.gss_reglemma, which used to claim that any value can be written to and recovered from any register:This statement is not true if
vis a 64-bit value andris a 32-bit register. (This does not seem to allow miscompilations in practice, as there are plenty of type checks both above and below the LTL level.) The new version enforces correct typing, as for stack slots: