mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-30 17:33:24 +00:00
Don't remove two operand, two result nodes from the binary ops map. These
should come from the arbitrary ops map. This fixes Regression/CodeGen/PowerPC/2005-12-01-Crash.ll git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24571 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
43cb6effd3
commit
fe14b34d83
@ -388,43 +388,46 @@ void SelectionDAG::RemoveNodeFromCSEMaps(SDNode *N) {
|
||||
SDNode *SelectionDAG::AddNonLeafNodeToCSEMaps(SDNode *N) {
|
||||
assert(N->getNumOperands() && "This is a leaf node!");
|
||||
if (N->getOpcode() == ISD::CALLSEQ_START ||
|
||||
N->getOpcode() == ISD::CALLSEQ_END)
|
||||
return 0;
|
||||
N->getOpcode() == ISD::CALLSEQ_END ||
|
||||
N->getOpcode() == ISD::HANDLENODE)
|
||||
return 0; // Never add these nodes.
|
||||
|
||||
if (N->getOpcode() == ISD::LOAD) {
|
||||
SDNode *&L = Loads[std::make_pair(N->getOperand(1),
|
||||
std::make_pair(N->getOperand(0),
|
||||
N->getValueType(0)))];
|
||||
if (L) return L;
|
||||
L = N;
|
||||
} else if (N->getOpcode() == ISD::HANDLENODE) {
|
||||
return 0; // never add it.
|
||||
} else if (N->getNumOperands() == 1) {
|
||||
SDNode *&U = UnaryOps[std::make_pair(N->getOpcode(),
|
||||
std::make_pair(N->getOperand(0),
|
||||
N->getValueType(0)))];
|
||||
if (U) return U;
|
||||
U = N;
|
||||
} else if (N->getNumOperands() == 2) {
|
||||
SDNode *&B = BinaryOps[std::make_pair(N->getOpcode(),
|
||||
std::make_pair(N->getOperand(0),
|
||||
N->getOperand(1)))];
|
||||
if (B) return B;
|
||||
B = N;
|
||||
} else if (N->getNumValues() == 1) {
|
||||
std::vector<SDOperand> Ops(N->op_begin(), N->op_end());
|
||||
SDNode *&ORN = OneResultNodes[std::make_pair(N->getOpcode(),
|
||||
std::make_pair(N->getValueType(0), Ops))];
|
||||
if (ORN) return ORN;
|
||||
ORN = N;
|
||||
} else {
|
||||
// Remove the node from the ArbitraryNodes map.
|
||||
std::vector<MVT::ValueType> RV(N->value_begin(), N->value_end());
|
||||
std::vector<SDOperand> Ops(N->op_begin(), N->op_end());
|
||||
SDNode *&AN = ArbitraryNodes[std::make_pair(N->getOpcode(),
|
||||
std::make_pair(RV, Ops))];
|
||||
if (AN) return AN;
|
||||
AN = N;
|
||||
if (N->getNumValues() == 1) {
|
||||
if (N->getNumOperands() == 1) {
|
||||
SDNode *&U = UnaryOps[std::make_pair(N->getOpcode(),
|
||||
std::make_pair(N->getOperand(0),
|
||||
N->getValueType(0)))];
|
||||
if (U) return U;
|
||||
U = N;
|
||||
} else if (N->getNumOperands() == 2) {
|
||||
SDNode *&B = BinaryOps[std::make_pair(N->getOpcode(),
|
||||
std::make_pair(N->getOperand(0),
|
||||
N->getOperand(1)))];
|
||||
if (B) return B;
|
||||
B = N;
|
||||
} else {
|
||||
std::vector<SDOperand> Ops(N->op_begin(), N->op_end());
|
||||
SDNode *&ORN = OneResultNodes[std::make_pair(N->getOpcode(),
|
||||
std::make_pair(N->getValueType(0), Ops))];
|
||||
if (ORN) return ORN;
|
||||
ORN = N;
|
||||
}
|
||||
} else {
|
||||
if (N->getOpcode() == ISD::LOAD) {
|
||||
SDNode *&L = Loads[std::make_pair(N->getOperand(1),
|
||||
std::make_pair(N->getOperand(0),
|
||||
N->getValueType(0)))];
|
||||
if (L) return L;
|
||||
L = N;
|
||||
} else {
|
||||
// Remove the node from the ArbitraryNodes map.
|
||||
std::vector<MVT::ValueType> RV(N->value_begin(), N->value_end());
|
||||
std::vector<SDOperand> Ops(N->op_begin(), N->op_end());
|
||||
SDNode *&AN = ArbitraryNodes[std::make_pair(N->getOpcode(),
|
||||
std::make_pair(RV, Ops))];
|
||||
if (AN) return AN;
|
||||
AN = N;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user