Commit a4353d14 authored by Jaroslav Sevcik's avatar Jaroslav Sevcik Committed by Commit Bot

[turbofan] Only lower to PoisonedLoads when --branch-load-poisoning is on.

Change-Id: I618e357ea0d00b64dd4d8a54e865bed716a460e8
Bug: chromium:798964
Reviewed-on: https://chromium-review.googlesource.com/947963Reviewed-by: 's avatarBenedikt Meurer <bmeurer@chromium.org>
Commit-Queue: Jaroslav Sevcik <jarin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#51716}
parent bd6b04fa
......@@ -460,8 +460,8 @@ void InstructionSelector::VisitLoad(Node* node) {
UNREACHABLE();
return;
}
if (node->opcode() == IrOpcode::kPoisonedLoad &&
load_poisoning_ == LoadPoisoning::kDoPoison) {
if (node->opcode() == IrOpcode::kPoisonedLoad) {
CHECK_EQ(load_poisoning_, LoadPoisoning::kDoPoison);
opcode |= MiscField::encode(kMemoryAccessPoisoned);
}
......
......@@ -629,8 +629,8 @@ void InstructionSelector::VisitLoad(Node* node) {
UNREACHABLE();
return;
}
if (node->opcode() == IrOpcode::kPoisonedLoad &&
load_poisoning_ == LoadPoisoning::kDoPoison) {
if (node->opcode() == IrOpcode::kPoisonedLoad) {
CHECK_EQ(load_poisoning_, LoadPoisoning::kDoPoison);
opcode |= MiscField::encode(kMemoryAccessPoisoned);
}
......
......@@ -511,6 +511,10 @@ class V8_EXPORT_PRIVATE CommonOperatorBuilder final
DISALLOW_COPY_AND_ASSIGN(CommonOperatorBuilder);
};
// This should go into some common compiler header, but we do not have such a
// thing at the moment.
enum class LoadPoisoning { kDoPoison, kDontPoison };
} // namespace compiler
} // namespace internal
} // namespace v8
......
......@@ -287,8 +287,8 @@ void InstructionSelector::VisitLoad(Node* node) {
AddressingMode mode =
g.GetEffectiveAddressMemoryOperand(node, inputs, &input_count);
InstructionCode code = opcode | AddressingModeField::encode(mode);
if (node->opcode() == IrOpcode::kPoisonedLoad &&
load_poisoning_ == LoadPoisoning::kDoPoison) {
if (node->opcode() == IrOpcode::kPoisonedLoad) {
CHECK_EQ(load_poisoning_, LoadPoisoning::kDoPoison);
code |= MiscField::encode(kMemoryAccessPoisoned);
}
Emit(code, 1, outputs, input_count, inputs);
......
......@@ -1664,8 +1664,6 @@ struct PrintableInstructionSequence {
V8_EXPORT_PRIVATE std::ostream& operator<<(
std::ostream& os, const PrintableInstructionSequence& code);
enum class LoadPoisoning { kDoPoison, kDontPoison };
} // namespace compiler
} // namespace internal
} // namespace v8
......
......@@ -15,13 +15,15 @@ namespace v8 {
namespace internal {
namespace compiler {
MemoryOptimizer::MemoryOptimizer(JSGraph* jsgraph, Zone* zone)
MemoryOptimizer::MemoryOptimizer(JSGraph* jsgraph, Zone* zone,
LoadPoisoning load_poisoning)
: jsgraph_(jsgraph),
empty_state_(AllocationState::Empty(zone)),
pending_(zone),
tokens_(zone),
zone_(zone),
graph_assembler_(jsgraph, nullptr, nullptr, zone) {}
graph_assembler_(jsgraph, nullptr, nullptr, zone),
load_poisoning_(load_poisoning) {}
void MemoryOptimizer::Optimize() {
EnqueueUses(graph()->start(), empty_state());
......@@ -348,12 +350,13 @@ void MemoryOptimizer::VisitLoadElement(Node* node,
ElementAccess const& access = ElementAccessOf(node->op());
Node* index = node->InputAt(1);
node->ReplaceInput(1, ComputeIndex(access, index));
if (access.machine_type.representation() ==
MachineRepresentation::kTaggedPointer) {
NodeProperties::ChangeOp(node, machine()->Load(access.machine_type));
} else {
if (load_poisoning_ == LoadPoisoning::kDoPoison &&
access.machine_type.representation() !=
MachineRepresentation::kTaggedPointer) {
NodeProperties::ChangeOp(node,
machine()->PoisonedLoad(access.machine_type));
} else {
NodeProperties::ChangeOp(node, machine()->Load(access.machine_type));
}
EnqueueUses(node, state);
}
......@@ -363,12 +366,13 @@ void MemoryOptimizer::VisitLoadField(Node* node, AllocationState const* state) {
FieldAccess const& access = FieldAccessOf(node->op());
Node* offset = jsgraph()->IntPtrConstant(access.offset - access.tag());
node->InsertInput(graph()->zone(), 1, offset);
if (access.machine_type.representation() ==
MachineRepresentation::kTaggedPointer) {
NodeProperties::ChangeOp(node, machine()->Load(access.machine_type));
} else {
if (load_poisoning_ == LoadPoisoning::kDoPoison &&
access.machine_type.representation() !=
MachineRepresentation::kTaggedPointer) {
NodeProperties::ChangeOp(node,
machine()->PoisonedLoad(access.machine_type));
} else {
NodeProperties::ChangeOp(node, machine()->Load(access.machine_type));
}
EnqueueUses(node, state);
}
......
......@@ -31,7 +31,7 @@ typedef uint32_t NodeId;
// implicitly.
class MemoryOptimizer final {
public:
MemoryOptimizer(JSGraph* jsgraph, Zone* zone);
MemoryOptimizer(JSGraph* jsgraph, Zone* zone, LoadPoisoning load_poisoning);
~MemoryOptimizer() {}
void Optimize();
......@@ -142,6 +142,7 @@ class MemoryOptimizer final {
ZoneQueue<Token> tokens_;
Zone* const zone_;
GraphAssembler graph_assembler_;
LoadPoisoning load_poisoning_;
DISALLOW_IMPLICIT_CONSTRUCTORS(MemoryOptimizer);
};
......
......@@ -296,8 +296,8 @@ void InstructionSelector::VisitLoad(Node* node) {
UNREACHABLE();
return;
}
if (node->opcode() == IrOpcode::kPoisonedLoad &&
load_poisoning_ == LoadPoisoning::kDoPoison) {
if (node->opcode() == IrOpcode::kPoisonedLoad) {
CHECK_EQ(load_poisoning_, LoadPoisoning::kDoPoison);
opcode |= MiscField::encode(kMemoryAccessPoisoned);
}
......
......@@ -410,8 +410,8 @@ void InstructionSelector::VisitLoad(Node* node) {
UNREACHABLE();
return;
}
if (node->opcode() == IrOpcode::kPoisonedLoad &&
load_poisoning_ == LoadPoisoning::kDoPoison) {
if (node->opcode() == IrOpcode::kPoisonedLoad) {
CHECK_EQ(load_poisoning_, LoadPoisoning::kDoPoison);
opcode |= MiscField::encode(kMemoryAccessPoisoned);
}
......
......@@ -1472,7 +1472,10 @@ struct MemoryOptimizationPhase {
trimmer.TrimGraph(roots.begin(), roots.end());
// Optimize allocations and load/store operations.
MemoryOptimizer optimizer(data->jsgraph(), temp_zone);
MemoryOptimizer optimizer(data->jsgraph(), temp_zone,
data->info()->is_poison_loads()
? LoadPoisoning::kDoPoison
: LoadPoisoning::kDontPoison);
optimizer.Optimize();
}
};
......
......@@ -727,8 +727,8 @@ void InstructionSelector::VisitLoad(Node* node) {
AddressingMode mode =
g.GetEffectiveAddressMemoryOperand(node, inputs, &input_count);
opcode |= AddressingModeField::encode(mode);
if (node->opcode() == IrOpcode::kPoisonedLoad &&
load_poisoning_ == LoadPoisoning::kDoPoison) {
if (node->opcode() == IrOpcode::kPoisonedLoad) {
CHECK_EQ(load_poisoning_, LoadPoisoning::kDoPoison);
opcode |= MiscField::encode(kMemoryAccessPoisoned);
}
......
......@@ -308,8 +308,8 @@ void InstructionSelector::VisitLoad(Node* node) {
InstructionCode code = opcode | AddressingModeField::encode(mode);
if (node->opcode() == IrOpcode::kProtectedLoad) {
code |= MiscField::encode(kMemoryAccessProtected);
} else if (node->opcode() == IrOpcode::kPoisonedLoad &&
load_poisoning_ == LoadPoisoning::kDoPoison) {
} else if (node->opcode() == IrOpcode::kPoisonedLoad) {
CHECK_EQ(load_poisoning_, LoadPoisoning::kDoPoison);
code |= MiscField::encode(kMemoryAccessPoisoned);
}
Emit(code, 1, outputs, input_count, inputs);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment