Take more advantage of STG representation invariance (follows up #9291)
Consider following case
alternatives at the STG stage (i.e. untyped) :
case scrut of
False -> []
Just x -> Right x
[] -> Nothing
The common theme of all these is that the scrutinee's memory layout and the result's memory layout coincide. So operationally no allocation needs to take place, and the whole case
expression is simply a (strict) identity at the STG stage.
I propose to add a small STG analysis to:
- for each
case
alternative check whether the assigned tag between scrutinee and result matches, and if so - check whether both have the underlying memory layout and contents.
If these conditions are met, the case alternative can be replaced with the identity. When all alternatives simplify to the identity (also considering the DEFAULT alternative), then the entire case
expression reduces to a single identity DEFAULT alternative (i.e. all other alternatives in the case
can be dropped).
Many of the code examples in the join points paper (https://www.microsoft.com/en-us/research/wp-content/uploads/2016/11/join-points-pldi17.pdf) exhibit these optimisation opportunities.
The already implemented suggestion in #9291 (closed) comes with the restriction that it only operates in the scope of the same type (see last comment there), but STG is untyped, so why not take advantage of this fact?
Trac metadata
Trac field | Value |
---|---|
Version | 8.0.2 |
Type | FeatureRequest |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Compiler |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | |
Architecture |