50 candidate_base_addrs_(zone),
54void WasmAddressReassociation::Optimize() {
55 for (
auto& candidate : candidates_) {
56 const CandidateAddressKey&
key = candidate.first;
57 if (!ShouldTryOptimize(
key))
continue;
63 Node* new_object = CreateNewBase(
key);
64 CandidateMemOps& mem_ops = candidate.second;
65 size_t num_nodes = mem_ops.GetNumNodes();
66 for (
size_t i = 0;
i < num_nodes; ++
i) {
67 Node* mem_op = mem_ops.mem_op(
i);
69 graph_->NewNode(common_->Int64Constant(mem_ops.imm_offset(
i)));
70 ReplaceInputs(mem_op, new_object, imm_offset);
75bool WasmAddressReassociation::ShouldTryOptimize(
83 return candidates_.at(
key).GetNumNodes() > 1;
89 Node* reg_offset = candidate_base_addr.
offset();
90 return graph_->NewNode(machine_->Int64Add(),
base, reg_offset);
93void WasmAddressReassociation::ReplaceInputs(
Node* mem_op,
Node*
base,
101void WasmAddressReassociation::VisitProtectedMemOp(
Node* node,
103 DCHECK(node->opcode() == IrOpcode::kProtectedLoad ||
104 node->opcode() == IrOpcode::kProtectedStore);
109 if (
base->opcode() == IrOpcode::kInt64Add &&
110 offset->opcode() == IrOpcode::kInt64Add) {
113 if (base_add.right().HasResolvedValue() &&
114 !base_add.left().HasResolvedValue() &&
115 offset_add.right().HasResolvedValue() &&
116 !offset_add.left().HasResolvedValue()) {
117 Node* base_reg = base_add.left().node();
118 Node* reg_offset = offset_add.left().node();
120 base_add.right().ResolvedValue() + offset_add.right().ResolvedValue();
121 return AddCandidate(node, base_reg, reg_offset, imm_offset, effect_chain);
124 if (
base->opcode() == IrOpcode::kInt64Add) {
125 Int64BinopMatcher base_add(
base);
126 if (base_add.right().HasResolvedValue() &&
127 !base_add.left().HasResolvedValue()) {
128 Node* base_reg = base_add.left().node();
129 Node* reg_offset = node->
InputAt(1);
130 int64_t imm_offset = base_add.right().ResolvedValue();
131 return AddCandidate(node, base_reg, reg_offset, imm_offset, effect_chain);
134 if (
offset->opcode() == IrOpcode::kInt64Add) {
136 if (offset_add.right().HasResolvedValue() &&
137 !offset_add.left().HasResolvedValue()) {
138 Node* base_reg = node->InputAt(0);
139 Node* reg_offset = offset_add.left().node();
140 int64_t imm_offset = offset_add.right().ResolvedValue();
141 return AddCandidate(node, base_reg, reg_offset, imm_offset, effect_chain);
151 if (
base->id() > reg_offset->
id()) {
152 std::swap(
base, reg_offset);
155 std::make_tuple(
base->id(), reg_offset->
id(), effect_chain);
160 : candidates_.find(
key);
161 it->second.AddCandidate(mem_op, imm_offset);
164bool WasmAddressReassociation::HasCandidateBaseAddr(
166 return candidate_base_addrs_.count(
key);
169void WasmAddressReassociation::CandidateMemOps::AddCandidate(
170 Node* mem_op, int64_t imm_offset) {
172 mem_op->
opcode() == IrOpcode::kProtectedStore);
173 mem_ops_.push_back(mem_op);
174 imm_offsets_.push_back(imm_offset);
177size_t WasmAddressReassociation::CandidateMemOps::GetNumNodes()
const {
178 DCHECK_EQ(mem_ops_.size(), imm_offsets_.size());
179 return mem_ops_.size();
182Node* WasmAddressReassociation::CandidateMemOps::mem_op(
size_t i)
const {
186int64_t WasmAddressReassociation::CandidateMemOps::imm_offset(
size_t i)
const {
187 return imm_offsets_[
i];
constexpr IrOpcode::Value opcode() const
void ReplaceInput(int index, Node *new_to)
Node * InputAt(int index) const
std::tuple< NodeId, NodeId, NodeId > CandidateAddressKey
WasmAddressReassociation(JSGraph *jsgraph, Zone *zone)
BinopMatcher< Int64Matcher, Int64Matcher, MachineRepresentation::kWord64 > Int64BinopMatcher
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
#define DCHECK_GT(v1, v2)
std::unique_ptr< ValueMirror > key