[cfe-commits] r144834 - in /cfe/trunk: lib/Sema/SemaChecking.cpp utils/TableGen/NeonEmitter.cpp

Bob Wilson bob.wilson at apple.com
Wed Nov 16 13:32:23 PST 2011


Author: bwilson
Date: Wed Nov 16 15:32:23 2011
New Revision: 144834

URL: http://llvm.org/viewvc/llvm-project?rev=144834&view=rev
Log:
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>

Modified:
    cfe/trunk/lib/Sema/SemaChecking.cpp
    cfe/trunk/utils/TableGen/NeonEmitter.cpp

Modified: cfe/trunk/lib/Sema/SemaChecking.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaChecking.cpp?rev=144834&r1=144833&r2=144834&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaChecking.cpp (original)
+++ cfe/trunk/lib/Sema/SemaChecking.cpp Wed Nov 16 15:32:23 2011
@@ -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 

Modified: cfe/trunk/utils/TableGen/NeonEmitter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/utils/TableGen/NeonEmitter.cpp?rev=144834&r1=144833&r2=144834&view=diff
==============================================================================
--- cfe/trunk/utils/TableGen/NeonEmitter.cpp (original)
+++ cfe/trunk/utils/TableGen/NeonEmitter.cpp Wed Nov 16 15:32:23 2011
@@ -1336,14 +1336,32 @@
         mask |= 1 << GetNeonEnum(Proto, TypeVec[ti]);
       }
     }
-    bool HasPtr = (Proto.find('p') != std::string::npos);
-    bool HasConstPtr = (Proto.find('c') != std::string::npos);
+
+    // Check if the builtin function has a pointer or const pointer argument.
+    int PtrArgNum = -1;
+    bool HasConstPtr = false;
+    for (unsigned arg = 1, arge = Proto.size(); arg != arge; ++arg) {
+      char ArgType = Proto[arg];
+      if (ArgType == 'c') {
+        HasConstPtr = true;
+        PtrArgNum = arg - 1;
+        break;
+      }
+      if (ArgType == 'p') {
+        PtrArgNum = arg - 1;
+        break;
+      }
+    }
+    // For sret builtins, adjust the pointer argument index.
+    if (PtrArgNum >= 0 && (Proto[0] >= '2' && Proto[0] <= '4'))
+      PtrArgNum += 1;
+
     if (mask) {
       OS << "case ARM::BI__builtin_neon_"
          << MangleName(name, TypeVec[si], ClassB)
          << ": mask = " << "0x" << utohexstr(mask);
-      if (HasPtr)
-        OS << "; HasPtr = true";
+      if (PtrArgNum >= 0)
+        OS << "; PtrArgNum = " << PtrArgNum;
       if (HasConstPtr)
         OS << "; HasConstPtr = true";
       OS << "; break;\n";
@@ -1352,8 +1370,8 @@
       OS << "case ARM::BI__builtin_neon_"
          << MangleName(name, TypeVec[qi], ClassB)
          << ": mask = " << "0x" << utohexstr(qmask);
-      if (HasPtr)
-        OS << "; HasPtr = true";
+      if (PtrArgNum >= 0)
+        OS << "; PtrArgNum = " << PtrArgNum;
       if (HasConstPtr)
         OS << "; HasConstPtr = true";
       OS << "; break;\n";





More information about the cfe-commits mailing list