// Copyright 2019 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_DECOMPRESSION_ELIMINATION_H_
#define V8_COMPILER_DECOMPRESSION_ELIMINATION_H_

#include "src/compiler/common-operator.h"
#include "src/compiler/graph-reducer.h"
#include "src/compiler/graph.h"
#include "src/compiler/machine-operator.h"

namespace v8 {
namespace internal {
namespace compiler {

// Performs elimination of redundant decompressions within the graph.
class V8_EXPORT_PRIVATE DecompressionElimination final
    : public NON_EXPORTED_BASE(AdvancedReducer) {
 public:
  explicit DecompressionElimination(Editor* editor, Graph* graph,
                                    MachineOperatorBuilder* machine,
                                    CommonOperatorBuilder* common);
  ~DecompressionElimination() final = default;

  const char* reducer_name() const override {
    return "DecompressionElimination";
  }

  Reduction Reduce(Node* node) final;

 private:
  // Returns true if the decompress opcode is valid for the compressed one.
  bool IsValidDecompress(IrOpcode::Value compressOpcode,
                         IrOpcode::Value decompressOpcode);

  // Returns true if the constant opcode is a reduceable one in decompression
  // elimination.
  bool IsReduceableConstantOpcode(IrOpcode::Value opcode);

  // Get the new 32 bit node constant given the 64 bit one
  Node* GetCompressedConstant(Node* constant);

  // Removes direct Decompressions & Compressions, going from
  //     Parent <- Decompression <- Compression <- Child
  // to
  //     Parent <- Child
  // Can be used for Any, Signed, and Pointer compressions.
  Reduction ReduceCompress(Node* node);

  // Replaces Phi's input decompressions with their input node, if and only if
  // all of the Phi's inputs are Decompress nodes.
  Reduction ReducePhi(Node* node);

  // Replaces TypedStateValues's input decompressions with their input node.
  Reduction ReduceTypedStateValues(Node* node);

  // Replaces a Word64Equal with a Word32Equal if both of its inputs are
  // Decompress nodes, or if one is a Decompress node and the other a constant.
  // In the case of two decompresses, it uses the original inputs before they
  // are decompressed. In the case of having a constant, it uses the compressed
  // value of that constant.
  Reduction ReduceWord64Equal(Node* node);

  Graph* graph() const { return graph_; }
  MachineOperatorBuilder* machine() const { return machine_; }
  CommonOperatorBuilder* common() const { return common_; }

  Graph* const graph_;
  MachineOperatorBuilder* const machine_;
  CommonOperatorBuilder* const common_;
};

}  // namespace compiler
}  // namespace internal
}  // namespace v8

#endif  // V8_COMPILER_DECOMPRESSION_ELIMINATION_H_
