Be more careful about folding op(x, undef) when we have vector operands.

This fixes CodeGen/X86/2007-04-24-VectorCrash.ll

llvm-svn: 36413
This commit is contained in:
Chris Lattner 2007-04-25 00:00:45 +00:00
parent 61e8297c44
commit 01a26c74ae
1 changed files with 16 additions and 9 deletions

View File

@ -1294,13 +1294,8 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT,
double F;
uint64_t I;
} u1;
union {
double F;
int64_t I;
} u2;
u1.F = C1;
u2.F = C2;
if (u2.I < 0) // Sign bit of RHS set?
if (int64_t(DoubleToBits(C2)) < 0) // Sign bit of RHS set?
u1.I |= 1ULL << 63; // Set the sign bit of the LHS.
else
u1.I &= (1ULL << 63)-1; // Clear the sign bit of the LHS.
@ -1336,7 +1331,11 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT,
case ISD::SREM:
case ISD::SRL:
case ISD::SHL:
if (!MVT::isVector(VT))
return getConstant(0, VT); // fold op(undef, arg2) -> 0
// For vectors, we can't easily build an all zero vector, just return
// the LHS.
return N2;
}
}
}
@ -1363,9 +1362,17 @@ SDOperand SelectionDAG::getNode(unsigned Opcode, MVT::ValueType VT,
case ISD::AND:
case ISD::SRL:
case ISD::SHL:
if (!MVT::isVector(VT))
return getConstant(0, VT); // fold op(arg1, undef) -> 0
// For vectors, we can't easily build an all zero vector, just return
// the LHS.
return N1;
case ISD::OR:
if (!MVT::isVector(VT))
return getConstant(MVT::getIntVTBitMask(VT), VT);
// For vectors, we can't easily build an all one vector, just return
// the LHS.
return N1;
case ISD::SRA:
return N1;
}