add support for codegen of an OCUVectorComponent as an lvalue.

We can now codegen:

  vec4.xy;

as nothing!



git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@40769 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/CodeGen/CodeGenFunction.h b/CodeGen/CodeGenFunction.h
index d82c787..37614e9 100644
--- a/CodeGen/CodeGenFunction.h
+++ b/CodeGen/CodeGenFunction.h
@@ -54,6 +54,7 @@
   class BinaryOperator;
   class CompoundAssignOperator;
   class ArraySubscriptExpr;
+  class OCUVectorComponent;
   class ConditionalOperator;
   class PreDefinedExpr;
   
@@ -116,26 +117,35 @@
   // alignment?
   
   enum {
-    Simple,    // This is a normal l-value, use getAddress().
-    VectorElt, // This is a vector element l-value (V[i]), use getVector*
-    BitField   // This is a bitfield l-value, use getBitfield*.
+    Simple,       // This is a normal l-value, use getAddress().
+    VectorElt,    // This is a vector element l-value (V[i]), use getVector*
+    BitField,     // This is a bitfield l-value, use getBitfield*.
+    OCUVectorComp // This is an ocu vector subset, use getOCUVectorComp
   } LVType;
   
   llvm::Value *V;
   
   union {
-    llvm::Value *VectorIdx;
+    llvm::Value *VectorIdx;   // Index into a vector subscript: V[i]
+    unsigned VectorComp;      // Encoded OCUVector element subset: V.xyx
   };
 public:
   bool isSimple() const { return LVType == Simple; }
   bool isVectorElt() const { return LVType == VectorElt; }
   bool isBitfield() const { return LVType == BitField; }
+  bool isOCUVectorComp() const { return LVType == OCUVectorComp; }
   
   // simple lvalue
   llvm::Value *getAddress() const { assert(isSimple()); return V; }
   // vector elt lvalue
   llvm::Value *getVectorAddr() const { assert(isVectorElt()); return V; }
   llvm::Value *getVectorIdx() const { assert(isVectorElt()); return VectorIdx; }
+  // ocu vector components.
+  unsigned getOCUVectorComp() const {
+    assert(isOCUVectorComp());
+    return VectorComp;
+  }
+  
   
   static LValue MakeAddr(llvm::Value *V) {
     LValue R;
@@ -152,6 +162,13 @@
     return R;
   }
   
+  static LValue MakeOCUVectorComp(llvm::Value *Vec, unsigned Components) {
+    LValue R;
+    R.LVType = VectorElt;
+    R.V = Vec;
+    R.VectorComp = Components;
+    return R;
+  }
 };
 
 /// CodeGenFunction - This class organizes the per-function state that is used
@@ -309,6 +326,7 @@
   LValue EmitPreDefinedLValue(const PreDefinedExpr *E);
   LValue EmitUnaryOpLValue(const UnaryOperator *E);
   LValue EmitArraySubscriptExpr(const ArraySubscriptExpr *E);
+  LValue EmitOCUVectorComponentExpr(const OCUVectorComponent *E);
     
   //===--------------------------------------------------------------------===//
   //                             Expression Emission