[PATCH] D104652: [OpaquePtr] Return opaque pointer from opaque pointer GEP

Nikita Popov via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 21 08:45:05 PDT 2021


nikic created this revision.
nikic added reviewers: aeubanks, dblaikie.
Herald added subscribers: dexonsmith, hiraditya.
nikic requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

For a GEP on an opaque pointer, also return an opaque pointer (or vector of opaque pointer) result.

This requires explicitly enumerating the GEP source element type, because it is now no longer implicitly enumerated as part of either the source or result pointer types.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D104652

Files:
  llvm/include/llvm/IR/Instructions.h
  llvm/lib/Bitcode/Writer/ValueEnumerator.cpp
  llvm/test/Assembler/opaque-ptr.ll


Index: llvm/test/Assembler/opaque-ptr.ll
===================================================================
--- llvm/test/Assembler/opaque-ptr.ll
+++ llvm/test/Assembler/opaque-ptr.ll
@@ -41,12 +41,28 @@
     ret void
 }
 
-; CHECK: define void @gep(ptr %a)
-; CHECK:     %b = getelementptr i8, ptr %a, i32 2
-; CHECK:     ret void
-define void @gep(ptr %a) {
-    %b = getelementptr i8, ptr %a, i32 2
-    ret void
+; CHECK: define ptr @gep(ptr %a)
+; CHECK:     %res = getelementptr i8, ptr %a, i32 2
+; CHECK:     ret ptr %res
+define ptr @gep(ptr %a) {
+  %res = getelementptr i8, ptr %a, i32 2
+  ret ptr %res
+}
+
+; CHECK: define <2 x ptr> @gep_vec1(ptr %a)
+; CHECK:     %res = getelementptr i8, ptr %a, <2 x i32> <i32 1, i32 2>
+; CHECK:     ret <2 x ptr> %res
+define <2 x ptr> @gep_vec1(ptr %a) {
+  %res = getelementptr i8, ptr %a, <2 x i32> <i32 1, i32 2>
+  ret <2 x ptr> %res
+}
+
+; CHECK: define <2 x ptr> @gep_vec2(<2 x ptr> %a)
+; CHECK:     %res = getelementptr i8, <2 x ptr> %a, i32 2
+; CHECK:     ret <2 x ptr> %res
+define <2 x ptr> @gep_vec2(<2 x ptr> %a) {
+  %res = getelementptr i8, <2 x ptr> %a, i32 2
+  ret <2 x ptr> %res
 }
 
 ; CHECK: define void @cmpxchg(ptr %p, i32 %a, i32 %b)
Index: llvm/lib/Bitcode/Writer/ValueEnumerator.cpp
===================================================================
--- llvm/lib/Bitcode/Writer/ValueEnumerator.cpp
+++ llvm/lib/Bitcode/Writer/ValueEnumerator.cpp
@@ -463,6 +463,8 @@
         }
         if (auto *SVI = dyn_cast<ShuffleVectorInst>(&I))
           EnumerateType(SVI->getShuffleMaskForBitcode()->getType());
+        if (auto *GEP = dyn_cast<GetElementPtrInst>(&I))
+          EnumerateType(GEP->getSourceElementType());
         EnumerateType(I.getType());
         if (const auto *Call = dyn_cast<CallBase>(&I))
           EnumerateAttributes(Call->getAttributes());
Index: llvm/include/llvm/IR/Instructions.h
===================================================================
--- llvm/include/llvm/IR/Instructions.h
+++ llvm/include/llvm/IR/Instructions.h
@@ -1098,8 +1098,12 @@
   /// instruction, which may be a vector of pointers.
   static Type *getGEPReturnType(Type *ElTy, Value *Ptr,
                                 ArrayRef<Value *> IdxList) {
-    Type *PtrTy = PointerType::get(checkGEPType(getIndexedType(ElTy, IdxList)),
-                                   Ptr->getType()->getPointerAddressSpace());
+    PointerType *OrigPtrTy = cast<PointerType>(Ptr->getType()->getScalarType());
+    unsigned AddrSpace = OrigPtrTy->getAddressSpace();
+    Type *ResultElemTy = checkGEPType(getIndexedType(ElTy, IdxList));
+    Type *PtrTy = OrigPtrTy->isOpaque()
+      ? PointerType::get(OrigPtrTy->getContext(), AddrSpace)
+      : PointerType::get(ResultElemTy, AddrSpace);
     // Vector GEP
     if (auto *PtrVTy = dyn_cast<VectorType>(Ptr->getType())) {
       ElementCount EltCount = PtrVTy->getElementCount();


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D104652.353389.patch
Type: text/x-patch
Size: 2902 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210621/63edcccb/attachment.bin>


More information about the llvm-commits mailing list