[PATCH] D138637: [InstCombine] Combine opaque pointer single index GEP and with src GEP which has result of array type
krishna chaitanya sankisa via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sun Dec 4 23:48:40 PST 2022
skc7 updated this revision to Diff 479994.
skc7 added a reviewer: jmmartinez.
skc7 added a comment.
Update code as per @jmmartinez comments.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D138637/new/
https://reviews.llvm.org/D138637
Files:
llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
llvm/test/Transforms/InstCombine/opaque-ptr-gep-of-gep.ll
Index: llvm/test/Transforms/InstCombine/opaque-ptr-gep-of-gep.ll
===================================================================
--- /dev/null
+++ llvm/test/Transforms/InstCombine/opaque-ptr-gep-of-gep.ll
@@ -0,0 +1,63 @@
+; RUN: opt -S -instcombine %s | FileCheck %s
+
+ at ext1 = external hidden global [2 x [1 x float]]
+ at ext2 = external hidden global [2 x [2 x [1 x float]]]
+
+; Test to check if instcombine pass combines opaque pointer gepofgep with src array type
+; and current gep having single index.
+define void @gepofgep1(i64 %in1, i64 %in2, ptr %out) {
+; CHECK-LABEL: @gepofgep1(
+; CHECK-NEXT: [[B:%.*]] = getelementptr inbounds [2 x [1 x float]], ptr [[EXT1:@.*]], i64 0, i64 [[IN1:%.*]], i64 [[IN2:%.*]]
+; CHECK-NEXT: store ptr [[B]], ptr [[OUT:%.*]], align 8
+; CHECK-NEXT: ret void
+
+ %a = getelementptr inbounds [2 x [1 x float]], ptr @ext1, i64 0, i64 %in1
+ %b = getelementptr inbounds float, ptr %a, i64 %in2
+ store ptr %b, ptr %out
+ ret void
+}
+
+; Test to check if instcombine pass doesn't combine opaque pointer gepofgep with src array type
+; and current gep having more than one index.
+define void @gepofgep2(i64 %in1, i64 %in2, ptr %out) {
+; CHECK-LABEL: @gepofgep2(
+; CHECK-NEXT: [[A:%.*]] = getelementptr inbounds [2 x [2 x [1 x float]]], ptr [[EXT2:@.*]], i64 0, i64 [[IN1:%.*]]
+; CHECK-NEXT: [[B:%.*]] = getelementptr inbounds [1 x float], ptr [[A]], i64 0, i64 [[IN2:%.*]]
+; CHECK-NEXT: store ptr [[B]], ptr [[OUT:%.*]], align 8
+; CHECK-NEXT: ret void
+ %a = getelementptr inbounds [2 x [2 x [1 x float]]], ptr @ext2, i64 0, i64 %in1
+ %b = getelementptr inbounds [1 x float], ptr %a, i64 0, i64 %in2
+ store ptr %b, ptr %out
+ ret void
+}
+
+; Test to check if instcombine pass combines opaque pointer gepofgep with src of higher dimension array type
+; and current gep having single index.
+define void @gepofgep3(i64 %in1, i64 %in2, ptr %out) {
+; CHECK-LABEL: @gepofgep3(
+; CHECK-NEXT: [[B:%.*]] = getelementptr inbounds [2 x [2 x [1 x float]]], ptr [[EXT2:@.*]], i64 [[IN1:%.*]], i64 [[IN2:%.*]]
+; CHECK-NEXT: store ptr [[B]], ptr [[OUT:%.*]], align 8
+; CHECK-NEXT: ret void
+ %a = getelementptr inbounds [2 x [2 x [1 x float]]], ptr @ext2, i64 %in1
+ %b = getelementptr inbounds float, ptr %a, i64 %in2
+ store ptr %b, ptr %out
+ ret void
+}
+
+; Test to check if instcombine pass combines opaque pointer gepofgep with src of array type having more than one user
+; and current gep having single index.
+define void @gepofgep4(i64 %in1, i64 %in2, ptr %out1, ptr %out2) {
+; CHECK-LABEL: @gepofgep4(
+; CHECK-NEXT: [[B:%.*]] = getelementptr inbounds [2 x [1 x float]], ptr [[EXT1:@.*]], i64 0, i64 [[IN1:%.*]], i64 [[IN1]]
+; CHECK-NEXT: [[C:%.*]] = getelementptr inbounds [2 x [1 x float]], ptr [[EXT1:@.*]], i64 0, i64 [[IN1]], i64 [[IN2:%.*]]
+; CHECK-NEXT: store ptr [[B]], ptr [[OUT1:%.*]], align 8
+; CHECK-NEXT: store ptr [[C]], ptr [[OUT2:%.*]], align 8
+; CHECK-NEXT: ret void
+
+ %a = getelementptr inbounds [2 x [1 x float]], ptr @ext1, i64 0, i64 %in1
+ %b = getelementptr inbounds float, ptr %a, i64 %in1
+ %c = getelementptr inbounds float, ptr %a, i64 %in2
+ store ptr %b, ptr %out1
+ store ptr %c, ptr %out2
+ ret void
+}
Index: llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
===================================================================
--- llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
+++ llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
@@ -2080,6 +2080,22 @@
GEP.getName());
}
+ // Combine opaque pointer GEPs having source array type with
+ // GEP having single index.
+ if (PtrTy->isOpaquePointerTy() && Src->getResultElementType()->isArrayTy() &&
+ GEP.getNumIndices() == 1) {
+ SmallVector<Value *, 16> NewIndices;
+ NewIndices.reserve(Src->getNumIndices() + GEP.getNumIndices());
+ NewIndices.append(Src->idx_begin(), Src->idx_end());
+ NewIndices.append(GEP.idx_begin(), GEP.idx_end());
+ bool IsInBounds = isMergedGEPInBounds(*Src, *cast<GEPOperator>(&GEP));
+ GetElementPtrInst *NewGEP = GetElementPtrInst::Create(
+ Src->getSourceElementType(), Src->getOperand(0), NewIndices,
+ GEP.getName());
+ NewGEP->setIsInBounds(IsInBounds);
+ return NewGEP;
+ }
+
if (Src->getResultElementType() != GEP.getSourceElementType())
return nullptr;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D138637.479994.patch
Type: text/x-patch
Size: 4408 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20221205/1080d674/attachment.bin>
More information about the llvm-commits
mailing list