forked from OSchip/llvm-project
Consolidate existing utilities for interpreting vector predicate maskes [NFC]
llvm-svn: 359163
This commit is contained in:
parent
07161d6de3
commit
88cd69b56f
llvm
include/llvm/Analysis
lib
|
@ -223,6 +223,20 @@ Constant *createSequentialMask(IRBuilder<> &Builder, unsigned Start,
|
|||
/// elements, it will be padded with undefs.
|
||||
Value *concatenateVectors(IRBuilder<> &Builder, ArrayRef<Value *> Vecs);
|
||||
|
||||
/// Given a mask vector of the form <Y x i1>, Return true if all of the
|
||||
/// elements of this predicate mask are false or undef. That is, return true
|
||||
/// if all lanes can be assumed inactive.
|
||||
bool maskIsAllZeroOrUndef(Value *Mask);
|
||||
|
||||
/// Given a mask vector of the form <Y x i1>, Return true if all of the
|
||||
/// elements of this predicate mask are true or undef. That is, return true
|
||||
/// if all lanes can be assumed active.
|
||||
bool maskIsAllOneOrUndef(Value *Mask);
|
||||
|
||||
/// Given a mask vector of the form <Y x i1>, return an APInt (of bitwidth Y)
|
||||
/// for each lane which may be active.
|
||||
APInt possiblyDemandedEltsInMask(Value *Mask);
|
||||
|
||||
/// The group of interleaved loads/stores sharing the same stride and
|
||||
/// close to each other.
|
||||
///
|
||||
|
|
|
@ -4635,22 +4635,6 @@ static Value *SimplifyRelativeLoad(Constant *Ptr, Constant *Offset,
|
|||
return ConstantExpr::getBitCast(LoadedLHSPtr, Int8PtrTy);
|
||||
}
|
||||
|
||||
static bool maskIsAllZeroOrUndef(Value *Mask) {
|
||||
auto *ConstMask = dyn_cast<Constant>(Mask);
|
||||
if (!ConstMask)
|
||||
return false;
|
||||
if (ConstMask->isNullValue() || isa<UndefValue>(ConstMask))
|
||||
return true;
|
||||
for (unsigned I = 0, E = ConstMask->getType()->getVectorNumElements(); I != E;
|
||||
++I) {
|
||||
if (auto *MaskElt = ConstMask->getAggregateElement(I))
|
||||
if (MaskElt->isNullValue() || isa<UndefValue>(MaskElt))
|
||||
continue;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static Value *simplifyUnaryIntrinsic(Function *F, Value *Op0,
|
||||
const SimplifyQuery &Q) {
|
||||
// Idempotent functions return the same result when called repeatedly.
|
||||
|
|
|
@ -715,6 +715,52 @@ Value *llvm::concatenateVectors(IRBuilder<> &Builder, ArrayRef<Value *> Vecs) {
|
|||
return ResList[0];
|
||||
}
|
||||
|
||||
bool llvm::maskIsAllZeroOrUndef(Value *Mask) {
|
||||
auto *ConstMask = dyn_cast<Constant>(Mask);
|
||||
if (!ConstMask)
|
||||
return false;
|
||||
if (ConstMask->isNullValue() || isa<UndefValue>(ConstMask))
|
||||
return true;
|
||||
for (unsigned I = 0, E = ConstMask->getType()->getVectorNumElements(); I != E;
|
||||
++I) {
|
||||
if (auto *MaskElt = ConstMask->getAggregateElement(I))
|
||||
if (MaskElt->isNullValue() || isa<UndefValue>(MaskElt))
|
||||
continue;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool llvm::maskIsAllOneOrUndef(Value *Mask) {
|
||||
auto *ConstMask = dyn_cast<Constant>(Mask);
|
||||
if (!ConstMask)
|
||||
return false;
|
||||
if (ConstMask->isAllOnesValue() || isa<UndefValue>(ConstMask))
|
||||
return true;
|
||||
for (unsigned I = 0, E = ConstMask->getType()->getVectorNumElements(); I != E;
|
||||
++I) {
|
||||
if (auto *MaskElt = ConstMask->getAggregateElement(I))
|
||||
if (MaskElt->isAllOnesValue() || isa<UndefValue>(MaskElt))
|
||||
continue;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/// TODO: This is a lot like known bits, but for
|
||||
/// vectors. Is there something we can common this with?
|
||||
APInt llvm::possiblyDemandedEltsInMask(Value *Mask) {
|
||||
|
||||
const unsigned VWidth = cast<VectorType>(Mask->getType())->getNumElements();
|
||||
APInt DemandedElts = APInt::getAllOnesValue(VWidth);
|
||||
if (auto *CV = dyn_cast<ConstantVector>(Mask))
|
||||
for (unsigned i = 0; i < VWidth; i++)
|
||||
if (CV->getAggregateElement(i)->isNullValue())
|
||||
DemandedElts.clearBit(i);
|
||||
return DemandedElts;
|
||||
}
|
||||
|
||||
bool InterleavedAccessInfo::isStrided(int Stride) {
|
||||
unsigned Factor = std::abs(Stride);
|
||||
return Factor >= 2 && Factor <= MaxInterleaveGroupFactor;
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
#include "llvm/Analysis/Loads.h"
|
||||
#include "llvm/Analysis/InstructionSimplify.h"
|
||||
#include "llvm/Analysis/MemoryBuiltins.h"
|
||||
#include "llvm/Transforms/Utils/Local.h"
|
||||
#include "llvm/Analysis/ValueTracking.h"
|
||||
#include "llvm/Analysis/VectorUtils.h"
|
||||
#include "llvm/IR/Attributes.h"
|
||||
|
@ -58,6 +57,7 @@
|
|||
#include "llvm/Support/MathExtras.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
#include "llvm/Transforms/InstCombine/InstCombineWorklist.h"
|
||||
#include "llvm/Transforms/Utils/Local.h"
|
||||
#include "llvm/Transforms/Utils/SimplifyLibCalls.h"
|
||||
#include <algorithm>
|
||||
#include <cassert>
|
||||
|
@ -1147,36 +1147,6 @@ static Value *simplifyX86vpermv(const IntrinsicInst &II,
|
|||
return Builder.CreateShuffleVector(V1, V2, ShuffleMask);
|
||||
}
|
||||
|
||||
static bool maskIsAllOneOrUndef(Value *Mask) {
|
||||
auto *ConstMask = dyn_cast<Constant>(Mask);
|
||||
if (!ConstMask)
|
||||
return false;
|
||||
if (ConstMask->isAllOnesValue() || isa<UndefValue>(ConstMask))
|
||||
return true;
|
||||
for (unsigned I = 0, E = ConstMask->getType()->getVectorNumElements(); I != E;
|
||||
++I) {
|
||||
if (auto *MaskElt = ConstMask->getAggregateElement(I))
|
||||
if (MaskElt->isAllOnesValue() || isa<UndefValue>(MaskElt))
|
||||
continue;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/// Given a mask vector <Y x i1>, return an APInt (of bitwidth Y) for each lane
|
||||
/// which may be active. TODO: This is a lot like known bits, but for
|
||||
/// vectors. Is there something we can common this with?
|
||||
static APInt possiblyDemandedEltsInMask(Value *Mask) {
|
||||
|
||||
const unsigned VWidth = cast<VectorType>(Mask->getType())->getNumElements();
|
||||
APInt DemandedElts = APInt::getAllOnesValue(VWidth);
|
||||
if (auto *CV = dyn_cast<ConstantVector>(Mask))
|
||||
for (unsigned i = 0; i < VWidth; i++)
|
||||
if (CV->getAggregateElement(i)->isNullValue())
|
||||
DemandedElts.clearBit(i);
|
||||
return DemandedElts;
|
||||
}
|
||||
|
||||
// TODO, Obvious Missing Transforms:
|
||||
// * Narrow width by halfs excluding zero/undef lanes
|
||||
Value *InstCombiner::simplifyMaskedLoad(IntrinsicInst &II) {
|
||||
|
|
Loading…
Reference in New Issue