Opened 3 years ago

Last modified 20 months ago

#12982 new feature request

Missed constant folding oportunities

Reported by: erikd Owned by:
Priority: normal Milestone:
Component: libraries/hoopl Version: 8.0.1
Keywords: newcomer Cc: sio
Operating System: Unknown/Multiple Architecture: Unknown/Multiple
Type of failure: None/Unknown Test Case:
Blocked By: Blocking:
Related Tickets: Differential Rev(s):
Wiki Page:

Description (last modified by simonpj)

A work colleague of mine found that some expressions were not being constant folded as expected.

For example:

module Test where
import Data.Int
number :: Int64
number = 2 ^ 10 - 3

compiled using:

ghc -O2 -keep-s-file -c test.hs

should result in an assembler file containing the constant 1021 but doesn't. However, if I change the above expression to:

number = 1024 -3

then the output assembler files does contain the value 1021.

I did a bit of a search and found some constant folding code in the hoopl library, but that doesn't seem to be what GHC actually uses.

Change History (6)

comment:1 Changed 3 years ago by simonpj

Description: modified (diff)

The constant folding RULES, in prelude/PrelRules don't seem to work on exponentiation. Would anyone like to fix that? (Need to be careful to preserve overflow behaviour.)

However I don't see 1021 in any output; I only see 2 ^ 10, even in the assembly file.

Last edited 3 years ago by simonpj (previous) (diff)

comment:2 Changed 3 years ago by sio

Would anyone like to fix that? (Need to be careful to preserve overflow behaviour.)

I'd like to take a crack at this. It'll be my first change, so will take me a while to get familiar with the codebase; will update when I've made some progress.

comment:3 Changed 23 months ago by bgamari


This ticket won't be resolved in 8.4; remilestoning for 8.6. Do holler if you are affected by this or would otherwise like to work on it.

comment:4 Changed 21 months ago by bgamari

Keywords: newcomer added
Milestone: 8.6.1

sio, sorry I missed your comment; were you able to make any progress on this? Do ping if you need help.

comment:5 Changed 21 months ago by Vyse007

I took a stab at this: thanks to Ben I was able to add a new PrimOp for POW, along with some basic rules for folding in PrelRules.hs. I eventually found myself stuck in nativeGen/X86/CodeGen.hs where we employ getRegister to find free registers for computation. I couldn't grok all of it so for I just copied the triv_op call for MO_Mul and it seemed to work fine; I understand that it's incorrect obviously, but I might need a little help in understanding what's the best solution.

comment:6 Changed 20 months ago by bgamari

Hi Vyse007, do you think you could push your patch to Phabricator so I can have a look. Thanks for picking this up!

Note: See TracTickets for help on using tickets.