blob: e223815bb56eed8096d084b28b3929e96a1248e0 [file] [log] [blame]
// 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 TypedStateValues's input decompressions with their parent 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_