Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index 8499b9925eaee3523628d2352cfdfc5ad2c626b6..3b4bb20b6070aae493695ef92de68a9c5b38a7bb 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -505,7 +505,9 @@ class ReachabilityAnalyzer BASE_EMBEDDED { |
void HGraph::Verify(bool do_full_verify) const { |
// Allow dereferencing for debug mode verification. |
- AllowHandleDereference allow_handle_deref(isolate()); |
+ Heap::RelocationLock(isolate()->heap()); |
+ HandleDereferenceGuard allow_handle_deref(isolate(), |
+ HandleDereferenceGuard::ALLOW); |
for (int i = 0; i < blocks_.length(); i++) { |
HBasicBlock* block = blocks_.at(i); |
@@ -585,18 +587,6 @@ void HGraph::Verify(bool do_full_verify) const { |
#endif |
-HConstant* HGraph::GetConstant(SetOncePointer<HConstant>* pointer, |
- Handle<Object> value) { |
- if (!pointer->is_set()) { |
- HConstant* constant = new(zone()) HConstant(value, |
- Representation::Tagged()); |
- constant->InsertAfter(GetConstantUndefined()); |
- pointer->set(constant); |
- } |
- return pointer->get(); |
-} |
- |
- |
HConstant* HGraph::GetConstantInt32(SetOncePointer<HConstant>* pointer, |
int32_t value) { |
if (!pointer->is_set()) { |
@@ -624,19 +614,27 @@ HConstant* HGraph::GetConstantMinus1() { |
} |
-HConstant* HGraph::GetConstantTrue() { |
- return GetConstant(&constant_true_, isolate()->factory()->true_value()); |
+#define DEFINE_GET_CONSTANT(Name, name, htype, boolean_value) \ |
+HConstant* HGraph::GetConstant##Name() { \ |
+ if (!constant_##name##_.is_set()) { \ |
+ HConstant* constant = new(zone()) HConstant( \ |
+ isolate()->factory()->name##_value(), \ |
+ Representation::Tagged(), \ |
+ htype, \ |
+ false, \ |
+ boolean_value); \ |
+ constant->InsertAfter(GetConstantUndefined()); \ |
+ constant_##name##_.set(constant); \ |
+ } \ |
+ return constant_##name##_.get(); \ |
} |
-HConstant* HGraph::GetConstantFalse() { |
- return GetConstant(&constant_false_, isolate()->factory()->false_value()); |
-} |
+DEFINE_GET_CONSTANT(True, true, HType::Boolean(), true) |
+DEFINE_GET_CONSTANT(False, false, HType::Boolean(), false) |
+DEFINE_GET_CONSTANT(Hole, the_hole, HType::Tagged(), false) |
- |
-HConstant* HGraph::GetConstantHole() { |
- return GetConstant(&constant_hole_, isolate()->factory()->the_hole_value()); |
-} |
+#undef DEFINE_GET_CONSTANT |
HGraphBuilder::CheckBuilder::CheckBuilder(HGraphBuilder* builder, BailoutId id) |
@@ -3711,7 +3709,7 @@ void TestContext::BuildBranch(HValue* value) { |
} |
if (value->IsConstant()) { |
HConstant* constant_value = HConstant::cast(value); |
- if (constant_value->ToBoolean()) { |
+ if (constant_value->BooleanValue()) { |
builder->current_block()->Goto(if_true(), builder->function_state()); |
} else { |
builder->current_block()->Goto(if_false(), builder->function_state()); |
@@ -3878,6 +3876,8 @@ bool HOptimizedGraphBuilder::BuildGraph() { |
void HGraph::GlobalValueNumbering() { |
// Perform common subexpression elimination and loop-invariant code motion. |
if (FLAG_use_gvn) { |
+ // We use objects' raw addresses for identification, so they must not move. |
+ Heap::RelocationLock relocation_lock(isolate()->heap()); |
HPhase phase("H_Global value numbering", this); |
HGlobalValueNumberer gvn(this, info()); |
bool removed_side_effects = gvn.Analyze(); |
@@ -9241,8 +9241,8 @@ void HOptimizedGraphBuilder::VisitLogicalExpression(BinaryOperation* expr) { |
if (left_value->IsConstant()) { |
HConstant* left_constant = HConstant::cast(left_value); |
- if ((is_logical_and && left_constant->ToBoolean()) || |
- (!is_logical_and && !left_constant->ToBoolean())) { |
+ if ((is_logical_and && left_constant->BooleanValue()) || |
+ (!is_logical_and && !left_constant->BooleanValue())) { |
Drop(1); // left_value. |
CHECK_BAILOUT(VisitForValue(expr->right())); |
} |
@@ -10578,13 +10578,17 @@ void HTracer::TraceCompilation(CompilationInfo* info) { |
void HTracer::TraceLithium(const char* name, LChunk* chunk) { |
- AllowHandleDereference allow_handle_deref(chunk->isolate()); |
+ ASSERT(!FLAG_parallel_recompilation); |
+ HandleDereferenceGuard allow_handle_deref(chunk->isolate(), |
+ HandleDereferenceGuard::ALLOW); |
Trace(name, chunk->graph(), chunk); |
} |
void HTracer::TraceHydrogen(const char* name, HGraph* graph) { |
- AllowHandleDereference allow_handle_deref(graph->isolate()); |
+ ASSERT(!FLAG_parallel_recompilation); |
+ HandleDereferenceGuard allow_handle_deref(graph->isolate(), |
+ HandleDereferenceGuard::ALLOW); |
Trace(name, graph, NULL); |
} |