# compiler-plugin mtg 07/08 I would like to discuss the design of [Part 1: Cassette.jl-like Code Rewrite](https://hackmd.io/bVhb97Q4QTWeBQw8Rq4IFw?both#Part-1-Cassettejl-like-Code-Rewrite), especially the part of [How This Design Solves the Issues of `@generated` ?](https://hackmd.io/bVhb97Q4QTWeBQw8Rq4IFw?both#How-This-Design-Solves-the-Issues-of-generated-). - As for 1. unlimited customizations - As for 3. context hook ? ## As for 1. Don't more hooks simply mean more customizations ? Isn't correct to say "`@generated` is limited in a sense that it can only hook into pre-inference stage" ? "trade off"s: - termination vs. more inference/optimization - usual functions vs. `@generated` functions - `@generated` functions vs. compiler plugin - autodiff: - Cassette.jl: exponential work - Diffractor.jl: almost linear work, by eliminating expanded unused closures (requires type information) - Diffractor: - optimizations before inference ? - `@generated` functions are not allowed to do > `@generated` tweak inference options E.g. tweak the method inference heuristics. And we can have more like that. Reuse `@generated` function ? Not necessarily. ## As for 2 - shouldn't rely on dispatch ! - overlay method table can be solutions ? - might not be composable - give up context hook ? - how we gonna manage Don't rely on dispatch as a core mechanism to apply transformations, and unlimit the inference. E.g. recursion detection is limited for `@generated` functions. ## As for 3, many things to consider From <https://julialang.slack.com/archives/C01T5MN64NB/p1625684749254100> > The current example for context_hook looks like this interface would only be valid for concrete types, which means they are slightly worse at 2 than `@generated` functions now > > For 3, I don’t see anything in the proposal that reduces latency > > The specific mechanism of bail-out looks slightly different, but I thought Cassette-type passes already offer bail-out “context hooks” that work almost the same as the proposed pass would > > For 3, there seems to be an implication that the passes could preserve information between frames–something that generated functions are permitted to do now > > But generated functions are prohibited from that because the latency implications would be too slow > > Keeping latency low generally requires each component to be independent, so that there is never exponential (context-sensitive) work to add compile-time latency problems ### Is it really problem / Is there any alternative Think about Diffractor: - returns a value, derivative it is closure that contain all the previous states (functions) - Observation: most of the closures aren't used => avoid creating unused closures. Generalized: use type information to cut off uninterested portion Key point: a closure multiplied zero, directly intervene to inference ! Punchline: _**Allow compiler plugins to experiment inference decisions**_ The transformation order might be important. ## Examples ? - simple: `sin` to `fast_sin` - autodiff - GPU compiler - CAS