In preparation for supporting ILP32 on AArch64, this modifies the SelectionDAG builder code so that pointers are allowed to have a larger type when "live" in the DAG compared to memory.
Pointers get zero-extended whenever they are loaded, and truncated prior to stores. In addition, a few not quite so obvious locations need updating:
- A GEP that has not been marked inbounds needs to enforce the IR-documented 2s-complement wrapping at the memory pointer size. Inbounds GEPs are undefined if they overflow the address space, so no additional operations are needed.
- Signed comparisons would give incorrect results if performed on the zero-extended values.
This shouldn't affect CodeGen for now, which unfortunately means tests can't be written, but will become active when the AArch64 ILP32 support is committed. I decided it was better to split the patch off despite that limitation.