There can be a need for some optimizations to get (base, offset) for any GC pointer. The base can be calculated by generating needed instructions as it is done by the RewriteStatepointsForGC::findBasePointer() function. The offset can be calculated in the same way. Though to not expose the base calculation and to make the offset calculation as simple as ptrtoint(derived_ptr) - ptrtoint(base_ptr), which is illegal outside RS4GC, this patch introduces 2 intrinsics:
- declare i8 addrspace(1)* @llvm.experimental.gc.get.pointer.base(i8 addrspace(1)* readnone nocapture %derived_ptr) nounwind readnone willreturn
- declare i64 @llvm.experimental.gc.get.pointer.offset(i8 addrspace(1)* readnone nocapture %derived_ptr) nounwind readnone willreturn
These intrinsics are inlined by RS4GC along with generation of statepoint sequences.
With these new intrinsics the GC parseable lowering for atomic memcpy intrinsics (D88861) could be implemented as a separate pass.
Name out of sync with following text.
Also, the documentation for these should be in LangRef. If you want some extra discussion here, that's fine, but put the definition in LangRef.