[llvm] 39796e1 - Reapply [InstCombine] Don't try converting opaque pointer bitcast to GEP
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Mon Jun 21 13:16:05 PDT 2021
Author: Nikita Popov
Date: 2021-06-21T22:15:56+02:00
New Revision: 39796e1ad02a45b09ac3ef9e3dc1906f28804a91
URL: https://github.com/llvm/llvm-project/commit/39796e1ad02a45b09ac3ef9e3dc1906f28804a91
DIFF: https://github.com/llvm/llvm-project/commit/39796e1ad02a45b09ac3ef9e3dc1906f28804a91.diff
LOG: Reapply [InstCombine] Don't try converting opaque pointer bitcast to GEP
Reapplied without changes -- this was reverted together with an
underlying patch.
-----
Bitcasts having opaque pointer source or result type cannot be
converted into a zero-index GEP, GEP source and result types
always have the same opaque-ness.
Added:
llvm/test/Transforms/InstCombine/opaque-ptr.ll
Modified:
llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
index dcfff4552f11..24187d50a484 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineCasts.cpp
@@ -2608,6 +2608,11 @@ static Instruction *convertBitCastToGEP(BitCastInst &CI, IRBuilderBase &Builder,
Value *Src = CI.getOperand(0);
PointerType *SrcPTy = cast<PointerType>(Src->getType());
PointerType *DstPTy = cast<PointerType>(CI.getType());
+
+ // Bitcasts involving opaque pointers cannot be converted into a GEP.
+ if (SrcPTy->isOpaque() || DstPTy->isOpaque())
+ return nullptr;
+
Type *DstElTy = DstPTy->getElementType();
Type *SrcElTy = SrcPTy->getElementType();
diff --git a/llvm/test/Transforms/InstCombine/opaque-ptr.ll b/llvm/test/Transforms/InstCombine/opaque-ptr.ll
new file mode 100644
index 000000000000..1bf205ca9141
--- /dev/null
+++ b/llvm/test/Transforms/InstCombine/opaque-ptr.ll
@@ -0,0 +1,43 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt -S -instcombine < %s | FileCheck %s
+
+define ptr @bitcast_opaque_to_opaque(ptr %a) {
+; CHECK-LABEL: @bitcast_opaque_to_opaque(
+; CHECK-NEXT: ret ptr [[A:%.*]]
+;
+ %b = bitcast ptr %a to ptr
+ ret ptr %b
+}
+
+define ptr @bitcast_typed_to_opaque(i8* %a) {
+; CHECK-LABEL: @bitcast_typed_to_opaque(
+; CHECK-NEXT: [[B:%.*]] = bitcast i8* [[A:%.*]] to ptr
+; CHECK-NEXT: ret ptr [[B]]
+;
+ %b = bitcast i8* %a to ptr
+ ret ptr %b
+}
+
+define i8* @bitcast_opaque_to_typed(ptr %a) {
+; CHECK-LABEL: @bitcast_opaque_to_typed(
+; CHECK-NEXT: [[B:%.*]] = bitcast ptr [[A:%.*]] to i8*
+; CHECK-NEXT: ret i8* [[B]]
+;
+ %b = bitcast ptr %a to i8*
+ ret i8* %b
+}
+
+;define ptr @addrspacecast_opaque_to_opaque(ptr addrspace(1) %a) {
+; %b = addrspacecast ptr addrspace(1) %a to ptr
+; ret ptr %b
+;}
+
+;define ptr @addrspacecast_typed_to_opaque(i8 addrspace(1)* %a) {
+; %b = addrspacecast i8 addrspace(1)* %a to ptr
+; ret ptr %b
+;}
+
+;define i8* @addrspacecast_opaque_to_typed(ptr addrspace(1) %a) {
+; %b = addrspacecast ptr addrspace(1) %a to i8*
+; ret i8* %b
+;}
More information about the llvm-commits
mailing list