summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@gmail.com>2015-03-30 12:11:37 +0200
committerLukas Rytz <lukas.rytz@gmail.com>2015-03-31 20:04:22 +0200
commit6cf17ccd0101514a603a8c191438bdc2764838f9 (patch)
tree4e01f4f1e46ef94c4553d28703a61dad13941655 /src
parent093be1add315bd5b76057e943bdba1a4cc198a0d (diff)
downloadscala-6cf17ccd0101514a603a8c191438bdc2764838f9.tar.gz
scala-6cf17ccd0101514a603a8c191438bdc2764838f9.tar.bz2
scala-6cf17ccd0101514a603a8c191438bdc2764838f9.zip
Command-line flag to control inlining heuristics
Introduces a stress-test mode "everything" in which the inliner tries to inline every calliste that can be statically resolved.
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/BTypes.scala2
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/BTypesFromSymbols.scala2
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/opt/Inliner.scala3
-rw-r--r--src/compiler/scala/tools/nsc/settings/ScalaSettings.scala9
4 files changed, 14 insertions, 2 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/BTypes.scala b/src/compiler/scala/tools/nsc/backend/jvm/BTypes.scala
index d8a17e975e..74990fad02 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/BTypes.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/BTypes.scala
@@ -57,6 +57,8 @@ abstract class BTypes {
// Settings that define what kind of optimizer warnings are emitted.
def warnSettings: WarnSettings
+ def inliningHeuristics: String
+
/**
* A map from internal names to ClassBTypes. Every ClassBType is added to this map on its
* construction.
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/BTypesFromSymbols.scala b/src/compiler/scala/tools/nsc/backend/jvm/BTypesFromSymbols.scala
index eeb6ed24a2..ad434889cf 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/BTypesFromSymbols.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/BTypesFromSymbols.scala
@@ -63,6 +63,8 @@ class BTypesFromSymbols[G <: Global](val global: G) extends BTypes {
settings.YoptWarnings.contains(c.noInlineMissingScalaInlineInfoAttr.name))
}
+ def inliningHeuristics: String = settings.YoptInlineHeuristics.value
+
// helpers that need access to global.
// TODO @lry create a separate component, they don't belong to BTypesFromSymbols
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/opt/Inliner.scala b/src/compiler/scala/tools/nsc/backend/jvm/opt/Inliner.scala
index e14e57d3ab..fbbb6bb5e0 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/opt/Inliner.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/opt/Inliner.scala
@@ -106,7 +106,8 @@ class Inliner[BT <: BTypes](val btypes: BT) {
*/
def doInlineCallsite(callsite: Callsite): Boolean = callsite match {
case Callsite(_, _, _, Right(Callee(callee, calleeDeclClass, safeToInline, _, annotatedInline, _, warning)), _, _, pos) =>
- annotatedInline && safeToInline
+ if (inliningHeuristics == "everything") safeToInline
+ else annotatedInline && safeToInline
case _ => false
}
diff --git a/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala b/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala
index d273995e6e..ee683418d9 100644
--- a/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala
+++ b/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala
@@ -256,6 +256,13 @@ trait ScalaSettings extends AbsScalaSettings
def YoptInlineGlobal = Yopt.contains(YoptChoices.inlineGlobal)
def YoptInlinerEnabled = YoptInlineProject || YoptInlineGlobal
+ val YoptInlineHeuristics = ChoiceSetting(
+ name = "-Yopt-inline-heuristics",
+ helpArg = "strategy",
+ descr = "Set the heuristics for inlining decisions.",
+ choices = List("at-inline-annotated", "everything"),
+ default = "at-inline-annotated")
+
object YoptWarningsChoices extends MultiChoiceEnumeration {
val none = Choice("none" , "No optimizer warnings.")
val atInlineFailedSummary = Choice("at-inline-failed-summary" , "One-line summary if there were @inline method calls that could not be inlined.")
@@ -267,7 +274,7 @@ trait ScalaSettings extends AbsScalaSettings
val YoptWarnings = MultiChoiceSetting(
name = "-Yopt-warnings",
- helpArg = "warnings",
+ helpArg = "warning",
descr = "Enable optimizer warnings",
domain = YoptWarningsChoices,
default = Some(List(YoptWarningsChoices.atInlineFailed.name))) withPostSetHook (self => {