Make RunTransformsOnAllFunctions able to use multiple threads if threading is enabled, and add a setting to CodeGeneratorSettings so you can turn it on. It's disabled by default due to a race condition I haven't been able to fix yet.
FunctionCache.GetFirstPass/GetSecondPass now block until the requested pass is ready, unless a deadlock is detected (in which case they abort and return null).
Fix OrderedDictionary.Remove not working right if a given key had been enqueued multiple times.
Huh, a bad merge seems to have inserted some duplicate transform passes.
Overhaul the way function transforms are run so that they are handled by a pipeline of individual stages.
All function transforms that rely on static analysis data inherit from a special base class.
Function transforms that rely on static analysis data will suspend the pipeline if they depend on data for a function that is being transformed.
If a function transform stage fails due to a dependency on a function being transformed, suspend the transform pipeline and push it onto the queue to complete later.
Change IntroduceVariableDeclarations to do all its node replacement in a single pass at the end instead of during traversal.
Fix JSBlockStatement.AnnotatedChildren throwing in weird edge cases (this is probably awful)
Fix Entry.RunLocked spinning the thread for no good reason.
Tweaks to try and eliminate the GetFirstPass deadlock.
Added a Log stringbuilder to the TranslationResult object where miscellaneous information can be logged to end up in the jsillog file
Limit the maximum degree of automatic parallelism to (ProcessorCount + 2) because for some reason the .NET ThreadPool seems to spin up like 60 threads when a deadlock happens (???)
Only log warnings about pipelines being suspended if it happens more than once
If it appears that the function cache is deadlocked, force an abort/retry. Better than nothing for now...