This is an archive of the discontinued LLVM Phabricator instance.

[NFC] Implement SelectionDAG::getObjectPtrOffset() using getMemBasePlusOffset()
ClosedPublic

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

Details

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.

Diff Detail

Event Timeline

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

Build result: pass - 60628 tests passed, 0 failed and 726 were skipped.

Log files: console-log.txt, CMakeCache.txt

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

LGTM

This revision is now accepted and ready to land.Dec 9 2019, 2:01 PM

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.