diff options
author | Nate Begeman <natebegeman@mac.com> | 2008-05-13 21:03:02 +0000 |
---|---|---|
committer | Nate Begeman <natebegeman@mac.com> | 2008-05-13 21:03:02 +0000 |
commit | d386215916b2919940a968bb64b964585f8c34b0 (patch) | |
tree | d778feeb8580ed5b900c3b4e03aeb56d0aa18404 /clang/lib | |
parent | bb3aef4ee35d189d652cf57ba01f9cf26dd2e2ef (diff) | |
download | bcm5719-llvm-d386215916b2919940a968bb64b964585f8c34b0.tar.gz bcm5719-llvm-d386215916b2919940a968bb64b964585f8c34b0.zip |
Remove AST dependency on VMCore by switching ExtVectorElementExpr off Constant.
llvm-svn: 51068
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/AST/Expr.cpp | 7 | ||||
-rw-r--r-- | clang/lib/CodeGen/CGExpr.cpp | 51 |
2 files changed, 33 insertions, 25 deletions
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index 61c21b06756..2ac30b4c8cb 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/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<unsigned> &Elts) const { const char *compStr = Accessor.getName(); - llvm::SmallVector<llvm::Constant *, 8> 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/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp index 043cfa1d507..addd9393485 100644 --- a/clang/lib/CodeGen/CGExpr.cpp +++ b/clang/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<unsigned, 4> &Elts) { + llvm::SmallVector<llvm::Constant *, 4> 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<llvm::Constant *, 8> Indices; - - for (unsigned i = 0, e = E->getNumElements(); i != e; ++i) { - unsigned Idx = ExtVectorElementExpr::getAccessedFieldNo(i, ExprElts); - - if (isa<llvm::ConstantAggregateZero>(BaseElts)) - Indices.push_back(llvm::ConstantInt::get(llvm::Type::Int32Ty, 0)); - else - Indices.push_back(cast<llvm::ConstantInt>(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<unsigned, 4> 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<llvm::Constant *, 4> CElts; - return LValue::MakeExtVectorElt(Base.getAddress(), - E->getEncodedElementAccess()); + for (unsigned i = 0, e = Indices.size(); i != e; ++i) { + if (isa<llvm::ConstantAggregateZero>(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) { |