diff options
author | Florian Hahn <flo@fhahn.com> | 2019-08-15 10:12:26 +0000 |
---|---|---|
committer | Florian Hahn <flo@fhahn.com> | 2019-08-15 10:12:26 +0000 |
commit | de1d6c822079b3e7565bb3e48865318bee51761c (patch) | |
tree | 4f5ce2245bd1a4d0b2f0d29a3eafbf250168377f /llvm/lib/CodeGen | |
parent | 2601cdd3aed5d90b574e4a681462667b25577bcd (diff) | |
download | llvm-de1d6c822079b3e7565bb3e48865318bee51761c.zip llvm-de1d6c822079b3e7565bb3e48865318bee51761c.tar.gz llvm-de1d6c822079b3e7565bb3e48865318bee51761c.tar.bz2 |
Add ptrmask intrinsic
This patch adds a ptrmask intrinsic which allows masking out bits of a
pointer that must be zero when accessing it, because of ABI alignment
requirements or a restriction of the meaningful bits of a pointer
through the data layout.
This avoids doing a ptrtoint/inttoptr round trip in some cases (e.g. tagged
pointers) and allows us to not lose information about the underlying
object.
Reviewers: nlopes, efriedma, hfinkel, sanjoy, jdoerfert, aqjune
Reviewed by: sanjoy, jdoerfert
Differential Revision: https://reviews.llvm.org/D59065
llvm-svn: 368986
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index b4e894a..71d0022 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -6859,6 +6859,17 @@ void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I, setValue(&I, Val); return; } + case Intrinsic::ptrmask: { + SDValue Ptr = getValue(I.getOperand(0)); + SDValue Const = getValue(I.getOperand(1)); + + EVT DestVT = + EVT(DAG.getTargetLoweringInfo().getPointerTy(DAG.getDataLayout())); + + setValue(&I, DAG.getNode(ISD::AND, getCurSDLoc(), DestVT, Ptr, + DAG.getZExtOrTrunc(Const, getCurSDLoc(), DestVT))); + return; + } } } |