r218623 - Speedup ClangToLLVMArgMapping construction. NFC.

Alexey Samsonov vonosmas at gmail.com
Mon Sep 29 13:30:23 PDT 2014


Author: samsonov
Date: Mon Sep 29 15:30:22 2014
New Revision: 218623

URL: http://llvm.org/viewvc/llvm-project?rev=218623&view=rev
Log:
Speedup ClangToLLVMArgMapping construction. NFC.

Add a method to calculate the number of arguments given QualType
expnads to. Use this method in ClangToLLVMArgMapping calculation.
This number may be cached in CodeGenTypes for efficiency, if needed.

Modified:
    cfe/trunk/lib/CodeGen/CGCall.cpp

Modified: cfe/trunk/lib/CodeGen/CGCall.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=218623&r1=218622&r2=218623&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGCall.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGCall.cpp Mon Sep 29 15:30:22 2014
@@ -612,6 +612,23 @@ getTypeExpansion(QualType Ty, const ASTC
   return llvm::make_unique<NoExpansion>();
 }
 
+static int getExpansionSize(QualType Ty, const ASTContext &Context) {
+  auto Exp = getTypeExpansion(Ty, Context);
+  if (auto CAExp = dyn_cast<ConstantArrayExpansion>(Exp.get())) {
+    return CAExp->NumElts * getExpansionSize(CAExp->EltTy, Context);
+  }
+  if (auto RExp = dyn_cast<RecordExpansion>(Exp.get())) {
+    int Res = 0;
+    for (auto FD : RExp->Fields)
+      Res += getExpansionSize(FD->getType(), Context);
+    return Res;
+  }
+  if (isa<ComplexExpansion>(Exp.get()))
+    return 2;
+  assert(isa<NoExpansion>(Exp.get()));
+  return 1;
+}
+
 void CodeGenTypes::GetExpandedTypes(QualType type,
                      SmallVectorImpl<llvm::Type*> &expandedTypes) {
   auto Exp = getTypeExpansion(type, Context);
@@ -1222,12 +1239,7 @@ void ClangToLLVMArgMapping::construct(Co
       IRArgs.NumberOfArgs = 0;
       break;
     case ABIArgInfo::Expand: {
-      SmallVector<llvm::Type*, 8> Types;
-      // FIXME: This is rather inefficient. Do we ever actually need to do
-      // anything here? The result should be just reconstructed on the other
-      // side, so extension should be a non-issue.
-      CGM.getTypes().GetExpandedTypes(ArgType, Types);
-      IRArgs.NumberOfArgs = Types.size();
+      IRArgs.NumberOfArgs = getExpansionSize(ArgType, CGM.getContext());
       break;
     }
     }





More information about the cfe-commits mailing list