1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 03:33:20 +01:00

SImplify ConstantVector::get a bit and make it turn a vector

of all undefs into a single undef value.

llvm-svn: 53384
This commit is contained in:
Chris Lattner 2008-07-10 00:44:03 +00:00
parent 563d2c9fac
commit 7797bfa0fd

View File

@ -1498,16 +1498,26 @@ static ManagedStatic<ValueMap<std::vector<Constant*>, VectorType,
Constant *ConstantVector::get(const VectorType *Ty,
const std::vector<Constant*> &V) {
// If this is an all-zero vector, return a ConstantAggregateZero object
if (!V.empty()) {
Constant *C = V[0];
if (!C->isNullValue())
return VectorConstants->getOrCreate(Ty, V);
assert(!V.empty() && "Vectors can't be empty");
// If this is an all-undef or alll-zero vector, return a
// ConstantAggregateZero or UndefValue.
Constant *C = V[0];
bool isZero = C->isNullValue();
bool isUndef = isa<UndefValue>(C);
if (isZero || isUndef) {
for (unsigned i = 1, e = V.size(); i != e; ++i)
if (V[i] != C)
return VectorConstants->getOrCreate(Ty, V);
if (V[i] != C) {
isZero = isUndef = false;
break;
}
}
return ConstantAggregateZero::get(Ty);
if (isZero)
return ConstantAggregateZero::get(Ty);
if (isUndef)
return UndefValue::get(Ty);
return VectorConstants->getOrCreate(Ty, V);
}
Constant *ConstantVector::get(const std::vector<Constant*> &V) {