[PATCH] D98672: [InstSimplify] Match PtrToInt more directly in a GEP transform (NFC)
Simonas Kazlauskas via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Mar 15 16:56:42 PDT 2021
nagisa created this revision.
nagisa added reviewers: lebedev.ri, nikic.
Herald added a subscriber: hiraditya.
nagisa requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
In preparation for D98611 <https://reviews.llvm.org/D98611>, the upcoming change will need to apply additional checks to `P` and `V`,
and so this refactor paves the way for adding additional checks in a less awkward way.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D98672
Files:
llvm/lib/Analysis/InstructionSimplify.cpp
Index: llvm/lib/Analysis/InstructionSimplify.cpp
===================================================================
--- llvm/lib/Analysis/InstructionSimplify.cpp
+++ llvm/lib/Analysis/InstructionSimplify.cpp
@@ -4349,40 +4349,31 @@
// doesn't truncate the pointers.
if (Ops[1]->getType()->getScalarSizeInBits() ==
Q.DL.getPointerSizeInBits(AS)) {
- auto PtrToInt = [GEPTy](Value *P) -> Value * {
- Value *Temp;
- if (match(P, m_PtrToInt(m_Value(Temp))))
- if (Temp->getType() == GEPTy)
- return Temp;
- return nullptr;
+ auto CanSimplify = [GEPTy, &P]() -> bool {
+ return P->getType() == GEPTy;
};
-
- // FIXME: The following transforms are only legal if P and V have the
- // same provenance (PR44403). Check whether getUnderlyingObject() is
- // the same?
-
// getelementptr V, (sub P, V) -> P if P points to a type of size 1.
if (TyAllocSize == 1 &&
- match(Ops[1], m_Sub(m_Value(P), m_PtrToInt(m_Specific(Ops[0])))))
- if (Value *R = PtrToInt(P))
- return R;
-
- // getelementptr V, (ashr (sub P, V), C) -> Q
- // if P points to a type of size 1 << C.
- if (match(Ops[1],
- m_AShr(m_Sub(m_Value(P), m_PtrToInt(m_Specific(Ops[0]))),
- m_ConstantInt(C))) &&
- TyAllocSize == 1ULL << C)
- if (Value *R = PtrToInt(P))
- return R;
-
- // getelementptr V, (sdiv (sub P, V), C) -> Q
- // if P points to a type of size C.
- if (match(Ops[1],
- m_SDiv(m_Sub(m_Value(P), m_PtrToInt(m_Specific(Ops[0]))),
- m_SpecificInt(TyAllocSize))))
- if (Value *R = PtrToInt(P))
- return R;
+ match(Ops[1], m_Sub(m_PtrToInt(m_Value(P)),
+ m_PtrToInt(m_Specific(Ops[0])))) &&
+ CanSimplify())
+ return P;
+
+ // getelementptr V, (ashr (sub P, V), C) -> P if P points to a type of
+ // size 1 << C.
+ if (match(Ops[1], m_AShr(m_Sub(m_PtrToInt(m_Value(P)),
+ m_PtrToInt(m_Specific(Ops[0]))),
+ m_ConstantInt(C))) &&
+ TyAllocSize == 1ULL << C && CanSimplify())
+ return P;
+
+ // getelementptr V, (sdiv (sub P, V), C) -> P if P points to a type of
+ // size C.
+ if (match(Ops[1], m_SDiv(m_Sub(m_PtrToInt(m_Value(P)),
+ m_PtrToInt(m_Specific(Ops[0]))),
+ m_SpecificInt(TyAllocSize))) &&
+ CanSimplify())
+ return P;
}
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D98672.330845.patch
Type: text/x-patch
Size: 2754 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210315/14865221/attachment.bin>
More information about the llvm-commits
mailing list