mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-21 21:11:36 +00:00
Implement:
// fold (and (sext x), (sext y)) -> (sext (and x, y)) // fold (or (sext x), (sext y)) -> (sext (or x, y)) // fold (xor (sext x), (sext y)) -> (sext (xor x, y)) // fold (and (aext x), (aext y)) -> (aext (and x, y)) // fold (or (aext x), (aext y)) -> (aext (or x, y)) // fold (xor (aext x), (aext y)) -> (aext (xor x, y)) llvm-svn: 28123
This commit is contained in:
parent
bec98440f4
commit
584874682a
@ -1045,16 +1045,18 @@ SDOperand DAGCombiner::SimplifyBinOpWithSameOpcodeHands(SDNode *N) {
|
||||
MVT::ValueType VT = N0.getValueType();
|
||||
assert(N0.getOpcode() == N1.getOpcode() && "Bad input!");
|
||||
|
||||
// fold (and (zext x), (zext y)) -> (zext (and x, y))
|
||||
// fold (or (zext x), (zext y)) -> (zext (or x, y))
|
||||
// fold (xor (zext x), (zext y)) -> (zext (xor x, y))
|
||||
if (N0.getOpcode() == ISD::ZERO_EXTEND &&
|
||||
// For each of OP in AND/OR/XOR:
|
||||
// fold (OP (zext x), (zext y)) -> (zext (OP x, y))
|
||||
// fold (OP (sext x), (sext y)) -> (sext (OP x, y))
|
||||
// fold (OP (aext x), (aext y)) -> (aext (OP x, y))
|
||||
if ((N0.getOpcode() == ISD::ZERO_EXTEND || N0.getOpcode() == ISD::ANY_EXTEND||
|
||||
N0.getOpcode() == ISD::SIGN_EXTEND) &&
|
||||
N0.getOperand(0).getValueType() == N1.getOperand(0).getValueType()) {
|
||||
SDOperand ORNode = DAG.getNode(N->getOpcode(),
|
||||
N0.getOperand(0).getValueType(),
|
||||
N0.getOperand(0), N1.getOperand(0));
|
||||
AddToWorkList(ORNode.Val);
|
||||
return DAG.getNode(ISD::ZERO_EXTEND, VT, ORNode);
|
||||
return DAG.getNode(N0.getOpcode(), VT, ORNode);
|
||||
}
|
||||
|
||||
// fold (and (trunc x), (trunc y)) -> (trunc (and x, y))
|
||||
|
Loading…
x
Reference in New Issue
Block a user