[NFC] Implement SelectionDAG::getObjectPtrOffset() using getMemBasePlusOffset()
authorAlex Richardson <Alexander.Richardson@cl.cam.ac.uk>
Fri, 13 Dec 2019 19:43:06 +0000 (19:43 +0000)
committerAlex Richardson <Alexander.Richardson@cl.cam.ac.uk>
Fri, 13 Dec 2019 21:40:03 +0000 (21:40 +0000)
commitfc83f53a86d802fc2d56aac4eb3dc53998751042
treebe64c1a746c70620076eb4d41e38e974a2f814c1
parentea8888d1af3a992d82d1ff3bf99537220828d388
[NFC] Implement SelectionDAG::getObjectPtrOffset() using getMemBasePlusOffset()

Summary:
This change is preparatory work to use this helper functions in more places.
In order to make this change, getMemBasePlusOffset() has been extended to
also take a SDNodeFlags parameter.

The motivation for this change is our out-of-tree CHERI backend
(https://github.com/CTSRD-CHERI/llvm-project). We use a separate register
type to store pointers (128-bit capabilities, which are effectively
unforgeable and monotonic fat pointers). These capabilities permit a
reduced set of operations and therefore use a separate ValueType (iFATPTR).
to represent pointers implemented as capabilities.
Therefore, we need to avoid using ISD::ADD for our patterns that operate
on pointers and need to use a function that chooses ISD::ADD or a new
ISD::PTRADD opcode depending on the value type.

We originally added a new DAG.getPointerAdd() function, but after this
patch series we can modify the implementation of getMemBasePlusOffset()
instead. Avoiding direct uses of ISD::ADD for pointer types will
significantly reduce the amount of assertion/instruction selection
failures for us in future upstream merges.

Reviewers: spatel

Reviewed By: spatel

Subscribers: merge_guards_bot, hiraditya, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D71206
llvm/include/llvm/CodeGen/SelectionDAG.h
llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp