// Copyright 2022 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_COMPILER_TURBOSHAFT_STRUCTURAL_OPTIMIZATION_REDUCER_H_ #define V8_COMPILER_TURBOSHAFT_STRUCTURAL_OPTIMIZATION_REDUCER_H_ #include <cstdio> #include "src/compiler/turboshaft/assembler.h" #include "src/compiler/turboshaft/index.h" #include "src/compiler/turboshaft/opmasks.h" #include "src/zone/zone.h" // The StructuralOptimizationReducer reducer is suitable for changing the // graph in a way that doesn't reduce individual operations, rather changes // the structure of the graph. // // We currently support a reduction which transforms if-else cascades // that check if a given value is equal to a 32-bit constant from a given set // into a switch with cases corresponding to the constants in the set. // // So for example code like: // [only pure ops 1] // if (x == 3) { // B1; // } else { // [only pure ops 2] // if (x == 5) { // B2; // } else { // B3; // } // } // // will be transformed to: // [only pure ops 1] // [only pure ops 2] // switch (x) { // case 3: // B1; // case 5: // B2; // default: // B3; // } // // Or represented graphically: // [only pure ops 1] // [only pure ops 1] [only pure ops 2] // x == 3 Switch(x) // Branch | | | // | | ----- | ------ // ----- ------ case 3 | | | default // | | | | | // T | | F v | | // v v B1 | v // B1 [only pure ops 2] becomes | B3 // x == 5 ======> case 5 | // Branch v // | | B2 // ----- ------ // | | // T | | F // v v // B2 B3 // // TODO(mslekova): Introduce a flag and move to a common graph place. // #define TRACE_REDUCTIONS #ifdef TRACE_REDUCTIONS #define TRACE … #else // TRACE_REDUCTIONS #define TRACE … #endif // TRACE_REDUCTIONS namespace v8::internal::compiler::turboshaft { template <class Next> class StructuralOptimizationReducer : public Next { … }; } // namespace v8::internal::compiler::turboshaft #undef TRACE #endif // V8_COMPILER_TURBOSHAFT_STRUCTURAL_OPTIMIZATION_REDUCER_H_