Refactor out some common code from r252834

llvm-svn: 252840
diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp
index 8596f97..1d3ad9b 100644
--- a/clang/lib/CodeGen/CodeGenFunction.cpp
+++ b/clang/lib/CodeGen/CodeGenFunction.cpp
@@ -1843,6 +1843,30 @@
     llvm::BasicBlock::iterator InsertPt) const;
 #undef PreserveNames
 
+static bool hasRequiredFeatures(const SmallVectorImpl<StringRef> &ReqFeatures,
+                                CodeGenModule &CGM, const FunctionDecl *FD) {
+  // If there aren't any required features listed then go ahead and return.
+  if (ReqFeatures.empty())
+    return false;
+
+  // Now build up the set of caller features and verify that all the required
+  // features are there.
+  llvm::StringMap<bool> CallerFeatureMap;
+  CGM.getFunctionFeatureMap(CallerFeatureMap, FD);
+
+  // If we have at least one of the features in the feature list return
+  // true, otherwise return false.
+  return std::all_of(
+      ReqFeatures.begin(), ReqFeatures.end(), [&](StringRef Feature) {
+        SmallVector<StringRef, 1> OrFeatures;
+        Feature.split(OrFeatures, "|");
+        return std::any_of(OrFeatures.begin(), OrFeatures.end(),
+                           [&](StringRef Feature) {
+                             return CallerFeatureMap.lookup(Feature);
+                           });
+      });
+}
+
 // Emits an error if we don't have a valid set of target features for the
 // called function.
 void CodeGenFunction::checkTargetFeatures(const CallExpr *E,
@@ -1870,26 +1894,7 @@
       return;
     StringRef(FeatureList).split(ReqFeatures, ",");
 
-    // If there aren't any required features listed then go ahead and return.
-    if (ReqFeatures.empty())
-      return;
-
-    // Now build up the set of caller features and verify that all the required
-    // features are there.
-    llvm::StringMap<bool> CallerFeatureMap;
-    CGM.getFunctionFeatureMap(CallerFeatureMap, FD);
-
-    // If we have at least one of the features in the feature list return
-    // true, otherwise return false.
-    if (!std::all_of(
-            ReqFeatures.begin(), ReqFeatures.end(), [&](StringRef &Feature) {
-              SmallVector<StringRef, 1> OrFeatures;
-              Feature.split(OrFeatures, "|");
-              return std::any_of(OrFeatures.begin(), OrFeatures.end(),
-                                 [&](StringRef &Feature) {
-                                   return CallerFeatureMap.lookup(Feature);
-                                 });
-            }))
+    if (!hasRequiredFeatures(ReqFeatures, CGM, FD))
       CGM.getDiags().Report(E->getLocStart(), diag::err_builtin_needs_feature)
           << TargetDecl->getDeclName()
           << CGM.getContext().BuiltinInfo.getRequiredFeatures(BuiltinID);
@@ -1901,25 +1906,7 @@
     CGM.getFunctionFeatureMap(CalleeFeatureMap, TargetDecl);
     for (const auto &F : CalleeFeatureMap)
       ReqFeatures.push_back(F.getKey());
-    // If there aren't any required features listed then go ahead and return.
-    if (ReqFeatures.empty())
-      return;
-
-    // Now get the features that the caller provides.
-    llvm::StringMap<bool> CallerFeatureMap;
-    CGM.getFunctionFeatureMap(CallerFeatureMap, FD);
-
-    // If we have at least one of the features in the feature list return
-    // true, otherwise return false.
-    if (!std::all_of(
-            ReqFeatures.begin(), ReqFeatures.end(), [&](StringRef &Feature) {
-              SmallVector<StringRef, 1> OrFeatures;
-              Feature.split(OrFeatures, "|");
-              return std::any_of(OrFeatures.begin(), OrFeatures.end(),
-                                 [&](StringRef &Feature) {
-                                   return CallerFeatureMap.lookup(Feature);
-                                 });
-            }))
+    if (!hasRequiredFeatures(ReqFeatures, CGM, FD))
       CGM.getDiags().Report(E->getLocStart(), diag::err_function_needs_feature)
           << FD->getDeclName() << TargetDecl->getDeclName();
   }