SeparateConstOffsetFromGEP: Fix creating pointless bitcasts
authorMatt Arsenault <Matthew.Arsenault@amd.com>
Sat, 26 Nov 2022 19:53:36 +0000 (14:53 -0500)
committerMatt Arsenault <Matthew.Arsenault@amd.com>
Mon, 28 Nov 2022 01:53:48 +0000 (20:53 -0500)
This was directly creating new BitCastInsts, so under opaque pointers,
would end up producing bitcast from ptr to ptr.

llvm/lib/Transforms/Scalar/SeparateConstOffsetFromGEP.cpp
llvm/test/Transforms/SeparateConstOffsetFromGEP/AMDGPU/split-gep.ll

index 7da5a78..a5d6416 100644 (file)
@@ -1122,18 +1122,17 @@ bool SeparateConstOffsetFromGEP::splitGEP(GetElementPtrInst *GEP) {
     // sizeof(int64).
     //
     // Emit an uglygep in this case.
-    Type *I8PtrTy = Type::getInt8PtrTy(GEP->getContext(),
-                                       GEP->getPointerAddressSpace());
-    NewGEP = new BitCastInst(NewGEP, I8PtrTy, "", GEP);
-    NewGEP = GetElementPtrInst::Create(
-        Type::getInt8Ty(GEP->getContext()), NewGEP,
-        ConstantInt::get(IntPtrTy, AccumulativeByteOffset, true), "uglygep",
-        GEP);
+    IRBuilder<> Builder(GEP);
+    Type *I8PtrTy =
+        Builder.getInt8Ty()->getPointerTo(GEP->getPointerAddressSpace());
+
+    NewGEP = cast<Instruction>(Builder.CreateGEP(
+        Builder.getInt8Ty(), Builder.CreateBitCast(NewGEP, I8PtrTy),
+        {ConstantInt::get(IntPtrTy, AccumulativeByteOffset, true)}, "uglygep",
+        GEPWasInBounds));
+
     NewGEP->copyMetadata(*GEP);
-    // Inherit the inbounds attribute of the original GEP.
-    cast<GetElementPtrInst>(NewGEP)->setIsInBounds(GEPWasInBounds);
-    if (GEP->getType() != I8PtrTy)
-      NewGEP = new BitCastInst(NewGEP, GEP->getType(), GEP->getName(), GEP);
+    NewGEP = cast<Instruction>(Builder.CreateBitCast(NewGEP, GEP->getType()));
   }
 
   GEP->replaceAllUsesWith(NewGEP);
index 743e1c2..60d005b 100644 (file)
@@ -15,8 +15,7 @@ define ptr addrspace(3) @packed_struct(i32 %i, i32 %j) {
 ; CHECK-NEXT:    [[TMP0:%.*]] = sext i32 [[I:%.*]] to i64
 ; CHECK-NEXT:    [[TMP1:%.*]] = sext i32 [[J:%.*]] to i64
 ; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr [1024 x %struct.Packed], ptr addrspace(3) @packed_struct_array, i64 0, i64 [[TMP0]], i32 1, i64 [[TMP1]]
-; CHECK-NEXT:    [[TMP3:%.*]] = bitcast ptr addrspace(3) [[TMP2]] to ptr addrspace(3)
-; CHECK-NEXT:    [[UGLYGEP:%.*]] = getelementptr inbounds i8, ptr addrspace(3) [[TMP3]], i64 100
+; CHECK-NEXT:    [[UGLYGEP:%.*]] = getelementptr inbounds i8, ptr addrspace(3) [[TMP2]], i64 100
 ; CHECK-NEXT:    ret ptr addrspace(3) [[UGLYGEP]]
 ;
 entry: