]> granicus.if.org Git - clang/commitdiff
Remove AST dependency on VMCore by switching ExtVectorElementExpr off Constant.
authorNate Begeman <natebegeman@mac.com>
Tue, 13 May 2008 21:03:02 +0000 (21:03 +0000)
committerNate Begeman <natebegeman@mac.com>
Tue, 13 May 2008 21:03:02 +0000 (21:03 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@51068 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/AST/Expr.h
lib/AST/Expr.cpp
lib/CodeGen/CGExpr.cpp

index 05238f906234d7fed05528fd9c90e56ca505ec0a..c4265989310246ca79a4c706faf015e8136fc2f4 100644 (file)
 #include "clang/Basic/IdentifierTable.h"
 #include "llvm/ADT/APSInt.h"
 #include "llvm/ADT/APFloat.h"
+#include "llvm/ADT/SmallVector.h"
 #include <vector>
 
-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<unsigned> &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);
index 61c21b06756922815624c5e2ea038b35b7d7ec76..2ac30b4c8cb1e16eb3d9be937be8ae47d8c2785e 100644 (file)
@@ -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 
index 043cfa1d507dcaf7a28c50a818c5d4deeb801dc0..addd93934856eda0579e609f8897444298030ea5 100644 (file)
@@ -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) {