summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@gmail.com>2015-08-28 10:35:44 +0200
committerLukas Rytz <lukas.rytz@gmail.com>2015-09-17 20:16:19 +0200
commit9dd5f95f956fbfd1dc4bab0c7ef69cc60bf85f2c (patch)
treefde3a2ca48392f9b5eb0a9320cf9ad299852106b
parent89c0a7f0a320e898f360c7c94b1ad0bbce681b3a (diff)
downloadscala-9dd5f95f956fbfd1dc4bab0c7ef69cc60bf85f2c.tar.gz
scala-9dd5f95f956fbfd1dc4bab0c7ef69cc60bf85f2c.tar.bz2
scala-9dd5f95f956fbfd1dc4bab0c7ef69cc60bf85f2c.zip
Tone down inliner warnings for callsites not annotated @inline
Before this change, with `-Yopt-warnings:at-inline-failed` or with the default options, the inliner would emit inline warnings for failed attempts of callsites that are not annotated @inline. A test for this change follows in a later commit, after enabling the new inliner heuristic for higher-order methods.
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/BackendReporting.scala8
-rw-r--r--src/compiler/scala/tools/nsc/settings/ScalaSettings.scala4
2 files changed, 8 insertions, 4 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/BackendReporting.scala b/src/compiler/scala/tools/nsc/backend/jvm/BackendReporting.scala
index 8526f7e0ae..005d01f187 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/BackendReporting.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/BackendReporting.scala
@@ -228,7 +228,7 @@ object BackendReporting {
def emitWarning(settings: ScalaSettings): Boolean = this match {
case _: IllegalAccessInstruction | _: MethodWithHandlerCalledOnNonEmptyStack | _: SynchronizedMethod | _: StrictfpMismatch | _: ResultingMethodTooLarge =>
- settings.YoptWarningEmitAtInlineFailed
+ settings.YoptWarnings.contains(settings.YoptWarningsChoices.anyInlineFailed)
case IllegalAccessCheckFailed(_, _, _, _, _, cause) =>
cause.emitWarning(settings)
@@ -246,9 +246,11 @@ object BackendReporting {
case class ResultingMethodTooLarge(calleeDeclarationClass: InternalName, name: String, descriptor: String,
callsiteClass: InternalName, callsiteName: String, callsiteDesc: String) extends CannotInlineWarning
+ // TODO: this should be a subtype of CannotInlineWarning
+ // but at the place where it's created (in findIllegalAccess) we don't have the necessary data (calleeName, calleeDescriptor).
case object UnknownInvokeDynamicInstruction extends OptimizerWarning {
override def toString = "The callee contains an InvokeDynamic instruction with an unknown bootstrap method (not a LambdaMetaFactory)."
- def emitWarning(settings: ScalaSettings): Boolean = settings.YoptWarningEmitAtInlineFailed
+ def emitWarning(settings: ScalaSettings): Boolean = settings.YoptWarnings.contains(settings.YoptWarningsChoices.anyInlineFailed)
}
/**
@@ -260,7 +262,7 @@ object BackendReporting {
override def emitWarning(settings: ScalaSettings): Boolean = this match {
case RewriteClosureAccessCheckFailed(_, cause) => cause.emitWarning(settings)
- case RewriteClosureIllegalAccess(_, _) => settings.YoptWarningEmitAtInlineFailed
+ case RewriteClosureIllegalAccess(_, _) => settings.YoptWarnings.contains(settings.YoptWarningsChoices.anyInlineFailed)
}
override def toString: String = this match {
diff --git a/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala b/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala
index f6223926bf..ea9ad1d909 100644
--- a/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala
+++ b/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala
@@ -283,6 +283,7 @@ trait ScalaSettings extends AbsScalaSettings
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.")
val atInlineFailed = Choice("at-inline-failed" , "A detailed warning for each @inline method call that could not be inlined.")
+ val anyInlineFailed = Choice("any-inline-failed" , "A detailed warning for every callsite that was chosen for inlining by the heuristics, but could not be inlined.")
val noInlineMixed = Choice("no-inline-mixed" , "In mixed compilation, warn at callsites methods defined in java sources (the inlining decision cannot be made without bytecode).")
val noInlineMissingBytecode = Choice("no-inline-missing-bytecode" , "Warn if an inlining decision cannot be made because a the bytecode of a class or member cannot be found on the compilation classpath.")
val noInlineMissingScalaInlineInfoAttr = Choice("no-inline-missing-attribute", "Warn if an inlining decision cannot be made because a Scala classfile does not have a ScalaInlineInfo attribute.")
@@ -301,7 +302,8 @@ trait ScalaSettings extends AbsScalaSettings
def YoptWarningEmitAtInlineFailed =
!YoptWarnings.isSetByUser ||
YoptWarnings.contains(YoptWarningsChoices.atInlineFailedSummary) ||
- YoptWarnings.contains(YoptWarningsChoices.atInlineFailed)
+ YoptWarnings.contains(YoptWarningsChoices.atInlineFailed) ||
+ YoptWarnings.contains(YoptWarningsChoices.anyInlineFailed)
def YoptWarningNoInlineMixed = YoptWarnings.contains(YoptWarningsChoices.noInlineMixed)
def YoptWarningNoInlineMissingBytecode = YoptWarnings.contains(YoptWarningsChoices.noInlineMissingBytecode)