Skip to content
  • Rodrigo Mesquita's avatar
    d62c18d8
    determinism: Sampling uniques in the CG · d62c18d8
    Rodrigo Mesquita authored and Zubin's avatar Zubin committed
    To achieve object determinism, the passes processing Cmm and the rest of
    the code generation pipeline musn't create new uniques which are
    non-deterministic.
    
    This commit changes occurrences of non-deterministic unique sampling
    within these code generation passes by a deterministic unique sampling
    strategy by propagating and threading through a deterministic
    incrementing counter in them. The threading is done implicitly with
    `UniqDSM` and `UniqDSMT`.
    
    Secondly, the `DUniqSupply` used to run a `UniqDSM` must be threaded
    through all passes to guarantee uniques in different passes are unique
    amongst them altogether. Specifically, the same `DUniqSupply` must be
    threaded through the CG Streaming pipeline, starting with Driver.Main
    calling `StgToCmm.codeGen`, `cmmPipeline`, `cmmToRawCmm`, and
    `codeOutput` in sequence.
    
    To thread resources through the `Stream` abstraction, we use the `UniqDSMT`
    transformer on top of `IO` as the Monad underlying the Stream. `UniqDSMT` will
    thread the `DUniqSupply` through every pass applied to the `Stream`, for every
    element. We use @type CgStream = Stream (UniqDSMT IO)@ for the Stream used in
    code generation which that carries through the deterministic unique supply.
    
    See Note [Deterministic Uniques in the CG]
    d62c18d8
    determinism: Sampling uniques in the CG
    Rodrigo Mesquita authored and Zubin's avatar Zubin committed
    To achieve object determinism, the passes processing Cmm and the rest of
    the code generation pipeline musn't create new uniques which are
    non-deterministic.
    
    This commit changes occurrences of non-deterministic unique sampling
    within these code generation passes by a deterministic unique sampling
    strategy by propagating and threading through a deterministic
    incrementing counter in them. The threading is done implicitly with
    `UniqDSM` and `UniqDSMT`.
    
    Secondly, the `DUniqSupply` used to run a `UniqDSM` must be threaded
    through all passes to guarantee uniques in different passes are unique
    amongst them altogether. Specifically, the same `DUniqSupply` must be
    threaded through the CG Streaming pipeline, starting with Driver.Main
    calling `StgToCmm.codeGen`, `cmmPipeline`, `cmmToRawCmm`, and
    `codeOutput` in sequence.
    
    To thread resources through the `Stream` abstraction, we use the `UniqDSMT`
    transformer on top of `IO` as the Monad underlying the Stream. `UniqDSMT` will
    thread the `DUniqSupply` through every pass applied to the `Stream`, for every
    element. We use @type CgStream = Stream (UniqDSMT IO)@ for the Stream used in
    code generation which that carries through the deterministic unique supply.
    
    See Note [Deterministic Uniques in the CG]
Loading