diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2021-06-21 18:33:29 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2021-06-21 20:06:25 +0200 |
commit | d9fe96fe264e72c0a5c58cdd40b4efa14d18f475 (patch) | |
tree | 1c2b205310d3c2c19c851e9059c39fe48974ff42 /llvm/lib/IR/Constants.cpp | |
parent | 0c09e5bd74db90497a272e723213293981633a18 (diff) | |
download | llvm-d9fe96fe264e72c0a5c58cdd40b4efa14d18f475.zip llvm-d9fe96fe264e72c0a5c58cdd40b4efa14d18f475.tar.gz llvm-d9fe96fe264e72c0a5c58cdd40b4efa14d18f475.tar.bz2 |
[OpaquePtr] Support opaque constant expression GEP
Adjust assertions to use isOpaqueOrPointeeTypeMatches() and make
it return an opaque pointer result for an opaque base pointer. We
also need to enumerate the element type, as it is no longer
implicitly enumerated through the pointer type.
Differential Revision: https://reviews.llvm.org/D104655
Diffstat (limited to 'llvm/lib/IR/Constants.cpp')
-rw-r--r-- | llvm/lib/IR/Constants.cpp | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/llvm/lib/IR/Constants.cpp b/llvm/lib/IR/Constants.cpp index 147e96c..2823a1e 100644 --- a/llvm/lib/IR/Constants.cpp +++ b/llvm/lib/IR/Constants.cpp @@ -2425,11 +2425,11 @@ Constant *ConstantExpr::getGetElementPtr(Type *Ty, Constant *C, ArrayRef<Value *> Idxs, bool InBounds, Optional<unsigned> InRangeIndex, Type *OnlyIfReducedTy) { + PointerType *OrigPtrTy = cast<PointerType>(C->getType()->getScalarType()); if (!Ty) - Ty = cast<PointerType>(C->getType()->getScalarType())->getElementType(); + Ty = OrigPtrTy->getElementType(); else - assert(Ty == - cast<PointerType>(C->getType()->getScalarType())->getElementType()); + assert(OrigPtrTy->isOpaqueOrPointeeTypeMatches(Ty)); if (Constant *FC = ConstantFoldGetElementPtr(Ty, C, InBounds, InRangeIndex, Idxs)) @@ -2438,8 +2438,10 @@ Constant *ConstantExpr::getGetElementPtr(Type *Ty, Constant *C, // Get the result type of the getelementptr! Type *DestTy = GetElementPtrInst::getIndexedType(Ty, Idxs); assert(DestTy && "GEP indices invalid!"); - unsigned AS = C->getType()->getPointerAddressSpace(); - Type *ReqTy = DestTy->getPointerTo(AS); + unsigned AS = OrigPtrTy->getAddressSpace(); + Type *ReqTy = OrigPtrTy->isOpaque() + ? PointerType::get(OrigPtrTy->getContext(), AS) + : DestTy->getPointerTo(AS); auto EltCount = ElementCount::getFixed(0); if (VectorType *VecTy = dyn_cast<VectorType>(C->getType())) |