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:
parent
563d2c9fac
commit
7797bfa0fd
@ -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) {
|
||||
|
Loading…
Reference in New Issue
Block a user