From: Nate Begeman Date: Tue, 13 May 2008 21:03:02 +0000 (+0000) Subject: Remove AST dependency on VMCore by switching ExtVectorElementExpr off Constant. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3b8d116703db8018f855cbb4733ace426422623b;p=clang Remove AST dependency on VMCore by switching ExtVectorElementExpr off Constant. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@51068 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/Expr.h b/include/clang/AST/Expr.h index 05238f9062..c426598931 100644 --- a/include/clang/AST/Expr.h +++ b/include/clang/AST/Expr.h @@ -21,10 +21,9 @@ #include "clang/Basic/IdentifierTable.h" #include "llvm/ADT/APSInt.h" #include "llvm/ADT/APFloat.h" +#include "llvm/ADT/SmallVector.h" #include -class llvm::Constant; - namespace clang { class IdentifierInfo; class Selector; @@ -722,12 +721,11 @@ public: /// getEncodedElementAccess - Encode the elements accessed into an llvm /// aggregate Constant of ConstantInt(s). - llvm::Constant *getEncodedElementAccess() const; + void getEncodedElementAccess(llvm::SmallVectorImpl &Elts) const; /// getAccessedFieldNo - Given an encoded value and a result number, return /// the input field number being accessed. - static unsigned getAccessedFieldNo(unsigned Idx, - const llvm::Constant *Elts); + static unsigned getAccessedFieldNo(unsigned Idx, const llvm::Constant *Elts); virtual SourceRange getSourceRange() const { return SourceRange(getBase()->getLocStart(), AccessorLoc); diff --git a/lib/AST/Expr.cpp b/lib/AST/Expr.cpp index 61c21b0675..2ac30b4c8c 100644 --- a/lib/AST/Expr.cpp +++ b/lib/AST/Expr.cpp @@ -1057,9 +1057,9 @@ bool ExtVectorElementExpr::containsDuplicateElements() const { } /// getEncodedElementAccess - We encode the fields as a llvm ConstantArray. -llvm::Constant *ExtVectorElementExpr::getEncodedElementAccess() const { +void ExtVectorElementExpr::getEncodedElementAccess( + llvm::SmallVectorImpl &Elts) const { const char *compStr = Accessor.getName(); - llvm::SmallVector Indices; bool isHi = !strcmp(compStr, "hi"); bool isLo = !strcmp(compStr, "lo"); @@ -1080,9 +1080,8 @@ llvm::Constant *ExtVectorElementExpr::getEncodedElementAccess() const { else Index = ExtVectorType::getAccessorIdx(compStr[i]); - Indices.push_back(llvm::ConstantInt::get(llvm::Type::Int32Ty, Index)); + Elts.push_back(Index); } - return llvm::ConstantVector::get(&Indices[0], Indices.size()); } unsigned diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index 043cfa1d50..addd939348 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -456,33 +456,42 @@ LValue CodeGenFunction::EmitArraySubscriptExpr(const ArraySubscriptExpr *E) { return LValue::MakeAddr(Builder.CreateGEP(Base, Idx, "arrayidx")); } +static +llvm::Constant *GenerateConstantVector(llvm::SmallVector &Elts) { + llvm::SmallVector CElts; + + for (unsigned i = 0, e = Elts.size(); i != e; ++i) + CElts.push_back(llvm::ConstantInt::get(llvm::Type::Int32Ty, Elts[i])); + + return llvm::ConstantVector::get(&CElts[0], CElts.size()); +} + LValue CodeGenFunction:: EmitExtVectorElementExpr(const ExtVectorElementExpr *E) { // Emit the base vector as an l-value. LValue Base = EmitLValue(E->getBase()); - - if (Base.isExtVectorElt()) { - llvm::Constant *BaseElts = Base.getExtVectorElts(); - llvm::Constant *ExprElts = E->getEncodedElementAccess(); - - llvm::SmallVector Indices; - - for (unsigned i = 0, e = E->getNumElements(); i != e; ++i) { - unsigned Idx = ExtVectorElementExpr::getAccessedFieldNo(i, ExprElts); - - if (isa(BaseElts)) - Indices.push_back(llvm::ConstantInt::get(llvm::Type::Int32Ty, 0)); - else - Indices.push_back(cast(BaseElts->getOperand(Idx))); - } - llvm::Constant *NewElts = llvm::ConstantVector::get(&Indices[0], Indices.size()); - return LValue::MakeExtVectorElt(Base.getExtVectorAddr(), NewElts); + + // Encode the element access list into a vector of unsigned indices. + llvm::SmallVector Indices; + E->getEncodedElementAccess(Indices); + + if (Base.isSimple()) { + llvm::Constant *CV = GenerateConstantVector(Indices); + return LValue::MakeExtVectorElt(Base.getAddress(), CV); } - - assert(Base.isSimple() && "Can only subscript lvalue vectors here!"); + assert(Base.isExtVectorElt() && "Can only subscript lvalue vec elts here!"); + + llvm::Constant *BaseElts = Base.getExtVectorElts(); + llvm::SmallVector CElts; - return LValue::MakeExtVectorElt(Base.getAddress(), - E->getEncodedElementAccess()); + for (unsigned i = 0, e = Indices.size(); i != e; ++i) { + if (isa(BaseElts)) + CElts.push_back(llvm::ConstantInt::get(llvm::Type::Int32Ty, 0)); + else + CElts.push_back(BaseElts->getOperand(Indices[i])); + } + llvm::Constant *CV = llvm::ConstantVector::get(&CElts[0], CElts.size()); + return LValue::MakeExtVectorElt(Base.getExtVectorAddr(), CV); } LValue CodeGenFunction::EmitMemberExpr(const MemberExpr *E) {