mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
[InstCombine] Remove custom and(trunc(and(x,c1)),c2) fold
This is more correctly handled by canEvaluateTruncated (one use checks etc.) and covers all the tests cases that were added for this fold.
This commit is contained in:
parent
09bc15e2ca
commit
afd2da6ff6
@ -1871,22 +1871,6 @@ Instruction *InstCombinerImpl::visitAnd(BinaryOperator &I) {
|
||||
if (Instruction *Res = OptAndOp(Op0I, Op0CI, AndRHS, I))
|
||||
return Res;
|
||||
}
|
||||
|
||||
// If this is an integer truncation, and if the source is an 'and' with
|
||||
// immediate, transform it. This frequently occurs for bitfield accesses.
|
||||
{
|
||||
Value *X = nullptr; ConstantInt *YC = nullptr;
|
||||
if (match(Op0, m_Trunc(m_And(m_Value(X), m_ConstantInt(YC))))) {
|
||||
// Change: and (trunc (and X, YC) to T), C2
|
||||
// into : and (trunc X to T), trunc(YC) & C2
|
||||
// This will fold the two constants together, which may allow
|
||||
// other simplifications.
|
||||
Value *NewCast = Builder.CreateTrunc(X, I.getType(), "and.shrunk");
|
||||
Constant *C3 = ConstantExpr::getTrunc(YC, I.getType());
|
||||
C3 = ConstantExpr::getAnd(C3, AndRHS);
|
||||
return BinaryOperator::CreateAnd(NewCast, C3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (Instruction *Z = narrowMaskedBinOp(I))
|
||||
|
Loading…
Reference in New Issue
Block a user