[PATCH] D34335: Fix invalid ptrtoint in InstCombine
Yichao Yu via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 27 07:22:30 PDT 2017
yuyichao updated this revision to Diff 116807.
yuyichao added a comment.
There was no comment since the only comment I can add would be repeating the condition itself. I do like to add comment about why this is needed or if this is the only way we can fix the issue but that's also what I'm not sure about (quesiton 1 in my review comment). Anyway, I added a comment to repeat the condition for now.
https://reviews.llvm.org/D34335
Files:
lib/Analysis/Loads.cpp
test/Transforms/InstCombine/non-integral-pointers.ll
Index: test/Transforms/InstCombine/non-integral-pointers.ll
===================================================================
--- test/Transforms/InstCombine/non-integral-pointers.ll
+++ test/Transforms/InstCombine/non-integral-pointers.ll
@@ -46,3 +46,37 @@
store i8 addrspace(3)* %val, i8 addrspace(3)** %ptr1
ret void
}
+
+define i64 @g(i8 addrspace(4)** %gp) {
+ ; CHECK-LABEL: @g(
+ ; CHECK: load
+ %.pre = load i8 addrspace(4)*, i8 addrspace(4)** %gp, align 8
+ %v74 = call i8 addrspace(4)* @alloc()
+ %v75 = addrspacecast i8 addrspace(4)* %v74 to i8*
+ %v76 = bitcast i8* %v75 to i8 addrspace(4)**
+ %v77 = getelementptr i8 addrspace(4)*, i8 addrspace(4)** %v76, i64 -1
+ ; CHECK: store
+ store i8 addrspace(4)* %.pre, i8 addrspace(4)** %v77, align 8
+ %v80 = bitcast i8 addrspace(4)** %v77 to i64*
+ ; CHECK: load
+ ; CHECK-NOT: ptrtoint
+ %v81 = load i64, i64* %v80, align 8
+ ret i64 %v81
+}
+
+define i64 @g2(i8* addrspace(4)* %gp) {
+ ; CHECK-LABEL: @g2(
+ ; CHECK: load
+ %.pre = load i8*, i8* addrspace(4)* %gp, align 8
+ %v74 = call i8 addrspace(4)* @alloc()
+ %v76 = bitcast i8 addrspace(4)* %v74 to i8* addrspace(4)*
+ %v77 = getelementptr i8*, i8* addrspace(4)* %v76, i64 -1
+ ; CHECK: store
+ store i8* %.pre, i8* addrspace(4)* %v77, align 8
+ %v80 = bitcast i8* addrspace(4)* %v77 to i64 addrspace(4)*
+ ; CHECK-NOT: store
+ %v81 = load i64, i64 addrspace(4)* %v80, align 8
+ ret i64 %v81
+}
+
+declare i8 addrspace(4)* @alloc()
Index: lib/Analysis/Loads.cpp
===================================================================
--- lib/Analysis/Loads.cpp
+++ lib/Analysis/Loads.cpp
@@ -380,6 +380,21 @@
if (LI->isAtomic() < AtLeastAtomic)
return nullptr;
+ // Do nothing if the two types are pointers of different addrspace
+ // or one integer and one non-integral pointer.
+ if (AccessTy->isPointerTy()) {
+ PointerType *Ty1 = cast<PointerType>(AccessTy);
+ if (PointerType *Ty2 = dyn_cast<PointerType>(LI->getType())) {
+ if (Ty1->getAddressSpace() != Ty2->getAddressSpace()) {
+ return nullptr;
+ }
+ } else if (DL.isNonIntegralPointerType(Ty1)) {
+ return nullptr;
+ }
+ } else if (DL.isNonIntegralPointerType(LI->getType())) {
+ return nullptr;
+ }
+
if (IsLoadCSE)
*IsLoadCSE = true;
return LI;
@@ -399,6 +414,21 @@
if (SI->isAtomic() < AtLeastAtomic)
return nullptr;
+ // Do nothing if the two types are pointers of different addrspace
+ // or one integer and one non-integral pointer.
+ if (AccessTy->isPointerTy()) {
+ PointerType *Ty1 = cast<PointerType>(AccessTy);
+ if (PointerType *Ty2 = dyn_cast<PointerType>(SI->getValueOperand()->getType())) {
+ if (Ty1->getAddressSpace() != Ty2->getAddressSpace()) {
+ return nullptr;
+ }
+ } else if (DL.isNonIntegralPointerType(Ty1)) {
+ return nullptr;
+ }
+ } else if (DL.isNonIntegralPointerType(SI->getValueOperand()->getType())) {
+ return nullptr;
+ }
+
if (IsLoadCSE)
*IsLoadCSE = false;
return SI->getOperand(0);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D34335.116807.patch
Type: text/x-patch
Size: 3284 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170927/c91e34c8/attachment.bin>
More information about the llvm-commits
mailing list