This is an archive of the discontinued LLVM Phabricator instance.

[NFC] Add a SDValue overload for SelectionDAG::getMemBasePlusOffset()
ClosedPublic

Authored by arichardson on Dec 9 2019, 6:34 AM.

Details

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.

Diff Detail

Event Timeline

arichardson created this revision.Dec 9 2019, 6:34 AM
Herald added a project: Restricted Project. · View Herald TranscriptDec 9 2019, 6:34 AM

Build result: FAILURE - Could not check out parent git hash "86e5d7fcd6891e259e9e8df15f579ab8428d0c5a". It was not found in the repository. Did you configure the "Parent Revision" in Phabricator properly? Trying to apply the patch to the master branch instead...

ERROR: arc patch failed with error code 1. Check build log for details.
Log files: console-log.txt, CMakeCache.txt

spatel accepted this revision.Dec 9 2019, 2:00 PM

LGTM

This revision is now accepted and ready to land.Dec 9 2019, 2:00 PM
craig.topper added inline comments.
llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
5738–5745

Should we rewrite this in terms of the new function? Perhaps by moving to the header file.

arichardson marked an inline comment as done.Dec 13 2019, 3:11 AM
arichardson added inline comments.
llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp
5738–5745

Yes, will do.
I'm not sure if I adding it to the header is beneficial compared to having it in the .cpp.

In our fork we depend on TargetLowering, so we need to have the function in the .cpp rather than the .h, but I can obviously keep that change downstream.

For context here is our implementation that handles CHERI capabilities: https://github.com/CTSRD-CHERI/llvm-project/blob/8cad6d336ad9e91657db9999fcd25adceae3be83/llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp#L6297

Implement using the other overload

Unit tests: pass. 60837 tests passed, 0 failed and 726 were skipped.

clang-format: pass.

Build artifacts: console-log.txt, CMakeCache.txt, test-results.xml, diff.json

This revision was automatically updated to reflect the committed changes.