diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Analysis/InstructionSimplify.cpp | 16 | ||||
| -rw-r--r-- | llvm/lib/Analysis/VectorUtils.cpp | 46 | ||||
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp | 32 | 
3 files changed, 47 insertions, 47 deletions
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index 87e0df29bbd..4c358a052f8 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -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. diff --git a/llvm/lib/Analysis/VectorUtils.cpp b/llvm/lib/Analysis/VectorUtils.cpp index ef70e14da7f..f1a05ae5055 100644 --- a/llvm/lib/Analysis/VectorUtils.cpp +++ b/llvm/lib/Analysis/VectorUtils.cpp @@ -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; diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp index fbdc1b77821..c60e9d1c1cb 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -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) {  | 

