[NFC] Add a SDValue overload for SelectionDAG::getMemBasePlusOffset()
authorAlex Richardson <Alexander.Richardson@cl.cam.ac.uk>
Fri, 13 Dec 2019 19:43:02 +0000 (19:43 +0000)
committerAlex Richardson <Alexander.Richardson@cl.cam.ac.uk>
Fri, 13 Dec 2019 21:40:03 +0000 (21:40 +0000)
commitea8888d1af3a992d82d1ff3bf99537220828d388
tree51f8496f33a0a43b2035ddd898e3be3c0fc35515
parentd9bb70acd7f6da7c4637826d5ae942ae61bf9494
[NFC] Add a SDValue overload for SelectionDAG::getMemBasePlusOffset()

Summary:
This change is preparatory work to use this helper functions in more places.
Currently the function only allows integer constants offsets, but there
are cases where we can use an existing SDValue 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, craig.topper

Reviewed By: spatel, craig.topper

Subscribers: craig.topper, merge_guards_bot, hiraditya, llvm-commits

Tags: #llvm

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