From 747925f8fd8c31cca867eccbe95e44c12a174216 Mon Sep 17 00:00:00 2001 From: Karol Stasiak Date: Mon, 26 Feb 2018 17:49:55 +0100 Subject: [PATCH] Added new -O1 optimization preset --- CHANGELOG.md | 2 ++ src/main/scala/millfork/Main.scala | 29 +++++++++++-------- .../scala/millfork/OptimizationPresets.scala | 17 +++++++++++ 3 files changed, 36 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 28c59c9f..9939e508 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ * **Breaking change!** Renamed `inline` to `macro`. +* Added new `-O1` optimization preset; old `-O1` became `-O2`, old `-O2` became `-O3` and so on. + * Added support for parameters for macros written in Millfork. * Enabled calling macros with index expression parameters. diff --git a/src/main/scala/millfork/Main.scala b/src/main/scala/millfork/Main.scala index 778a04bd..f4aea1a6 100644 --- a/src/main/scala/millfork/Main.scala +++ b/src/main/scala/millfork/Main.scala @@ -86,14 +86,19 @@ object Main { val env = new Environment(None, "") env.collectDeclarations(program, options) - val extras = List( - if (options.flag(CompilationFlag.EmitIllegals)) UndocumentedOptimizations.All else Nil, - if (options.flag(CompilationFlag.EmitCmosOpcodes)) CmosOptimizations.All else LaterOptimizations.Nmos, - if (options.flag(CompilationFlag.DangerousOptimizations)) DangerousOptimizations.All else Nil, - ).flatten - val goodCycle = List.fill(optLevel - 1)(OptimizationPresets.Good).flatten - val assemblyOptimizations = if (optLevel <= 0) Nil else if (optLevel >= 9) List(SuperOptimizer) else { - goodCycle ++ OptimizationPresets.AssOpt ++ extras ++ goodCycle + + val assemblyOptimizations = optLevel match { + case 0 => Nil + case 1 => OptimizationPresets.QuickPreset + case i if i >= 9 => List(SuperOptimizer) + case _ => + val extras = List( + if (options.flag(CompilationFlag.EmitIllegals)) UndocumentedOptimizations.All else Nil, + if (options.flag(CompilationFlag.EmitCmosOpcodes)) CmosOptimizations.All else LaterOptimizations.Nmos, + if (options.flag(CompilationFlag.DangerousOptimizations)) DangerousOptimizations.All else Nil, + ).flatten + val goodCycle = List.fill(optLevel - 2)(OptimizationPresets.Good).flatten + goodCycle ++ OptimizationPresets.AssOpt ++ extras ++ goodCycle } // compile @@ -188,7 +193,7 @@ object Main { }.description("Whether should emit CMOS opcodes.") boolean("-fillegals", "-fno-illegals").action { (c, v) => c.changeFlag(CompilationFlag.EmitIllegals, v) - }.description("Whether should emit illegal (undocumented) NMOS opcodes.") + }.description("Whether should emit illegal (undocumented) NMOS opcodes. Required -O2 or higher to have an effect.") boolean("-fjmp-fix", "-fno-jmp-fix").action { (c, v) => c.changeFlag(CompilationFlag.PreventJmpIndirectBug, v) }.description("Whether should prevent indirect JMP bug on page boundary.") @@ -230,18 +235,18 @@ object Main { c.changeFlag(CompilationFlag.OptimizeForSize, true) c.changeFlag(CompilationFlag.OptimizeForSpeed, false) c.changeFlag(CompilationFlag.OptimizeForSonicSpeed, false) - }.description("Optimize for size at cost of lower speed (experimental).") + }.description("Prefer smaller code even if it is slightly slower (experimental).") flag("-Of", "--fast").action { c => c.changeFlag(CompilationFlag.OptimizeForSize, false) c.changeFlag(CompilationFlag.OptimizeForSpeed, true) c.changeFlag(CompilationFlag.OptimizeForSonicSpeed, false) - }.description("Optimize for speed at cost of bigger size (experimental).") + }.description("Prefer faster code even if it is slightly bigger (experimental).") flag("-Ob", "--blast-processing").action { c => c.changeFlag(CompilationFlag.OptimizeForSize, false) c.changeFlag(CompilationFlag.OptimizeForSpeed, true) c.changeFlag(CompilationFlag.OptimizeForSonicSpeed, true) c.changeFlag(CompilationFlag.InlineFunctions, true) - }.description("Optimize for speed at cost of much bigger size (experimental). Implies --inline.") + }.description("Prefer faster code even if it is much bigger (experimental). Implies --inline.") flag("--detailed-flow").action { c => c.changeFlag(CompilationFlag.DetailedFlowAnalysis, true) }.description("Use detailed flow analysis (experimental).") diff --git a/src/main/scala/millfork/OptimizationPresets.scala b/src/main/scala/millfork/OptimizationPresets.scala index 4e3a8636..f7a54a48 100644 --- a/src/main/scala/millfork/OptimizationPresets.scala +++ b/src/main/scala/millfork/OptimizationPresets.scala @@ -179,4 +179,21 @@ object OptimizationPresets { AlwaysGoodOptimizations.UnusedLabelRemoval, VariableToRegisterOptimization, ) + + val QuickPreset: List[AssemblyOptimization] = List[AssemblyOptimization]( + AlwaysGoodOptimizations.Adc0Optimization, + AlwaysGoodOptimizations.BranchInPlaceRemoval, + AlwaysGoodOptimizations.CommonBranchBodyOptimization, + AlwaysGoodOptimizations.CommonExpressionInConditional, + AlwaysGoodOptimizations.CommonIndexSubexpressionElimination, + AlwaysGoodOptimizations.IndexSequenceOptimization, + AlwaysGoodOptimizations.PoinlessStoreBeforeStore, + AlwaysGoodOptimizations.PointlessLoadAfterLoadOrStore, + AlwaysGoodOptimizations.PointlessLoadBeforeTransfer, + AlwaysGoodOptimizations.PointlessOperationFromFlow, + AlwaysGoodOptimizations.ReverseFlowAnalysis, + AlwaysGoodOptimizations.SimplifiableCondition, + VariableToRegisterOptimization, + LaterOptimizations.DoubleLoadToTheSameRegister + ) }