Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index ba6c6f5c9ce11169e7e6f1ff396b7f1e929157aa..ab61ef761218b4908ad321a352583ddd82a2e310 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -1150,14 +1150,39 @@ void HRangeAnalysis::AddRange(HValue* value, Range* range) { |
void TraceGVN(const char* msg, ...) { |
- if (FLAG_trace_gvn) { |
- va_list arguments; |
- va_start(arguments, msg); |
- OS::VPrint(msg, arguments); |
- va_end(arguments); |
- } |
+ va_list arguments; |
+ va_start(arguments, msg); |
+ OS::VPrint(msg, arguments); |
+ va_end(arguments); |
} |
+// Wrap TraceGVN in macros to avoid the expense of evaluating its arguments when |
+// --trace-gvn is off. |
+#define TRACE_GVN_1(msg, a1) \ |
+ if (FLAG_trace_gvn) { \ |
+ TraceGVN(msg, a1); \ |
+ } |
+ |
+#define TRACE_GVN_2(msg, a1, a2) \ |
+ if (FLAG_trace_gvn) { \ |
+ TraceGVN(msg, a1, a2); \ |
+ } |
+ |
+#define TRACE_GVN_3(msg, a1, a2, a3) \ |
+ if (FLAG_trace_gvn) { \ |
+ TraceGVN(msg, a1, a2, a3); \ |
+ } |
+ |
+#define TRACE_GVN_4(msg, a1, a2, a3, a4) \ |
+ if (FLAG_trace_gvn) { \ |
+ TraceGVN(msg, a1, a2, a3, a4); \ |
+ } |
+ |
+#define TRACE_GVN_5(msg, a1, a2, a3, a4, a5) \ |
+ if (FLAG_trace_gvn) { \ |
+ TraceGVN(msg, a1, a2, a3, a4, a5); \ |
+ } |
+ |
HValueMap::HValueMap(Zone* zone, const HValueMap* other) |
: array_size_(other->array_size_), |
@@ -1643,9 +1668,9 @@ void HGlobalValueNumberer::LoopInvariantCodeMotion() { |
HBasicBlock* block = graph_->blocks()->at(i); |
if (block->IsLoopHeader()) { |
GVNFlagSet side_effects = loop_side_effects_[block->block_id()]; |
- TraceGVN("Try loop invariant motion for block B%d %s\n", |
- block->block_id(), |
- *GetGVNFlagsString(side_effects)); |
+ TRACE_GVN_2("Try loop invariant motion for block B%d %s\n", |
+ block->block_id(), |
+ *GetGVNFlagsString(side_effects)); |
GVNFlagSet accumulated_first_time_depends; |
GVNFlagSet accumulated_first_time_changes; |
@@ -1668,19 +1693,19 @@ void HGlobalValueNumberer::ProcessLoopBlock( |
GVNFlagSet* first_time_changes) { |
HBasicBlock* pre_header = loop_header->predecessors()->at(0); |
GVNFlagSet depends_flags = HValue::ConvertChangesToDependsFlags(loop_kills); |
- TraceGVN("Loop invariant motion for B%d %s\n", |
- block->block_id(), |
- *GetGVNFlagsString(depends_flags)); |
+ TRACE_GVN_2("Loop invariant motion for B%d %s\n", |
+ block->block_id(), |
+ *GetGVNFlagsString(depends_flags)); |
HInstruction* instr = block->first(); |
while (instr != NULL) { |
HInstruction* next = instr->next(); |
bool hoisted = false; |
if (instr->CheckFlag(HValue::kUseGVN)) { |
- TraceGVN("Checking instruction %d (%s) %s. Loop %s\n", |
- instr->id(), |
- instr->Mnemonic(), |
- *GetGVNFlagsString(instr->gvn_flags()), |
- *GetGVNFlagsString(loop_kills)); |
+ TRACE_GVN_4("Checking instruction %d (%s) %s. Loop %s\n", |
+ instr->id(), |
+ instr->Mnemonic(), |
+ *GetGVNFlagsString(instr->gvn_flags()), |
+ *GetGVNFlagsString(loop_kills)); |
bool can_hoist = !instr->gvn_flags().ContainsAnyOf(depends_flags); |
if (instr->IsTransitionElementsKind()) { |
// It's possible to hoist transitions out of a loop as long as the |
@@ -1703,15 +1728,19 @@ void HGlobalValueNumberer::ProcessLoopBlock( |
if (trans->transitioned_map()->has_fast_double_elements()) { |
hoist_change_blockers.Add(kChangesArrayElements); |
} |
- TraceGVN("Checking dependencies on HTransitionElementsKind %d (%s) " |
- "hoist blockers: %s %s; " |
- "first-time accumulated: %s %s\n", |
- instr->id(), |
- instr->Mnemonic(), |
- *GetGVNFlagsString(hoist_depends_blockers), |
- *GetGVNFlagsString(hoist_change_blockers), |
- *GetGVNFlagsString(*first_time_depends), |
- *GetGVNFlagsString(*first_time_changes)); |
+ if (FLAG_trace_gvn) { |
+ GVNFlagSet hoist_blockers = hoist_depends_blockers; |
+ hoist_blockers.Add(hoist_change_blockers); |
+ GVNFlagSet first_time = *first_time_changes; |
+ first_time.Add(*first_time_depends); |
+ TRACE_GVN_4("Checking dependencies on HTransitionElementsKind " |
+ "%d (%s) hoist blockers: %s; " |
+ "first-time accumulated: %s\n", |
+ instr->id(), |
+ instr->Mnemonic(), |
+ *GetGVNFlagsString(hoist_blockers), |
+ *GetGVNFlagsString(first_time)); |
+ } |
// It's possible to hoist transition from the current loop loop only if |
// they dominate all of the successor blocks in the same loop and there |
// are not any instructions that have Changes/DependsOn that intervene |
@@ -1734,7 +1763,7 @@ void HGlobalValueNumberer::ProcessLoopBlock( |
} |
if (inputs_loop_invariant && ShouldMove(instr, loop_header)) { |
- TraceGVN("Hoisting loop invariant instruction %d\n", instr->id()); |
+ TRACE_GVN_1("Hoisting loop invariant instruction %d\n", instr->id()); |
// Move the instruction out of the loop. |
instr->Unlink(); |
instr->InsertBefore(pre_header->end()); |
@@ -1751,12 +1780,12 @@ void HGlobalValueNumberer::ProcessLoopBlock( |
first_time_depends->Add(instr->DependsOnFlags()); |
first_time_changes->Add(instr->ChangesFlags()); |
if (!(previous_depends == *first_time_depends)) { |
- TraceGVN("Updated first-time accumulated %s\n", |
- *GetGVNFlagsString(*first_time_depends)); |
+ TRACE_GVN_1("Updated first-time accumulated %s\n", |
+ *GetGVNFlagsString(*first_time_depends)); |
} |
if (!(previous_changes == *first_time_changes)) { |
- TraceGVN("Updated first-time accumulated %s\n", |
- *GetGVNFlagsString(*first_time_changes)); |
+ TRACE_GVN_1("Updated first-time accumulated %s\n", |
+ *GetGVNFlagsString(*first_time_changes)); |
} |
} |
instr = next; |
@@ -1800,9 +1829,9 @@ GVNFlagSet HGlobalValueNumberer::CollectSideEffectsOnPathsToDominatedBlock( |
void HGlobalValueNumberer::AnalyzeBlock(HBasicBlock* block, |
HValueMap* map, |
HSideEffectMap* dominators) { |
- TraceGVN("Analyzing block B%d%s\n", |
- block->block_id(), |
- block->IsLoopHeader() ? " (loop header)" : ""); |
+ TRACE_GVN_2("Analyzing block B%d%s\n", |
+ block->block_id(), |
+ block->IsLoopHeader() ? " (loop header)" : ""); |
// If this is a loop header kill everything killed by the loop. |
if (block->IsLoopHeader()) { |
@@ -1819,18 +1848,19 @@ void HGlobalValueNumberer::AnalyzeBlock(HBasicBlock* block, |
// Store instruction as the dominating one for tracked side effects. |
map->Kill(flags); |
dominators->Store(flags, instr); |
- TraceGVN("Instruction %d kills\n", instr->id()); |
+ TRACE_GVN_2("Instruction %d %s\n", instr->id(), |
+ *GetGVNFlagsString(flags)); |
} |
if (instr->CheckFlag(HValue::kUseGVN)) { |
ASSERT(!instr->HasObservableSideEffects()); |
HValue* other = map->Lookup(instr); |
if (other != NULL) { |
ASSERT(instr->Equals(other) && other->Equals(instr)); |
- TraceGVN("Replacing value %d (%s) with value %d (%s)\n", |
- instr->id(), |
- instr->Mnemonic(), |
- other->id(), |
- other->Mnemonic()); |
+ TRACE_GVN_4("Replacing value %d (%s) with value %d (%s)\n", |
+ instr->id(), |
+ instr->Mnemonic(), |
+ other->id(), |
+ other->Mnemonic()); |
if (instr->HasSideEffects()) removed_side_effects_ = true; |
instr->DeleteAndReplaceWith(other); |
} else { |
@@ -1844,12 +1874,12 @@ void HGlobalValueNumberer::AnalyzeBlock(HBasicBlock* block, |
GVNFlag depends_on_flag = HValue::DependsOnFlagFromInt(i); |
if (instr->DependsOnFlags().Contains(depends_on_flag) && |
(other != NULL)) { |
- TraceGVN("Side-effect #%d in %d (%s) is dominated by %d (%s)\n", |
- i, |
- instr->id(), |
- instr->Mnemonic(), |
- other->id(), |
- other->Mnemonic()); |
+ TRACE_GVN_5("Side-effect #%d in %d (%s) is dominated by %d (%s)\n", |
+ i, |
+ instr->id(), |
+ instr->Mnemonic(), |
+ other->id(), |
+ other->Mnemonic()); |
instr->SetSideEffectDominator(changes_flag, other); |
} |
} |