Thanks Darius for the such a detailed explanation! On Thursday, November 23, 2023 at 4:40:29 PM UTC+8 dmerc...@google.com wrote:
> Hi, > > First: a Turboshaft phase that uses OptimizationPhase creates a copy of > the graph. The old graph is referred to as input_graph and the newly > created graph is the output_graph. This works by reducing each operation > one by one (where each reduction creates a new operation in the > output_graph), always reducing the inputs before their uses. > > REDUCE_INPUT_GRAPH takes as argument the Operation and OpIndex from the > input_graph. This is usually used for reducers that analyse the graph > beforehand, since a common way to store the result of an analysis is a map > OpIndex->Data (we usually use an OpIndexSideTable for this ( > https://source.chromium.org/chromium/chromium/src/+/main:v8/src/compiler/turboshaft/sidetable.h;l=183;drc=3509554952d382190091b85b2331da874e026a21)). > > An example is StoreStoreElimination ( > https://source.chromium.org/chromium/chromium/src/+/main:v8/src/compiler/turboshaft/store-store-elimination-reducer.h), > > which analyses the input_graph to figure out which stores can be removed, > and has a ZoneSet<OpIndex> containing the stores that can be removed (see > https://source.chromium.org/chromium/chromium/src/+/main:v8/src/compiler/turboshaft/store-store-elimination-reducer.h;l=381-386;drc=fa7521ef3eb6c69fa398809e7ce4a869c94661fa > ). > > REDUCE takes as argument the already lowered arguments of the operation > (the same arguments as the constructor). This means that the OpIndex > arguments of REDUCE belong to the output_graph rather than the input_graph. > This is typically useful when a lowering/reduction is only based on what > the inputs of the operation are, but not on information further away down > the graph. For instance, MachineLoweringReducer ( > https://crsrc.org/c/v8/src/compiler/turboshaft/machine-lowering-reducer-inl.h) > > lowers Simplified operations to Machine operations, which doesn't require > any knowledge beyond the inputs of each operation, and thus uses REDUCE > methods. > > REDUCE methods can't easily look down the graph, because their inputs > belong to the output_graph, but next operations of the input_graph haven't > been lowered yet, so they don't appear in the output_graph yet. > > There are some exceptions, and in particular BranchEliminationReducer uses > REDUCE method, but still looks ahead in the input_graph (see its > REDUCE(Goto) method for instance > https://source.chromium.org/chromium/chromium/src/+/main:v8/src/compiler/turboshaft/branch-elimination-reducer.h;l=290-363;drc=b8997b5668474283e3ecbcf6dcc6538565ef2cc5), > > but this is a special case: BranchElimination needs to know both what an > operation was reduced to, and what comes next in the graph. > > FYI, the link between REDUCE_INPUT_GRAPH and REDUCE is done > in ReducerBaseForwarder ( > https://source.chromium.org/chromium/chromium/src/+/main:v8/src/compiler/turboshaft/assembler.h;l=654;drc=1753b83910819bce453d453b054e9f5b4924bbf8), > > which calls AssembleOutputGraphXXX from optimization-phase.h (for instance, > see AssembleOutputGraphWordBinop: > https://source.chromium.org/chromium/chromium/src/+/main:v8/src/compiler/turboshaft/optimization-phase.h;l=948-949;drc=2054c8f629321b0789f72e751c3813aec6539008), > > which maps the OpIndex inputs to the new graph and calls ReduceXXX. > > I hope that helps, let us know if you have other questions or need more > details. Also, feel free to let us know what optimization/reducer/lowering > you're trying to implement, so that we can give a more focused reply :) > > Cheers, > Darius > > On Thursday, November 23, 2023 at 9:21:46 AM UTC+1 jianx...@intel.com > wrote: > >> Hi everyone, >> >> I am working on adding a new phase in turboshaft, but I can't understand >> the difference between REDUCE(operation) and REDUCE_INPUT_GRAPH(operation) >> and can't make sure which one to use. Do you have any suggestions? >> >> Thanks! >> > -- -- v8-dev mailing list v8-dev@googlegroups.com http://groups.google.com/group/v8-dev --- You received this message because you are subscribed to the Google Groups "v8-dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to v8-dev+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/v8-dev/7d6114e1-d7f4-4130-bdd7-596a1f4f12cdn%40googlegroups.com.