AMDGPU: Add option to stress calls

This inverts the behavior of the AlwaysInline pass to mark
every function not already marked alwaysinline as noinline.

llvm-svn: 313865
diff --git a/llvm/lib/Target/AMDGPU/AMDGPUAlwaysInlinePass.cpp b/llvm/lib/Target/AMDGPU/AMDGPUAlwaysInlinePass.cpp
index 6f3742e..c274254 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPUAlwaysInlinePass.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPUAlwaysInlinePass.cpp
@@ -21,6 +21,12 @@
 
 namespace {
 
+static cl::opt<bool> StressCalls(
+  "amdgpu-stress-function-calls",
+  cl::Hidden,
+  cl::desc("Force all functions to be noinline"),
+  cl::init(false));
+
 class AMDGPUAlwaysInline : public ModulePass {
   bool GlobalOpt;
 
@@ -57,9 +63,13 @@
     }
   }
 
+  auto NewAttr = StressCalls ? Attribute::NoInline : Attribute::AlwaysInline;
+  auto IncompatAttr
+    = StressCalls ? Attribute::AlwaysInline : Attribute::NoInline;
+
   for (Function &F : M) {
     if (!F.hasLocalLinkage() && !F.isDeclaration() && !F.use_empty() &&
-        !F.hasFnAttribute(Attribute::NoInline))
+        !F.hasFnAttribute(IncompatAttr))
       FuncsToClone.push_back(&F);
   }
 
@@ -71,8 +81,8 @@
   }
 
   for (Function &F : M) {
-    if (F.hasLocalLinkage() && !F.hasFnAttribute(Attribute::NoInline)) {
-      F.addFnAttr(Attribute::AlwaysInline);
+    if (F.hasLocalLinkage() && !F.hasFnAttribute(IncompatAttr)) {
+      F.addFnAttr(NewAttr);
     }
   }
   return false;