diff options
| author | Chris Lattner <sabre@nondot.org> | 2011-07-09 18:23:52 +0000 | 
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2011-07-09 18:23:52 +0000 | 
| commit | 887ecac2b405a3a5d588a8aa59b081216adb150d (patch) | |
| tree | 2c198a77bf73950900af6082711945f82f289c28 /llvm | |
| parent | 822d96bb83ad850c593abedfe026d3432e42b0ed (diff) | |
| download | bcm5719-llvm-887ecac2b405a3a5d588a8aa59b081216adb150d.tar.gz bcm5719-llvm-887ecac2b405a3a5d588a8aa59b081216adb150d.zip  | |
the various ConstantExpr::get*Ty methods existed to work with issues around
type refinement.  Zap them now that type refinement is toast.
llvm-svn: 134837
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/include/llvm/Constants.h | 37 | ||||
| -rw-r--r-- | llvm/lib/VMCore/Constants.cpp | 235 | 
2 files changed, 94 insertions, 178 deletions
diff --git a/llvm/include/llvm/Constants.h b/llvm/include/llvm/Constants.h index 3f0efd9cee0..db952177968 100644 --- a/llvm/include/llvm/Constants.h +++ b/llvm/include/llvm/Constants.h @@ -640,35 +640,6 @@ protected:      setValueSubclassData(Opcode);    } -  // These private methods are used by the type resolution code to create -  // ConstantExprs in intermediate forms. -  static Constant *getTy(const Type *Ty, unsigned Opcode, -                         Constant *C1, Constant *C2, -                         unsigned Flags = 0); -  static Constant *getCompareTy(unsigned short pred, Constant *C1, -                                Constant *C2); -  static Constant *getSelectTy(const Type *Ty, -                               Constant *C1, Constant *C2, Constant *C3); -  template<typename IndexTy> -  static Constant *getGetElementPtrTy(const Type *Ty, Constant *C, -                                      IndexTy const *Idxs, unsigned NumIdxs, -                                      bool InBounds); -  static Constant *getExtractElementTy(const Type *Ty, Constant *Val, -                                       Constant *Idx); -  static Constant *getInsertElementTy(const Type *Ty, Constant *Val, -                                      Constant *Elt, Constant *Idx); -  static Constant *getShuffleVectorTy(const Type *Ty, Constant *V1, -                                      Constant *V2, Constant *Mask); -  static Constant *getExtractValueTy(const Type *Ty, Constant *Agg, -                                     const unsigned *Idxs, unsigned NumIdxs); -  static Constant *getInsertValueTy(const Type *Ty, Constant *Agg, -                                    Constant *Val, -                                    const unsigned *Idxs, unsigned NumIdxs); -  template<typename IndexTy> -  static Constant *getGetElementPtrImpl(Constant *C, -                                        IndexTy const *IdxList, -                                        unsigned NumIdx, bool InBounds); -  public:    // Static methods to construct a ConstantExpr of different kinds.  Note that    // these methods may return a object that is not an instance of the @@ -839,9 +810,7 @@ public:    /// Select constant expr    /// -  static Constant *getSelect(Constant *C, Constant *V1, Constant *V2) { -    return getSelectTy(V1->getType(), C, V1, V2); -  } +  static Constant *getSelect(Constant *C, Constant *V1, Constant *V2);    /// get - Return a binary or shift operator constant expression,    /// folding if possible. @@ -863,7 +832,9 @@ public:    ///    static Constant *getGetElementPtr(Constant *C,                                      Constant *const *IdxList, unsigned NumIdx, -                                    bool InBounds = false); +                                    bool InBounds = false) { +    return getGetElementPtr(C, (Value**)IdxList, NumIdx, InBounds); +  }    static Constant *getGetElementPtr(Constant *C,                                      Value *const *IdxList, unsigned NumIdx,                                      bool InBounds = false); diff --git a/llvm/lib/VMCore/Constants.cpp b/llvm/lib/VMCore/Constants.cpp index d3361ccfc4d..324a7607174 100644 --- a/llvm/lib/VMCore/Constants.cpp +++ b/llvm/lib/VMCore/Constants.cpp @@ -1421,49 +1421,15 @@ Constant *ConstantExpr::getBitCast(Constant *C, const Type *DstTy) {    return getFoldedCast(Instruction::BitCast, C, DstTy);  } -Constant *ConstantExpr::getTy(const Type *ReqTy, unsigned Opcode, -                              Constant *C1, Constant *C2, -                              unsigned Flags) { -  // Check the operands for consistency first +Constant *ConstantExpr::get(unsigned Opcode, Constant *C1, Constant *C2, +                            unsigned Flags) { +  // Check the operands for consistency first.    assert(Opcode >= Instruction::BinaryOpsBegin &&           Opcode <  Instruction::BinaryOpsEnd   &&           "Invalid opcode in binary constant expression");    assert(C1->getType() == C2->getType() &&           "Operand types in binary constant expression should match"); - -  if (ReqTy == C1->getType() || ReqTy == Type::getInt1Ty(ReqTy->getContext())) -    if (Constant *FC = ConstantFoldBinaryInstruction(Opcode, C1, C2)) -      return FC;          // Fold a few common cases... - -  std::vector<Constant*> argVec(1, C1); argVec.push_back(C2); -  ExprMapKeyType Key(Opcode, argVec, 0, Flags); -  LLVMContextImpl *pImpl = ReqTy->getContext().pImpl; -  return pImpl->ExprConstants.getOrCreate(ReqTy, Key); -} - -Constant *ConstantExpr::getCompareTy(unsigned short predicate, -                                     Constant *C1, Constant *C2) { -  switch (predicate) { -    default: llvm_unreachable("Invalid CmpInst predicate"); -    case CmpInst::FCMP_FALSE: case CmpInst::FCMP_OEQ: case CmpInst::FCMP_OGT: -    case CmpInst::FCMP_OGE:   case CmpInst::FCMP_OLT: case CmpInst::FCMP_OLE: -    case CmpInst::FCMP_ONE:   case CmpInst::FCMP_ORD: case CmpInst::FCMP_UNO: -    case CmpInst::FCMP_UEQ:   case CmpInst::FCMP_UGT: case CmpInst::FCMP_UGE: -    case CmpInst::FCMP_ULT:   case CmpInst::FCMP_ULE: case CmpInst::FCMP_UNE: -    case CmpInst::FCMP_TRUE: -      return getFCmp(predicate, C1, C2); - -    case CmpInst::ICMP_EQ:  case CmpInst::ICMP_NE:  case CmpInst::ICMP_UGT: -    case CmpInst::ICMP_UGE: case CmpInst::ICMP_ULT: case CmpInst::ICMP_ULE: -    case CmpInst::ICMP_SGT: case CmpInst::ICMP_SGE: case CmpInst::ICMP_SLT: -    case CmpInst::ICMP_SLE: -      return getICmp(predicate, C1, C2); -  } -} - -Constant *ConstantExpr::get(unsigned Opcode, Constant *C1, Constant *C2, -                            unsigned Flags) {  #ifndef NDEBUG    switch (Opcode) {    case Instruction::Add: @@ -1522,7 +1488,15 @@ Constant *ConstantExpr::get(unsigned Opcode, Constant *C1, Constant *C2,    }  #endif -  return getTy(C1->getType(), Opcode, C1, C2, Flags); +  if (Constant *FC = ConstantFoldBinaryInstruction(Opcode, C1, C2)) +    return FC;          // Fold a few common cases. +   +  std::vector<Constant*> argVec(1, C1); +  argVec.push_back(C2); +  ExprMapKeyType Key(Opcode, argVec, 0, Flags); +   +  LLVMContextImpl *pImpl = C1->getContext().pImpl; +  return pImpl->ExprConstants.getOrCreate(C1->getType(), Key);  }  Constant *ConstantExpr::getSizeOf(const Type* Ty) { @@ -1567,41 +1541,55 @@ Constant *ConstantExpr::getOffsetOf(const Type* Ty, Constant *FieldNo) {                       Type::getInt64Ty(Ty->getContext()));  } -Constant *ConstantExpr::getCompare(unsigned short pred,  -                            Constant *C1, Constant *C2) { +Constant *ConstantExpr::getCompare(unsigned short Predicate,  +                                   Constant *C1, Constant *C2) {    assert(C1->getType() == C2->getType() && "Op types should be identical!"); -  return getCompareTy(pred, C1, C2); +   +  switch (Predicate) { +  default: llvm_unreachable("Invalid CmpInst predicate"); +  case CmpInst::FCMP_FALSE: case CmpInst::FCMP_OEQ: case CmpInst::FCMP_OGT: +  case CmpInst::FCMP_OGE:   case CmpInst::FCMP_OLT: case CmpInst::FCMP_OLE: +  case CmpInst::FCMP_ONE:   case CmpInst::FCMP_ORD: case CmpInst::FCMP_UNO: +  case CmpInst::FCMP_UEQ:   case CmpInst::FCMP_UGT: case CmpInst::FCMP_UGE: +  case CmpInst::FCMP_ULT:   case CmpInst::FCMP_ULE: case CmpInst::FCMP_UNE: +  case CmpInst::FCMP_TRUE: +    return getFCmp(Predicate, C1, C2); +     +  case CmpInst::ICMP_EQ:  case CmpInst::ICMP_NE:  case CmpInst::ICMP_UGT: +  case CmpInst::ICMP_UGE: case CmpInst::ICMP_ULT: case CmpInst::ICMP_ULE: +  case CmpInst::ICMP_SGT: case CmpInst::ICMP_SGE: case CmpInst::ICMP_SLT: +  case CmpInst::ICMP_SLE: +    return getICmp(Predicate, C1, C2); +  }  } -Constant *ConstantExpr::getSelectTy(const Type *ReqTy, Constant *C, -                                    Constant *V1, Constant *V2) { +Constant *ConstantExpr::getSelect(Constant *C, Constant *V1, Constant *V2) {    assert(!SelectInst::areInvalidOperands(C, V1, V2)&&"Invalid select operands"); -  if (ReqTy == V1->getType()) -    if (Constant *SC = ConstantFoldSelectInstruction(C, V1, V2)) -      return SC;        // Fold common cases +  if (Constant *SC = ConstantFoldSelectInstruction(C, V1, V2)) +    return SC;        // Fold common cases    std::vector<Constant*> argVec(3, C);    argVec[1] = V1;    argVec[2] = V2;    ExprMapKeyType Key(Instruction::Select, argVec); -  LLVMContextImpl *pImpl = ReqTy->getContext().pImpl; -  return pImpl->ExprConstants.getOrCreate(ReqTy, Key); +  LLVMContextImpl *pImpl = C->getContext().pImpl; +  return pImpl->ExprConstants.getOrCreate(V1->getType(), Key);  } -template<typename IndexTy> -Constant *ConstantExpr::getGetElementPtrTy(const Type *ReqTy, Constant *C, -                                           IndexTy const *Idxs, -                                           unsigned NumIdx, bool InBounds) { -  assert(GetElementPtrInst::getIndexedType(C->getType(), Idxs, -                                           Idxs+NumIdx) == -         cast<PointerType>(ReqTy)->getElementType() && -         "GEP indices invalid!"); - +Constant *ConstantExpr::getGetElementPtr(Constant *C, Value* const *Idxs, +                                         unsigned NumIdx, bool InBounds) {    if (Constant *FC = ConstantFoldGetElementPtr(C, InBounds, Idxs, NumIdx))      return FC;          // Fold a few common cases. +  // Get the result type of the getelementptr! +  const Type *Ty =  +    GetElementPtrInst::getIndexedType(C->getType(), Idxs, Idxs+NumIdx); +  assert(Ty && "GEP indices invalid!"); +  unsigned AS = cast<PointerType>(C->getType())->getAddressSpace(); +  Type *ReqTy = Ty->getPointerTo(AS); +      assert(C->getType()->isPointerTy() &&           "Non-pointer type for constant GetElementPtr expression");    // Look up the constant in the table first to ensure uniqueness @@ -1612,32 +1600,11 @@ Constant *ConstantExpr::getGetElementPtrTy(const Type *ReqTy, Constant *C,      ArgVec.push_back(cast<Constant>(Idxs[i]));    const ExprMapKeyType Key(Instruction::GetElementPtr, ArgVec, 0,                             InBounds ? GEPOperator::IsInBounds : 0); - -  LLVMContextImpl *pImpl = ReqTy->getContext().pImpl; +   +  LLVMContextImpl *pImpl = C->getContext().pImpl;    return pImpl->ExprConstants.getOrCreate(ReqTy, Key);  } -template<typename IndexTy> -Constant *ConstantExpr::getGetElementPtrImpl(Constant *C, IndexTy const *Idxs, -                                             unsigned NumIdx, bool InBounds) { -  // Get the result type of the getelementptr! -  const Type *Ty =  -    GetElementPtrInst::getIndexedType(C->getType(), Idxs, Idxs+NumIdx); -  assert(Ty && "GEP indices invalid!"); -  unsigned As = cast<PointerType>(C->getType())->getAddressSpace(); -  return getGetElementPtrTy(PointerType::get(Ty, As), C, Idxs, NumIdx,InBounds); -} - -Constant *ConstantExpr::getGetElementPtr(Constant *C, Value* const *Idxs, -                                         unsigned NumIdx, bool InBounds) { -  return getGetElementPtrImpl(C, Idxs, NumIdx, InBounds); -} - -Constant *ConstantExpr::getGetElementPtr(Constant *C, Constant *const *Idxs, -                                         unsigned NumIdx, bool InBounds) { -  return getGetElementPtrImpl(C, Idxs, NumIdx, InBounds); -} -  Constant *  ConstantExpr::getICmp(unsigned short pred, Constant *LHS, Constant *RHS) {    assert(LHS->getType() == RHS->getType()); @@ -1685,39 +1652,22 @@ ConstantExpr::getFCmp(unsigned short pred, Constant *LHS, Constant *RHS) {    return pImpl->ExprConstants.getOrCreate(ResultTy, Key);  } -Constant *ConstantExpr::getExtractElementTy(const Type *ReqTy, Constant *Val, -                                            Constant *Idx) { -  if (Constant *FC = ConstantFoldExtractElementInstruction(Val, Idx)) -    return FC;          // Fold a few common cases. -  // Look up the constant in the table first to ensure uniqueness -  std::vector<Constant*> ArgVec(1, Val); -  ArgVec.push_back(Idx); -  const ExprMapKeyType Key(Instruction::ExtractElement,ArgVec); -   -  LLVMContextImpl *pImpl = ReqTy->getContext().pImpl; -  return pImpl->ExprConstants.getOrCreate(ReqTy, Key); -} -  Constant *ConstantExpr::getExtractElement(Constant *Val, Constant *Idx) {    assert(Val->getType()->isVectorTy() &&           "Tried to create extractelement operation on non-vector type!");    assert(Idx->getType()->isIntegerTy(32) &&           "Extractelement index must be i32 type!"); -  return getExtractElementTy(cast<VectorType>(Val->getType())->getElementType(), -                             Val, Idx); -} - -Constant *ConstantExpr::getInsertElementTy(const Type *ReqTy, Constant *Val, -                                           Constant *Elt, Constant *Idx) { -  if (Constant *FC = ConstantFoldInsertElementInstruction(Val, Elt, Idx)) +   +  if (Constant *FC = ConstantFoldExtractElementInstruction(Val, Idx))      return FC;          // Fold a few common cases. +      // Look up the constant in the table first to ensure uniqueness    std::vector<Constant*> ArgVec(1, Val); -  ArgVec.push_back(Elt);    ArgVec.push_back(Idx); -  const ExprMapKeyType Key(Instruction::InsertElement,ArgVec); +  const ExprMapKeyType Key(Instruction::ExtractElement,ArgVec); -  LLVMContextImpl *pImpl = ReqTy->getContext().pImpl; +  LLVMContextImpl *pImpl = Val->getContext().pImpl; +  Type *ReqTy = cast<VectorType>(Val->getType())->getElementType();    return pImpl->ExprConstants.getOrCreate(ReqTy, Key);  } @@ -1729,21 +1679,17 @@ Constant *ConstantExpr::getInsertElement(Constant *Val, Constant *Elt,           && "Insertelement types must match!");    assert(Idx->getType()->isIntegerTy(32) &&           "Insertelement index must be i32 type!"); -  return getInsertElementTy(Val->getType(), Val, Elt, Idx); -} -Constant *ConstantExpr::getShuffleVectorTy(const Type *ReqTy, Constant *V1, -                                           Constant *V2, Constant *Mask) { -  if (Constant *FC = ConstantFoldShuffleVectorInstruction(V1, V2, Mask)) -    return FC;          // Fold a few common cases... +  if (Constant *FC = ConstantFoldInsertElementInstruction(Val, Elt, Idx)) +    return FC;          // Fold a few common cases.    // Look up the constant in the table first to ensure uniqueness -  std::vector<Constant*> ArgVec(1, V1); -  ArgVec.push_back(V2); -  ArgVec.push_back(Mask); -  const ExprMapKeyType Key(Instruction::ShuffleVector,ArgVec); +  std::vector<Constant*> ArgVec(1, Val); +  ArgVec.push_back(Elt); +  ArgVec.push_back(Idx); +  const ExprMapKeyType Key(Instruction::InsertElement,ArgVec); -  LLVMContextImpl *pImpl = ReqTy->getContext().pImpl; -  return pImpl->ExprConstants.getOrCreate(ReqTy, Key); +  LLVMContextImpl *pImpl = Val->getContext().pImpl; +  return pImpl->ExprConstants.getOrCreate(Val->getType(), Key);  }  Constant *ConstantExpr::getShuffleVector(Constant *V1, Constant *V2,  @@ -1751,62 +1697,61 @@ Constant *ConstantExpr::getShuffleVector(Constant *V1, Constant *V2,    assert(ShuffleVectorInst::isValidOperands(V1, V2, Mask) &&           "Invalid shuffle vector constant expr operands!"); +  if (Constant *FC = ConstantFoldShuffleVectorInstruction(V1, V2, Mask)) +    return FC;          // Fold a few common cases. +    unsigned NElts = cast<VectorType>(Mask->getType())->getNumElements();    const Type *EltTy = cast<VectorType>(V1->getType())->getElementType();    const Type *ShufTy = VectorType::get(EltTy, NElts); -  return getShuffleVectorTy(ShufTy, V1, V2, Mask); -} -Constant *ConstantExpr::getInsertValueTy(const Type *ReqTy, Constant *Agg, -                                         Constant *Val, -                                        const unsigned *Idxs, unsigned NumIdx) { -  assert(ExtractValueInst::getIndexedType(Agg->getType(), Idxs, -                                          Idxs+NumIdx) == Val->getType() && -         "insertvalue indices invalid!"); -  assert(Agg->getType() == ReqTy && -         "insertvalue type invalid!"); -  assert(Agg->getType()->isFirstClassType() && -         "Non-first-class type for constant InsertValue expression"); -  Constant *FC = ConstantFoldInsertValueInstruction(Agg, Val, Idxs, NumIdx); -  assert(FC && "InsertValue constant expr couldn't be folded!"); -  return FC; +  // Look up the constant in the table first to ensure uniqueness +  std::vector<Constant*> ArgVec(1, V1); +  ArgVec.push_back(V2); +  ArgVec.push_back(Mask); +  const ExprMapKeyType Key(Instruction::ShuffleVector,ArgVec); +   +  LLVMContextImpl *pImpl = ShufTy->getContext().pImpl; +  return pImpl->ExprConstants.getOrCreate(ShufTy, Key);  }  Constant *ConstantExpr::getInsertValue(Constant *Agg, Constant *Val, -                                     const unsigned *IdxList, unsigned NumIdx) { +                                     const unsigned *Idxs, unsigned NumIdx) {    assert(Agg->getType()->isFirstClassType() &&           "Tried to create insertelement operation on non-first-class type!");    const Type *ReqTy = Agg->getType();  #ifndef NDEBUG    const Type *ValTy = -    ExtractValueInst::getIndexedType(Agg->getType(), IdxList, IdxList+NumIdx); -#endif +    ExtractValueInst::getIndexedType(Agg->getType(), Idxs, Idxs+NumIdx);    assert(ValTy == Val->getType() && "insertvalue indices invalid!"); -  return getInsertValueTy(ReqTy, Agg, Val, IdxList, NumIdx); -} +#endif -Constant *ConstantExpr::getExtractValueTy(const Type *ReqTy, Constant *Agg, -                                        const unsigned *Idxs, unsigned NumIdx) {    assert(ExtractValueInst::getIndexedType(Agg->getType(), Idxs, -                                          Idxs+NumIdx) == ReqTy && -         "extractvalue indices invalid!"); +                                          Idxs+NumIdx) == Val->getType() && +         "insertvalue indices invalid!"); +  assert(Agg->getType() == ReqTy && +         "insertvalue type invalid!");    assert(Agg->getType()->isFirstClassType() && -         "Non-first-class type for constant extractvalue expression"); -  Constant *FC = ConstantFoldExtractValueInstruction(Agg, Idxs, NumIdx); -  assert(FC && "ExtractValue constant expr couldn't be folded!"); +         "Non-first-class type for constant InsertValue expression"); +  Constant *FC = ConstantFoldInsertValueInstruction(Agg, Val, Idxs, NumIdx); +  assert(FC && "InsertValue constant expr couldn't be folded!");    return FC;  }  Constant *ConstantExpr::getExtractValue(Constant *Agg, -                                     const unsigned *IdxList, unsigned NumIdx) { +                                     const unsigned *Idxs, unsigned NumIdx) {    assert(Agg->getType()->isFirstClassType() &&           "Tried to create extractelement operation on non-first-class type!");    const Type *ReqTy = -    ExtractValueInst::getIndexedType(Agg->getType(), IdxList, IdxList+NumIdx); +    ExtractValueInst::getIndexedType(Agg->getType(), Idxs, Idxs+NumIdx);    assert(ReqTy && "extractvalue indices invalid!"); -  return getExtractValueTy(ReqTy, Agg, IdxList, NumIdx); +   +  assert(Agg->getType()->isFirstClassType() && +         "Non-first-class type for constant extractvalue expression"); +  Constant *FC = ConstantFoldExtractValueInstruction(Agg, Idxs, NumIdx); +  assert(FC && "ExtractValue constant expr couldn't be folded!"); +  return FC;  }  Constant *ConstantExpr::getNeg(Constant *C, bool HasNUW, bool HasNSW) {  | 

