mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
[InstSimplify] Match PtrToInt more directly in a GEP transform (NFC)
In preparation for 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. Reviewed By: lebedev.ri Differential Revision: https://reviews.llvm.org/D98672
This commit is contained in:
parent
0a3d22f26f
commit
533dfa60d2
@ -4349,40 +4349,34 @@ static Value *SimplifyGEPInst(Type *SrcTy, ArrayRef<Value *> Ops,
|
||||
// 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 {
|
||||
// FIXME: The following transforms are only legal if P and V have the
|
||||
// same provenance (PR44403). Check whether getUnderlyingObject() is
|
||||
// the same?
|
||||
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;
|
||||
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) -> 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, (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) -> 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;
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user