From 2b9e51b2f7c1cfa9877090d8e1a0e7122baa74af Mon Sep 17 00:00:00 2001 From: Mike Vitousek Date: Mon, 16 Sep 2024 15:49:48 -0700 Subject: [PATCH] Update base for Update on "[compiler] Separate InferFunctionEffects pass from InferReferenceEffects" Test Plan: This diff finally separates InferFunctionEffects into its own separate pass from InferReferenceEffects. It relies on the abstractValues populated in IRE as well as the alias sets that IRE returns. The meat of the InferFunctionEffects algorithm is still the same, but rather than querying the "live" InferenceState from IRE for abstract values and alias information, we query the values defined on places and the alias set returned by IRE. One extra bit of work that we now need to perform is creating a map from IdentifierIds to AbstractValues, which we do by traversing the HIRFunction and examining all places. We also need to track the computed effects of nested functions, and that's where the disjoint set of aliases comes in -- when performing the main algorithm, we might see a set of instructions like ``` $0 = Function (effect=ContextMutation) { ... } $1 = LoadLocal $0 $2 = Call $1 () ``` When examining the `Call` instruction, we need to know that $1 has the function effect [ContextMutation]. Since $0 and $1 were inferred to be aliased by IRE, we don't need to do any other propagation from $0 to $1 if we track the nested effects based on the root of the alias set { $0, $1 } rather than the specific identifier $1 present in the Call instruction. [ghstack-poisoned]