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) { ...@@ -460,8 +460,8 @@ void InstructionSelector::VisitLoad(Node* node) {
UNREACHABLE(); UNREACHABLE();
return; return;
} }
if (node->opcode() == IrOpcode::kPoisonedLoad && if (node->opcode() == IrOpcode::kPoisonedLoad) {
load_poisoning_ == LoadPoisoning::kDoPoison) { CHECK_EQ(load_poisoning_, LoadPoisoning::kDoPoison);
opcode |= MiscField::encode(kMemoryAccessPoisoned); opcode |= MiscField::encode(kMemoryAccessPoisoned);
} }
......
...@@ -629,8 +629,8 @@ void InstructionSelector::VisitLoad(Node* node) { ...@@ -629,8 +629,8 @@ void InstructionSelector::VisitLoad(Node* node) {
UNREACHABLE(); UNREACHABLE();
return; return;
} }
if (node->opcode() == IrOpcode::kPoisonedLoad && if (node->opcode() == IrOpcode::kPoisonedLoad) {
load_poisoning_ == LoadPoisoning::kDoPoison) { CHECK_EQ(load_poisoning_, LoadPoisoning::kDoPoison);
opcode |= MiscField::encode(kMemoryAccessPoisoned); opcode |= MiscField::encode(kMemoryAccessPoisoned);
} }
......
...@@ -511,6 +511,10 @@ class V8_EXPORT_PRIVATE CommonOperatorBuilder final ...@@ -511,6 +511,10 @@ class V8_EXPORT_PRIVATE CommonOperatorBuilder final
DISALLOW_COPY_AND_ASSIGN(CommonOperatorBuilder); 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 compiler
} // namespace internal } // namespace internal
} // namespace v8 } // namespace v8
......
...@@ -287,8 +287,8 @@ void InstructionSelector::VisitLoad(Node* node) { ...@@ -287,8 +287,8 @@ void InstructionSelector::VisitLoad(Node* node) {
AddressingMode mode = AddressingMode mode =
g.GetEffectiveAddressMemoryOperand(node, inputs, &input_count); g.GetEffectiveAddressMemoryOperand(node, inputs, &input_count);
InstructionCode code = opcode | AddressingModeField::encode(mode); InstructionCode code = opcode | AddressingModeField::encode(mode);
if (node->opcode() == IrOpcode::kPoisonedLoad && if (node->opcode() == IrOpcode::kPoisonedLoad) {
load_poisoning_ == LoadPoisoning::kDoPoison) { CHECK_EQ(load_poisoning_, LoadPoisoning::kDoPoison);
code |= MiscField::encode(kMemoryAccessPoisoned); code |= MiscField::encode(kMemoryAccessPoisoned);
} }
Emit(code, 1, outputs, input_count, inputs); Emit(code, 1, outputs, input_count, inputs);
......
...@@ -1664,8 +1664,6 @@ struct PrintableInstructionSequence { ...@@ -1664,8 +1664,6 @@ struct PrintableInstructionSequence {
V8_EXPORT_PRIVATE std::ostream& operator<<( V8_EXPORT_PRIVATE std::ostream& operator<<(
std::ostream& os, const PrintableInstructionSequence& code); std::ostream& os, const PrintableInstructionSequence& code);
enum class LoadPoisoning { kDoPoison, kDontPoison };
} // namespace compiler } // namespace compiler
} // namespace internal } // namespace internal
} // namespace v8 } // namespace v8
......
...@@ -15,13 +15,15 @@ namespace v8 { ...@@ -15,13 +15,15 @@ namespace v8 {
namespace internal { namespace internal {
namespace compiler { namespace compiler {
MemoryOptimizer::MemoryOptimizer(JSGraph* jsgraph, Zone* zone) MemoryOptimizer::MemoryOptimizer(JSGraph* jsgraph, Zone* zone,
LoadPoisoning load_poisoning)
: jsgraph_(jsgraph), : jsgraph_(jsgraph),
empty_state_(AllocationState::Empty(zone)), empty_state_(AllocationState::Empty(zone)),
pending_(zone), pending_(zone),
tokens_(zone), tokens_(zone),
zone_(zone), zone_(zone),
graph_assembler_(jsgraph, nullptr, nullptr, zone) {} graph_assembler_(jsgraph, nullptr, nullptr, zone),
load_poisoning_(load_poisoning) {}
void MemoryOptimizer::Optimize() { void MemoryOptimizer::Optimize() {
EnqueueUses(graph()->start(), empty_state()); EnqueueUses(graph()->start(), empty_state());
...@@ -348,12 +350,13 @@ void MemoryOptimizer::VisitLoadElement(Node* node, ...@@ -348,12 +350,13 @@ void MemoryOptimizer::VisitLoadElement(Node* node,
ElementAccess const& access = ElementAccessOf(node->op()); ElementAccess const& access = ElementAccessOf(node->op());
Node* index = node->InputAt(1); Node* index = node->InputAt(1);
node->ReplaceInput(1, ComputeIndex(access, index)); node->ReplaceInput(1, ComputeIndex(access, index));
if (access.machine_type.representation() == if (load_poisoning_ == LoadPoisoning::kDoPoison &&
MachineRepresentation::kTaggedPointer) { access.machine_type.representation() !=
NodeProperties::ChangeOp(node, machine()->Load(access.machine_type)); MachineRepresentation::kTaggedPointer) {
} else {
NodeProperties::ChangeOp(node, NodeProperties::ChangeOp(node,
machine()->PoisonedLoad(access.machine_type)); machine()->PoisonedLoad(access.machine_type));
} else {
NodeProperties::ChangeOp(node, machine()->Load(access.machine_type));
} }
EnqueueUses(node, state); EnqueueUses(node, state);
} }
...@@ -363,12 +366,13 @@ void MemoryOptimizer::VisitLoadField(Node* node, AllocationState const* state) { ...@@ -363,12 +366,13 @@ void MemoryOptimizer::VisitLoadField(Node* node, AllocationState const* state) {
FieldAccess const& access = FieldAccessOf(node->op()); FieldAccess const& access = FieldAccessOf(node->op());
Node* offset = jsgraph()->IntPtrConstant(access.offset - access.tag()); Node* offset = jsgraph()->IntPtrConstant(access.offset - access.tag());
node->InsertInput(graph()->zone(), 1, offset); node->InsertInput(graph()->zone(), 1, offset);
if (access.machine_type.representation() == if (load_poisoning_ == LoadPoisoning::kDoPoison &&
MachineRepresentation::kTaggedPointer) { access.machine_type.representation() !=
NodeProperties::ChangeOp(node, machine()->Load(access.machine_type)); MachineRepresentation::kTaggedPointer) {
} else {
NodeProperties::ChangeOp(node, NodeProperties::ChangeOp(node,
machine()->PoisonedLoad(access.machine_type)); machine()->PoisonedLoad(access.machine_type));
} else {
NodeProperties::ChangeOp(node, machine()->Load(access.machine_type));
} }
EnqueueUses(node, state); EnqueueUses(node, state);
} }
......
...@@ -31,7 +31,7 @@ typedef uint32_t NodeId; ...@@ -31,7 +31,7 @@ typedef uint32_t NodeId;
// implicitly. // implicitly.
class MemoryOptimizer final { class MemoryOptimizer final {
public: public:
MemoryOptimizer(JSGraph* jsgraph, Zone* zone); MemoryOptimizer(JSGraph* jsgraph, Zone* zone, LoadPoisoning load_poisoning);
~MemoryOptimizer() {} ~MemoryOptimizer() {}
void Optimize(); void Optimize();
...@@ -142,6 +142,7 @@ class MemoryOptimizer final { ...@@ -142,6 +142,7 @@ class MemoryOptimizer final {
ZoneQueue<Token> tokens_; ZoneQueue<Token> tokens_;
Zone* const zone_; Zone* const zone_;
GraphAssembler graph_assembler_; GraphAssembler graph_assembler_;
LoadPoisoning load_poisoning_;
DISALLOW_IMPLICIT_CONSTRUCTORS(MemoryOptimizer); DISALLOW_IMPLICIT_CONSTRUCTORS(MemoryOptimizer);
}; };
......
...@@ -296,8 +296,8 @@ void InstructionSelector::VisitLoad(Node* node) { ...@@ -296,8 +296,8 @@ void InstructionSelector::VisitLoad(Node* node) {
UNREACHABLE(); UNREACHABLE();
return; return;
} }
if (node->opcode() == IrOpcode::kPoisonedLoad && if (node->opcode() == IrOpcode::kPoisonedLoad) {
load_poisoning_ == LoadPoisoning::kDoPoison) { CHECK_EQ(load_poisoning_, LoadPoisoning::kDoPoison);
opcode |= MiscField::encode(kMemoryAccessPoisoned); opcode |= MiscField::encode(kMemoryAccessPoisoned);
} }
......
...@@ -410,8 +410,8 @@ void InstructionSelector::VisitLoad(Node* node) { ...@@ -410,8 +410,8 @@ void InstructionSelector::VisitLoad(Node* node) {
UNREACHABLE(); UNREACHABLE();
return; return;
} }
if (node->opcode() == IrOpcode::kPoisonedLoad && if (node->opcode() == IrOpcode::kPoisonedLoad) {
load_poisoning_ == LoadPoisoning::kDoPoison) { CHECK_EQ(load_poisoning_, LoadPoisoning::kDoPoison);
opcode |= MiscField::encode(kMemoryAccessPoisoned); opcode |= MiscField::encode(kMemoryAccessPoisoned);
} }
......
...@@ -1472,7 +1472,10 @@ struct MemoryOptimizationPhase { ...@@ -1472,7 +1472,10 @@ struct MemoryOptimizationPhase {
trimmer.TrimGraph(roots.begin(), roots.end()); trimmer.TrimGraph(roots.begin(), roots.end());
// Optimize allocations and load/store operations. // 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(); optimizer.Optimize();
} }
}; };
......
...@@ -727,8 +727,8 @@ void InstructionSelector::VisitLoad(Node* node) { ...@@ -727,8 +727,8 @@ void InstructionSelector::VisitLoad(Node* node) {
AddressingMode mode = AddressingMode mode =
g.GetEffectiveAddressMemoryOperand(node, inputs, &input_count); g.GetEffectiveAddressMemoryOperand(node, inputs, &input_count);
opcode |= AddressingModeField::encode(mode); opcode |= AddressingModeField::encode(mode);
if (node->opcode() == IrOpcode::kPoisonedLoad && if (node->opcode() == IrOpcode::kPoisonedLoad) {
load_poisoning_ == LoadPoisoning::kDoPoison) { CHECK_EQ(load_poisoning_, LoadPoisoning::kDoPoison);
opcode |= MiscField::encode(kMemoryAccessPoisoned); opcode |= MiscField::encode(kMemoryAccessPoisoned);
} }
......
...@@ -308,8 +308,8 @@ void InstructionSelector::VisitLoad(Node* node) { ...@@ -308,8 +308,8 @@ void InstructionSelector::VisitLoad(Node* node) {
InstructionCode code = opcode | AddressingModeField::encode(mode); InstructionCode code = opcode | AddressingModeField::encode(mode);
if (node->opcode() == IrOpcode::kProtectedLoad) { if (node->opcode() == IrOpcode::kProtectedLoad) {
code |= MiscField::encode(kMemoryAccessProtected); code |= MiscField::encode(kMemoryAccessProtected);
} else if (node->opcode() == IrOpcode::kPoisonedLoad && } else if (node->opcode() == IrOpcode::kPoisonedLoad) {
load_poisoning_ == LoadPoisoning::kDoPoison) { CHECK_EQ(load_poisoning_, LoadPoisoning::kDoPoison);
code |= MiscField::encode(kMemoryAccessPoisoned); code |= MiscField::encode(kMemoryAccessPoisoned);
} }
Emit(code, 1, outputs, input_count, inputs); 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