Skip to content

Cmm optimizer: propagate constants across basic block boundaries

The new constant propagation pass optimizes

fn
{
    bits64 a, b;

    a = 1;
    b = a + a;
    RET_N(b);
}

as

fn()    { []
        }
    cc: R1 = 2;
        jump (I64[Sp + 0]) ();
}

which is good. However, it fails to propagate the constants across a basic block boundary. For example, the following code

fn
{
    bits64 a, b;

    a = 1;
lbl:
    b = a + a;
    RET_N(b);
}

gets optimized as

n()    { []
        }
    cd: _cf::I64 = 1;
        goto ce;
    ce: R1 = _cf::I64 + _cf::I64;
        jump (I64[Sp + 0]) ();
}

To make this work we should ideally work with a better representation of instructions and their use sites than currently used in CmmOpt.hs. For example, see how simple this optimization pass is to implement in LLVM: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/ConstantProp.cpp?view=markup

Trac metadata
Trac field Value
Version 7.0.3
Type FeatureRequest
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information