Fix Neon builtin pointer argument checking for "sret" builtins.

The code for checking Neon builtin pointer argument types was assuming that
there would only be one pointer argument.  But, for vld2-4 builtins, the first
argument is a special sret pointer where the result will be stored.  So,
instead of scanning all the arguments to find a pointer, have TableGen figure
out the index of the pointer argument that needs checking.  That's better than
scanning all the arguments regardless.  <rdar://problem/10448804>

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@144834 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Sema/SemaChecking.cpp b/lib/Sema/SemaChecking.cpp
index f4968f6..760b5f3 100644
--- a/lib/Sema/SemaChecking.cpp
+++ b/lib/Sema/SemaChecking.cpp
@@ -298,7 +298,7 @@
 
   unsigned mask = 0;
   unsigned TV = 0;
-  bool HasPtr = false;
+  int PtrArgNum = -1;
   bool HasConstPtr = false;
   switch (BuiltinID) {
 #define GET_NEON_OVERLOAD_CHECK
@@ -319,28 +319,24 @@
         << TheCall->getArg(ImmArg)->getSourceRange();
   }
 
-  if (HasPtr || HasConstPtr) {
+  if (PtrArgNum >= 0) {
     // Check that pointer arguments have the specified type.
-    for (unsigned ArgNo = 0; ArgNo < ImmArg; ++ArgNo) {
-      Expr *Arg = TheCall->getArg(ArgNo);
-      if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Arg))
-        Arg = ICE->getSubExpr();
-      ExprResult RHS = DefaultFunctionArrayLvalueConversion(Arg);
-      QualType RHSTy = RHS.get()->getType();
-      if (!RHSTy->isPointerType())
-        continue;
-      QualType EltTy = getNeonEltType(NeonTypeFlags(TV), Context);
-      if (HasConstPtr)
-        EltTy = EltTy.withConst();
-      QualType LHSTy = Context.getPointerType(EltTy);
-      AssignConvertType ConvTy;
-      ConvTy = CheckSingleAssignmentConstraints(LHSTy, RHS);
-      if (RHS.isInvalid())
-        return true;
-      if (DiagnoseAssignmentResult(ConvTy, Arg->getLocStart(), LHSTy, RHSTy,
-                                   RHS.get(), AA_Assigning))
-        return true;
-    }
+    Expr *Arg = TheCall->getArg(PtrArgNum);
+    if (ImplicitCastExpr *ICE = dyn_cast<ImplicitCastExpr>(Arg))
+      Arg = ICE->getSubExpr();
+    ExprResult RHS = DefaultFunctionArrayLvalueConversion(Arg);
+    QualType RHSTy = RHS.get()->getType();
+    QualType EltTy = getNeonEltType(NeonTypeFlags(TV), Context);
+    if (HasConstPtr)
+      EltTy = EltTy.withConst();
+    QualType LHSTy = Context.getPointerType(EltTy);
+    AssignConvertType ConvTy;
+    ConvTy = CheckSingleAssignmentConstraints(LHSTy, RHS);
+    if (RHS.isInvalid())
+      return true;
+    if (DiagnoseAssignmentResult(ConvTy, Arg->getLocStart(), LHSTy, RHSTy,
+                                 RHS.get(), AA_Assigning))
+      return true;
   }
   
   // For NEON intrinsics which take an immediate value as part of the