[code size][ARM] Emit regular call instructions instead of the move, branch sequence

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@166854 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/ARM/ARMISelLowering.cpp b/lib/Target/ARM/ARMISelLowering.cpp
index 8de2387..e4bc31c 100644
--- a/lib/Target/ARM/ARMISelLowering.cpp
+++ b/lib/Target/ARM/ARMISelLowering.cpp
@@ -1594,11 +1594,15 @@
 
   // FIXME: handle tail calls differently.
   unsigned CallOpc;
+  bool HasForceSizeAttr = MF.getFunction()->getFnAttributes().
+                          hasAttribute(Attributes::ForceSizeOpt);
   if (Subtarget->isThumb()) {
     if ((!isDirect || isARMFunc) && !Subtarget->hasV5TOps())
       CallOpc = ARMISD::CALL_NOLINK;
     else if (doesNotRet && isDirect && !isARMFunc &&
-             Subtarget->hasRAS() && !Subtarget->isThumb1Only())
+             Subtarget->hasRAS() && !Subtarget->isThumb1Only() &&
+	     // Emit regular call when code size is the priority
+	     !HasForceSizeAttr)
       // "mov lr, pc; b _foo" to avoid confusing the RSP
       CallOpc = ARMISD::CALL_NOLINK;
     else
@@ -1606,7 +1610,9 @@
   } else {
     if (!isDirect && !Subtarget->hasV5TOps()) {
       CallOpc = ARMISD::CALL_NOLINK;
-    } else if (doesNotRet && isDirect && Subtarget->hasRAS())
+    } else if (doesNotRet && isDirect && Subtarget->hasRAS() &&
+	       // Emit regular call when code size is the priority
+	       !HasForceSizeAttr)
       // "mov lr, pc; b _foo" to avoid confusing the RSP
       CallOpc = ARMISD::CALL_NOLINK;
     else