]> granicus.if.org Git - clang/commitdiff
Add support for scalar-returning element accesses like V.x
authorChris Lattner <sabre@nondot.org>
Fri, 3 Aug 2007 15:52:31 +0000 (15:52 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 3 Aug 2007 15:52:31 +0000 (15:52 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@40777 91177308-0d34-0410-b5e6-96231b3b80d8

CodeGen/CGExpr.cpp

index 7d8dc8c33b9c8df77b1acd29dd4f7adfc2d15dba..178107e2eeae79afac5b7f707acbf3027c26767c 100644 (file)
@@ -287,13 +287,23 @@ RValue CodeGenFunction::EmitLoadOfLValue(LValue LV, QualType ExprType) {
   // 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);