Support evaluation of vector constant expressions, and codegen of same.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62455 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp
index 82c8ea0..cff01c6 100644
--- a/lib/Sema/SemaDecl.cpp
+++ b/lib/Sema/SemaDecl.cpp
@@ -2187,11 +2187,9 @@
 }
 
 bool Sema::CheckForConstantInitializer(Expr *Init, QualType DclT) {
-  Expr::EvalResult Result;
-
   Init = Init->IgnoreParens();
 
-  if (Init->Evaluate(Result, Context) && !Result.HasSideEffects)
+  if (Init->isEvaluatable(Context))
     return false;
 
   // Look through CXXDefaultArgExprs; they have no meaning in this context.
diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp
index 7d08132..2bc6ff2 100644
--- a/lib/Sema/SemaExpr.cpp
+++ b/lib/Sema/SemaExpr.cpp
@@ -2925,13 +2925,14 @@
     return lType;
   
   const VectorType *VTy = lType->getAsVectorType();
-
-  // FIXME: need to deal with non-32b int / non-64b long long
   unsigned TypeSize = Context.getTypeSize(VTy->getElementType());
-  if (TypeSize == 32) {
+  if (TypeSize == Context.getTypeSize(Context.IntTy))
     return Context.getExtVectorType(Context.IntTy, VTy->getNumElements());
-  }
-  assert(TypeSize == 64 && "Unhandled vector element size in vector compare");
+  else if (TypeSize == Context.getTypeSize(Context.LongTy))
+    return Context.getExtVectorType(Context.LongTy, VTy->getNumElements());
+
+  assert(TypeSize == Context.getTypeSize(Context.LongLongTy) && 
+         "Unhandled vector element size in vector compare");
   return Context.getExtVectorType(Context.LongLongTy, VTy->getNumElements());
 }