Opened 21 months ago

Closed 9 months ago

Last modified 8 months ago

#7116 closed bug (fixed)

Missing optimisation: strength reduction of floating-point multiplication

Reported by: simonmar Owned by: Jan Stolarek <jan.stolarek@…>
Priority: normal Milestone: 7.8.1
Component: Compiler Version: 7.4.2
Keywords: Cc: jan.stolarek@…
Operating System: Unknown/Multiple Architecture: Unknown/Multiple
Type of failure: Runtime performance bug Difficulty: Unknown
Test Case: numeric/should_compile/T7116 Blocked By:
Blocking: Related Tickets:


e.g. x * 2.0 should turn into x + x. See #2253 (program 6) for an example.

Whether this is best done as a builtin RULE or in cmmMachOpFold, or possibly both, I don't know.

Attachments (1)

7116.patch (4.8 KB) - added by pcapriotti 20 months ago.

Download all attachments as: .zip

Change History (13)

Changed 20 months ago by pcapriotti

comment:1 Changed 20 months ago by pcapriotti

I think this should be in PrelRules. Attached is a patch. Could it be done more generally?

comment:2 Changed 20 months ago by simonmar

Looks good to me.

comment:3 Changed 19 months ago by simonpj

  • Owner set to pcapriotti

Paolo: yes, please commit your patch. But could you add a comment Note [Strength reduction] that explains how it works. In particular the "lit" is always 2, and the op is always (+); but at either Float or Double. Perhapas you can name the op parameter add_op? And lit can be two_lit. But the comment as well!



comment:4 Changed 10 months ago by jstolarek

Provded patch rewrites 2 * x for Int and Word to x + x, which kills the optimisation done at the later stage of the pipeline in CmmOpt: turning multiplications and divisons by powers of two into shifts. I wonder if it makes sense to move mentioned Cmm optimisation to PrelRules, so that shifts are introduced at the Core level. Having all similar optimisations done in one place would be more consistent. Or am I missing something?

comment:5 Changed 10 months ago by igloo

  • Status changed from new to patch

comment:6 Changed 10 months ago by igloo

  • Owner pcapriotti deleted

comment:7 Changed 9 months ago by simonmar

jstolarek: the ticket is about doing the optimisation for floating-point multiplication, not integer. We don't want to do it for integer operations, because it's better to do this in the code generator (the only reason for doing it in the simplifier would be to enable further simplifications, but that isn't the case here).

Furthermore, we definitely want to optimise integer multiplication at the Cmm level, because the Stg->Cmm code generator and later stages may create opportunities for this optimisation.

comment:8 Changed 9 months ago by jstolarek

  • Cc jan.stolarek@… added

comment:9 Changed 9 months ago by jan.stolarek@…

commit 838e2fda9892e61da85187803cce45b3f815b86e

Author: Jan Stolarek <>
Date:   Mon Jul 8 16:20:43 2013 +0100

    Add strength reduction rules (Fixes #7116)
    This patch adds rules for converting floating point multiplication
    of the form 2.0 * x and x * 2.0 into addition x + x.

 compiler/prelude/PrelRules.lhs |   33 +++++++++++++++++++++++++++------
 1 file changed, 27 insertions(+), 6 deletions(-)

comment:10 Changed 9 months ago by jstolarek

  • Resolution set to fixed
  • Status changed from patch to closed

I pushed fix into HEAD.

Really sorry about the merge commit - the moment I pushed I realized that I didn't pull with --rebase.

comment:11 Changed 9 months ago by Jan Stolarek <jan.stolarek@…>

  • Owner set to Jan Stolarek <jan.stolarek@…>

In 67d6a196d299baa99b11dd6be82472b91129618d/testsuite:

Fix #7116 failing due to uniques

comment:12 Changed 8 months ago by jstolarek

  • Test Case set to numeric/should_compile/T7116
Note: See TracTickets for help on using tickets.