Draft: Turn coercion optimization into an optimization pass (#19909)
This distinguishes between "simple" and "non-simple" coercion optimizations,
with "simple" coercion optimizations applied by the simple optimizer (immediately after
desugaring) and during simplification, while "non-simple" coercion optimizations are applied during a
separate core-to-core pass. At the moment the only coercion optimizations not
considered "simple" are the opt_trans_rule
cases for pushing transitivity
inside axioms.
There are now explicit -fopt-coercion-simple
and -fopt-coercion-full
options
to control these passes. The existing -fno-opt-coercion
disables them both,
and a new -fopt-coercion
enables them both. By default
-fopt-coercion-simple
is enabled for all optimization levels, while
-fopt-coercion-full
is enabled only for -O1
and higher.
Open questions:
-
When should we run the non-simple optimization pass? At the moment it is run only once, at the beginning of the pipeline.
-
Should any other coercion optimizations be "non-simple"?
-
Should we perform non-simple optimization of coercions inside types? I've so far refrained from doing so, because I have a hunch that it will be a waste of time, but I haven't got data to back this up.