mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-25 13:24:46 +00:00
Speculatively revert r97011, "Re-apply 96540 and 96556 with fixes.", again in
the hopes of fixing PPC bootstrap. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@97040 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -4655,8 +4655,7 @@ SDValue DAGCombiner::visitBRCOND(SDNode *N) {
|
||||
DAG.DeleteNode(Trunc);
|
||||
}
|
||||
// Replace the uses of SRL with SETCC
|
||||
WorkListRemover DeadNodes(*this);
|
||||
DAG.ReplaceAllUsesOfValueWith(N1, SetCC, &DeadNodes);
|
||||
DAG.ReplaceAllUsesOfValueWith(N1, SetCC);
|
||||
removeFromWorkList(N1.getNode());
|
||||
DAG.DeleteNode(N1.getNode());
|
||||
return SDValue(N, 0); // Return N so it doesn't get rechecked!
|
||||
@@ -4664,56 +4663,6 @@ SDValue DAGCombiner::visitBRCOND(SDNode *N) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Transform br(xor(x, y)) -> br(x != y)
|
||||
// Transform br(xor(xor(x,y), 1)) -> br (x == y)
|
||||
if (N1.hasOneUse() && N1.getOpcode() == ISD::XOR) {
|
||||
SDNode *TheXor = N1.getNode();
|
||||
SDValue Op0 = TheXor->getOperand(0);
|
||||
SDValue Op1 = TheXor->getOperand(1);
|
||||
if (Op0.getOpcode() == Op1.getOpcode()) {
|
||||
// Avoid missing important xor optimizations.
|
||||
SDValue Tmp = visitXOR(TheXor);
|
||||
if (Tmp.getNode()) {
|
||||
DEBUG(dbgs() << "\nReplacing.8 ";
|
||||
TheXor->dump(&DAG);
|
||||
dbgs() << "\nWith: ";
|
||||
Tmp.getNode()->dump(&DAG);
|
||||
dbgs() << '\n');
|
||||
WorkListRemover DeadNodes(*this);
|
||||
DAG.ReplaceAllUsesOfValueWith(N1, Tmp, &DeadNodes);
|
||||
removeFromWorkList(TheXor);
|
||||
DAG.DeleteNode(TheXor);
|
||||
return DAG.getNode(ISD::BRCOND, N->getDebugLoc(),
|
||||
MVT::Other, Chain, Tmp, N2);
|
||||
}
|
||||
}
|
||||
|
||||
if (Op0.getOpcode() != ISD::SETCC && Op1.getOpcode() != ISD::SETCC) {
|
||||
bool Equal = false;
|
||||
if (ConstantSDNode *RHSCI = dyn_cast<ConstantSDNode>(Op0))
|
||||
if (RHSCI->getAPIntValue() == 1 && Op0.hasOneUse() &&
|
||||
Op0.getOpcode() == ISD::XOR) {
|
||||
TheXor = Op0.getNode();
|
||||
Equal = true;
|
||||
}
|
||||
|
||||
EVT SetCCVT = N1.getValueType();
|
||||
if (LegalTypes)
|
||||
SetCCVT = TLI.getSetCCResultType(SetCCVT);
|
||||
SDValue SetCC = DAG.getSetCC(TheXor->getDebugLoc(),
|
||||
SetCCVT,
|
||||
Op0, Op1,
|
||||
Equal ? ISD::SETEQ : ISD::SETNE);
|
||||
// Replace the uses of XOR with SETCC
|
||||
WorkListRemover DeadNodes(*this);
|
||||
DAG.ReplaceAllUsesOfValueWith(N1, SetCC, &DeadNodes);
|
||||
removeFromWorkList(N1.getNode());
|
||||
DAG.DeleteNode(N1.getNode());
|
||||
return DAG.getNode(ISD::BRCOND, N->getDebugLoc(),
|
||||
MVT::Other, Chain, SetCC, N2);
|
||||
}
|
||||
}
|
||||
|
||||
return SDValue();
|
||||
}
|
||||
@@ -5063,7 +5012,7 @@ SDValue DAGCombiner::visitLOAD(SDNode *N) {
|
||||
assert(N->getValueType(2) == MVT::Other && "Malformed indexed loads?");
|
||||
if (N->hasNUsesOfValue(0, 0) && N->hasNUsesOfValue(0, 1)) {
|
||||
SDValue Undef = DAG.getUNDEF(N->getValueType(0));
|
||||
DEBUG(dbgs() << "\nReplacing.7 ";
|
||||
DEBUG(dbgs() << "\nReplacing.6 ";
|
||||
N->dump(&DAG);
|
||||
dbgs() << "\nWith: ";
|
||||
Undef.getNode()->dump(&DAG);
|
||||
|
@@ -1775,7 +1775,7 @@ TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,
|
||||
break; // todo, be more careful with signed comparisons
|
||||
}
|
||||
} else if (N0.getOpcode() == ISD::SIGN_EXTEND_INREG &&
|
||||
(Cond == ISD::SETEQ || Cond == ISD::SETNE)) {
|
||||
(Cond == ISD::SETEQ || Cond == ISD::SETNE)) {
|
||||
EVT ExtSrcTy = cast<VTSDNode>(N0.getOperand(1))->getVT();
|
||||
unsigned ExtSrcTyBits = ExtSrcTy.getSizeInBits();
|
||||
EVT ExtDstTy = N0.getValueType();
|
||||
@@ -1809,21 +1809,22 @@ TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,
|
||||
Cond);
|
||||
} else if ((N1C->isNullValue() || N1C->getAPIntValue() == 1) &&
|
||||
(Cond == ISD::SETEQ || Cond == ISD::SETNE)) {
|
||||
|
||||
// SETCC (SETCC), [0|1], [EQ|NE] -> SETCC
|
||||
if (N0.getOpcode() == ISD::SETCC &&
|
||||
isTypeLegal(VT) && VT.bitsLE(N0.getValueType())) {
|
||||
if (N0.getOpcode() == ISD::SETCC) {
|
||||
bool TrueWhenTrue = (Cond == ISD::SETEQ) ^ (N1C->getAPIntValue() != 1);
|
||||
if (TrueWhenTrue)
|
||||
return DAG.getNode(ISD::TRUNCATE, dl, VT, N0);
|
||||
return N0;
|
||||
|
||||
// Invert the condition.
|
||||
ISD::CondCode CC = cast<CondCodeSDNode>(N0.getOperand(2))->get();
|
||||
CC = ISD::getSetCCInverse(CC,
|
||||
N0.getOperand(0).getValueType().isInteger());
|
||||
return DAG.getSetCC(dl, VT, N0.getOperand(0), N0.getOperand(1), CC);
|
||||
}
|
||||
|
||||
|
||||
if ((N0.getOpcode() == ISD::XOR ||
|
||||
(N0.getOpcode() == ISD::AND &&
|
||||
(N0.getOpcode() == ISD::AND &&
|
||||
N0.getOperand(0).getOpcode() == ISD::XOR &&
|
||||
N0.getOperand(1) == N0.getOperand(0).getOperand(1))) &&
|
||||
isa<ConstantSDNode>(N0.getOperand(1)) &&
|
||||
@@ -1846,36 +1847,9 @@ TargetLowering::SimplifySetCC(EVT VT, SDValue N0, SDValue N1,
|
||||
N0.getOperand(0).getOperand(0),
|
||||
N0.getOperand(1));
|
||||
}
|
||||
|
||||
return DAG.getSetCC(dl, VT, Val, N1,
|
||||
Cond == ISD::SETEQ ? ISD::SETNE : ISD::SETEQ);
|
||||
}
|
||||
} else if (N1C->getAPIntValue() == 1) {
|
||||
SDValue Op0 = N0;
|
||||
if (Op0.getOpcode() == ISD::TRUNCATE)
|
||||
Op0 = Op0.getOperand(0);
|
||||
|
||||
if ((Op0.getOpcode() == ISD::XOR || Op0.getOpcode() == ISD::AND) &&
|
||||
Op0.getOperand(0).getOpcode() == ISD::SETCC &&
|
||||
Op0.getOperand(1).getOpcode() == ISD::SETCC) {
|
||||
// (and (setcc), (setcc)) == / != 1 -> (setcc) == / != (setcc)
|
||||
// (xor (setcc), (setcc)) == / != 1 -> (setcc) != / == (setcc)
|
||||
if (Op0.getOpcode() == ISD::XOR)
|
||||
Cond = (Cond == ISD::SETEQ) ? ISD::SETNE : ISD::SETEQ;
|
||||
return DAG.getSetCC(dl, VT, Op0.getOperand(0), Op0.getOperand(1),
|
||||
Cond);
|
||||
} else if (Op0.getOpcode() == ISD::AND &&
|
||||
isa<ConstantSDNode>(Op0.getOperand(1)) &&
|
||||
cast<ConstantSDNode>(Op0.getOperand(1))->getAPIntValue() == 1) {
|
||||
// If this is (X&1) == / != 1, normalize it to (X&1) != / == 0.
|
||||
if (Op0.getValueType() != VT)
|
||||
Op0 = DAG.getNode(ISD::AND, dl, VT,
|
||||
DAG.getNode(ISD::TRUNCATE, dl, VT, Op0.getOperand(0)),
|
||||
DAG.getConstant(1, VT));
|
||||
return DAG.getSetCC(dl, VT, Op0,
|
||||
DAG.getConstant(0, Op0.getValueType()),
|
||||
Cond == ISD::SETEQ ? ISD::SETNE : ISD::SETEQ);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user