aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGExpr.cpp
diff options
context:
space:
mode:
authorNate Begeman <natebegeman@mac.com>2008-05-13 21:03:02 +0000
committerNate Begeman <natebegeman@mac.com>2008-05-13 21:03:02 +0000
commit3b8d116703db8018f855cbb4733ace426422623b (patch)
tree4ed62dc8390ab93a3f018fbcba1fe87fdc0917f0 /lib/CodeGen/CGExpr.cpp
parent5773a6c4ab5a3a7aa9f089bfde3ca1c99ea674ac (diff)
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
Diffstat (limited to 'lib/CodeGen/CGExpr.cpp')
-rw-r--r--lib/CodeGen/CGExpr.cpp51
1 files changed, 30 insertions, 21 deletions
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<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) {