[PATCH] D98588: [InstCombine] Restrict a GEP transform to avoid changing provenance
Simonas Kazlauskas via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sat Mar 13 13:49:48 PST 2021
nagisa updated this revision to Diff 330471.
nagisa added a comment.
Rebase onto precommited test cases, adjust style
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D98588/new/
https://reviews.llvm.org/D98588
Files:
llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
llvm/test/Transforms/InstCombine/getelementptr.ll
Index: llvm/test/Transforms/InstCombine/getelementptr.ll
===================================================================
--- llvm/test/Transforms/InstCombine/getelementptr.ll
+++ llvm/test/Transforms/InstCombine/getelementptr.ll
@@ -1087,7 +1087,11 @@
define %struct.C* @test45(%struct.C* %c1, %struct.C** %c2) {
; CHECK-LABEL: @test45(
-; CHECK-NEXT: [[GEP:%.*]] = bitcast %struct.C** [[C2:%.*]] to %struct.C*
+; CHECK-NEXT: [[PTRTOINT1:%.*]] = ptrtoint %struct.C* [[C1:%.*]] to i64
+; CHECK-NEXT: [[PTRTOINT2:%.*]] = ptrtoint %struct.C** [[C2:%.*]] to i64
+; CHECK-NEXT: [[SUB:%.*]] = sub i64 [[PTRTOINT2]], [[PTRTOINT1]]
+; CHECK-NEXT: [[SHR:%.*]] = sdiv i64 [[SUB]], 7
+; CHECK-NEXT: [[GEP:%.*]] = getelementptr inbounds [[STRUCT_C:%.*]], %struct.C* [[C1]], i64 [[SHR]]
; CHECK-NEXT: ret %struct.C* [[GEP]]
;
%ptrtoint1 = ptrtoint %struct.C* %c1 to i64
Index: llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
===================================================================
--- llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
+++ llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
@@ -2173,14 +2173,15 @@
Matched = true;
}
- if (Matched) {
- // Canonicalize (gep i8* X, (ptrtoint Y)-(ptrtoint X))
- // to (bitcast Y)
- Value *Y;
- if (match(V, m_Sub(m_PtrToInt(m_Value(Y)),
- m_PtrToInt(m_Specific(GEP.getOperand(0))))))
- return CastInst::CreatePointerBitCastOrAddrSpaceCast(Y, GEPType);
- }
+ // Canonicalize (gep i8* X, (ptrtoint Y)-(ptrtoint X)) to (bitcast Y), but
+ // only if both point to the same underlying object (otherwise provenance
+ // is not necessarily retained).
+ Value *Y;
+ Value *X = GEP.getOperand(0);
+ if (Matched &&
+ match(V, m_Sub(m_PtrToInt(m_Value(Y)), m_PtrToInt(m_Specific(X)))) &&
+ getUnderlyingObject(X) == getUnderlyingObject(Y))
+ return CastInst::CreatePointerBitCastOrAddrSpaceCast(Y, GEPType);
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D98588.330471.patch
Type: text/x-patch
Size: 2060 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210313/02d51b5e/attachment.bin>
More information about the llvm-commits
mailing list