-
Simon Peyton Jones authored
--------------------------- Types and evaluated-ness in CoreTidy and CorePrep --------------------------- This commmit fixes two problems. 1. DataToTagOp requires its argument to be evaluated, otherwise it silently gives the wrong answer. This was not happening because we had case (tag2Enum x) of y -> ...(dataToTag y)... and the tag2Enum was being inlined (it's non-speculative), giving ...(dataToTag (tag2Enum x))... Rather than relying on a somewhat-delicate global invariant, CorePrep now establishes the invariant that DataToTagOp's argument is evaluated. It does so by putting up-to-date is-evaluated information into each binder's UnfoldingInfo; not a full unfolding, just the (OtherCon []) for evaluated binders. Then there's a special case for DataToTag where applications are dealt with. Finally, we make DataToTagOp strict, which it really is. 2. CoreTidy now does GADT refinement as it goes. This is important to ensure that each variable occurrence has informative type information, which in turn is essential to make exprType work (otherwise it can simply crash). [This happened in test gadt/tdpe] CorePrep has the same problem, but the solution is a little different: when looking up in the cloning environment, use the type at the occurrence site if we're inside a GADT. It might be cleaner to use the same story as CoreTidy, but then we'd need to keep an in-scope set for type variables. No big deal either way.
f25b9225