[PATCH] D52294: [InstCombine] Fix incongruous GEP type addrspace
Ewan Crawford via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Oct 4 03:24:42 PDT 2018
EwanCrawford updated this revision to Diff 168254.
EwanCrawford added a comment.
Thanks for the feedback @spatel.
I've modified the test according to your suggestions and added a check to the verifier which fires without the instcombine change.
Repository:
rL LLVM
https://reviews.llvm.org/D52294
Files:
lib/IR/Verifier.cpp
lib/Transforms/InstCombine/InstructionCombining.cpp
test/Transforms/InstCombine/gep-vector.ll
Index: test/Transforms/InstCombine/gep-vector.ll
===================================================================
--- test/Transforms/InstCombine/gep-vector.ll
+++ test/Transforms/InstCombine/gep-vector.ll
@@ -47,3 +47,26 @@
ret i32* %gep
}
+define i32 addrspace(3)* @bitcast_vec_to_array_addrspace(<7 x i32>* %x, i64 %y, i64 %z) {
+; CHECK-LABEL: @bitcast_vec_to_array_addrspace(
+; CHECK-NEXT: [[GEP:%.*]] = getelementptr <7 x i32>, <7 x i32>* [[X:%.*]], i64 [[Y:%.*]], i64 [[Z:%.*]]
+; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast i32* [[GEP]] to i32 addrspace(3)*
+; CHECK-NEXT: ret i32 addrspace(3)* [[TMP1]]
+;
+ %arr_ptr = bitcast <7 x i32>* %x to [7 x i32]*
+ %asc = addrspacecast [7 x i32]* %arr_ptr to [7 x i32] addrspace(3)*
+ %gep = getelementptr [7 x i32], [7 x i32] addrspace(3)* %asc, i64 %y, i64 %z
+ ret i32 addrspace(3)* %gep
+}
+
+define i32 addrspace(3)* @inbounds_bitcast_vec_to_array_addrspace(<7 x i32>* %x, i64 %y, i64 %z) {
+; CHECK-LABEL: @inbounds_bitcast_vec_to_array_addrspace(
+; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds <7 x i32>, <7 x i32>* [[X:%.*]], i64 [[Y:%.*]], i64 [[Z:%.*]]
+; CHECK-NEXT: [[TMP1:%.*]] = addrspacecast i32* [[GEP]] to i32 addrspace(3)*
+; CHECK-NEXT: ret i32 addrspace(3)* [[TMP1]]
+;
+ %arr_ptr = bitcast <7 x i32>* %x to [7 x i32]*
+ %asc = addrspacecast [7 x i32]* %arr_ptr to [7 x i32] addrspace(3)*
+ %gep = getelementptr inbounds [7 x i32], [7 x i32] addrspace(3)* %asc, i64 %y, i64 %z
+ ret i32 addrspace(3)* %gep
+}
Index: lib/Transforms/InstCombine/InstructionCombining.cpp
===================================================================
--- lib/Transforms/InstCombine/InstructionCombining.cpp
+++ lib/Transforms/InstCombine/InstructionCombining.cpp
@@ -2052,9 +2052,18 @@
areMatchingArrayAndVecTypes(GEPEltType, SrcEltType)) ||
(GEPEltType->isVectorTy() && SrcEltType->isArrayTy() &&
areMatchingArrayAndVecTypes(SrcEltType, GEPEltType)))) {
- GEP.setOperand(0, SrcOp);
- GEP.setSourceElementType(SrcEltType);
- return &GEP;
+
+ Value *NGEP =
+ GEP.isInBounds()
+ ? Builder.CreateInBoundsGEP(nullptr, SrcOp,
+ makeArrayRef(Ops).slice(1))
+ : Builder.CreateGEP(nullptr, SrcOp, makeArrayRef(Ops).slice(1));
+ NGEP->takeName(&GEP);
+
+ if (NGEP->getType()->getPointerAddressSpace() != GEP.getAddressSpace())
+ return new AddrSpaceCastInst(NGEP, GEPType);
+
+ return replaceInstUsesWith(GEP, NGEP);
}
// See if we can simplify:
Index: lib/IR/Verifier.cpp
===================================================================
--- lib/IR/Verifier.cpp
+++ lib/IR/Verifier.cpp
@@ -3138,6 +3138,12 @@
"All GEP indices should be of integer type");
}
}
+
+ if (PointerType *PTy = dyn_cast<PointerType>(GEP.getType())) {
+ Assert(GEP.getAddressSpace() == PTy->getAddressSpace(),
+ "GEP address space doesn't match type", &GEP);
+ }
+
visitInstruction(GEP);
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D52294.168254.patch
Type: text/x-patch
Size: 3057 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181004/903b3725/attachment.bin>
More information about the llvm-commits
mailing list