Add support for scalar-returning element accesses like V.x


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@40777 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/CodeGen/CGExpr.cpp b/CodeGen/CGExpr.cpp
index 7d8dc8c..178107e 100644
--- a/CodeGen/CGExpr.cpp
+++ b/CodeGen/CGExpr.cpp
@@ -287,13 +287,23 @@
   // shuffle the input or extract/insert them as appropriate.
   if (LV.isOCUVectorComp()) {
     llvm::Value *Vec = Builder.CreateLoad(LV.getOCUVectorAddr(), "tmp");
+
+    unsigned EncFields = LV.getOCUVectorComp();
+
+    // If the result of the expression is a non-vector type, we must be
+    // extracting a single element.  Just codegen as an extractelement.
+    if (!isa<VectorType>(ExprType)) {
+      unsigned InIdx = OCUVectorComponent::getAccessedFieldNo(0, EncFields);
+      llvm::Value *Elt = llvm::ConstantInt::get(llvm::Type::Int32Ty, InIdx);
+      return RValue::get(Builder.CreateExtractElement(Vec, Elt, "tmp"));
+    }
+    
+    
     unsigned NumElts = cast<VectorType>(ExprType)->getNumElements();
     
     // Start out with an undef of the result type.
     llvm::Value *Result = llvm::UndefValue::get(ConvertType(ExprType));
     
-    unsigned EncFields = LV.getOCUVectorComp();
-    
     // Extract/Insert each element of the result.
     for (unsigned i = 0; i != NumElts; ++i) {
       unsigned InIdx = OCUVectorComponent::getAccessedFieldNo(i, EncFields);