1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-22 12:33:33 +02:00

Set N->OperandList to 0 after deletion. Otherwise, it's possible that it will

be either deleted or referenced afterwards.

llvm-svn: 57786
This commit is contained in:
Bill Wendling 2008-10-19 20:51:12 +00:00
parent 980c8ad152
commit ed477995f1

View File

@ -227,8 +227,10 @@ ISD::CondCode ISD::getSetCCInverse(ISD::CondCode Op, bool isInteger) {
Operation ^= 7; // Flip L, G, E bits, but not U.
else
Operation ^= 15; // Flip all of the condition bits.
if (Operation > ISD::SETTRUE2)
Operation &= ~8; // Don't let N and U bits get set.
return ISD::CondCode(Operation);
}
@ -506,7 +508,8 @@ static void AddNodeIDNode(FoldingSetNodeID &ID, const SDNode *N) {
/// encodeMemSDNodeFlags - Generic routine for computing a value for use in
/// the CSE map that carries both alignment and volatility information.
///
static unsigned encodeMemSDNodeFlags(bool isVolatile, unsigned Alignment) {
static inline unsigned
encodeMemSDNodeFlags(bool isVolatile, unsigned Alignment) {
return isVolatile | ((Log2_32(Alignment) + 1) << 1);
}
@ -561,9 +564,10 @@ void SelectionDAG::RemoveDeadNodes(SmallVectorImpl<SDNode *> &DeadNodes,
if (Operand->use_empty())
DeadNodes.push_back(Operand);
}
if (N->OperandsNeedDelete) {
if (N->OperandsNeedDelete)
delete[] N->OperandList;
}
N->OperandList = 0;
N->NumOperands = 0;
@ -589,12 +593,14 @@ void SelectionDAG::DeleteNode(SDNode *N) {
}
void SelectionDAG::DeleteNodeNotInCSEMaps(SDNode *N) {
// Drop all of the operands and decrement used node's use counts.
for (SDNode::op_iterator I = N->op_begin(), E = N->op_end(); I != E; ++I)
I->getVal()->removeUser(std::distance(N->op_begin(), I), N);
if (N->OperandsNeedDelete)
if (N->OperandsNeedDelete) {
delete[] N->OperandList;
N->OperandList = 0;
}
assert(N != AllNodes.begin());
NodeAllocator.Deallocate(AllNodes.remove(N));
@ -833,8 +839,12 @@ void SelectionDAG::allnodes_clear() {
while (!AllNodes.empty()) {
SDNode *N = AllNodes.remove(AllNodes.begin());
N->SetNextInBucket(0);
if (N->OperandsNeedDelete)
if (N->OperandsNeedDelete) {
delete [] N->OperandList;
N->OperandList = 0;
}
NodeAllocator.Deallocate(N);
}
}
@ -4208,6 +4218,7 @@ SDNode *SelectionDAG::MorphNodeTo(SDNode *N, unsigned Opc,
if (NumOps > N->NumOperands) {
if (N->OperandsNeedDelete)
delete[] N->OperandList;
if (N->isMachineOpcode()) {
// We're creating a final node that will live unmorphed for the
// remainder of the current SelectionDAG iteration, so we can allocate