blob: 85a6c98aa0bbb5cee5fd445366ba569b814a32f7 [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 reducible one in decompression
// elimination.
bool IsReducibleConstantOpcode(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);
// Removes direct Compressions & Decompressions, analogously to ReduceCompress
Reduction ReduceDecompress(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_