From a8980079a053cacd288ac24e7a3b5c13e8ab3f5a Mon Sep 17 00:00:00 2001 From: "fschneider@chromium.org" Date: Thu, 1 Mar 2012 11:33:37 +0000 Subject: [PATCH] Add flag --trace-phase to selectively produce IR trace output. By default --trace-hydrogen only generates the final IR (before code generation). The other phases can be printed by specifying them by their first letter. Currently H=HIR, L=LIR or Z=final IR (default) are recognized. Review URL: https://chromiumcodereview.appspot.com/9535009 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@10882 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arm/lithium-arm.cc | 4 ++-- src/arm/lithium-codegen-arm.cc | 2 +- src/flag-definitions.h | 1 + src/hydrogen.cc | 33 ++++++++++++++++++--------------- src/ia32/lithium-codegen-ia32.cc | 2 +- src/ia32/lithium-ia32.cc | 4 ++-- src/lithium-allocator.cc | 16 ++++++++-------- src/mips/lithium-codegen-mips.cc | 2 +- src/mips/lithium-mips.cc | 4 ++-- src/x64/lithium-codegen-x64.cc | 2 +- src/x64/lithium-x64.cc | 4 ++-- 11 files changed, 39 insertions(+), 35 deletions(-) diff --git a/src/arm/lithium-arm.cc b/src/arm/lithium-arm.cc index 0d997a8..fad8f4b 100644 --- a/src/arm/lithium-arm.cc +++ b/src/arm/lithium-arm.cc @@ -440,7 +440,7 @@ LOperand* LChunk::GetNextSpillSlot(bool is_double) { void LChunk::MarkEmptyBlocks() { - HPhase phase("Mark empty blocks", this); + HPhase phase("L Mark empty blocks", this); for (int i = 0; i < graph()->blocks()->length(); ++i) { HBasicBlock* block = graph()->blocks()->at(i); int first = block->first_instruction_index(); @@ -552,7 +552,7 @@ Representation LChunk::LookupLiteralRepresentation( LChunk* LChunkBuilder::Build() { ASSERT(is_unused()); chunk_ = new(zone()) LChunk(info(), graph()); - HPhase phase("Building chunk", chunk_); + HPhase phase("L Building chunk", chunk_); status_ = BUILDING; const ZoneList* blocks = graph()->blocks(); for (int i = 0; i < blocks->length(); i++) { diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc index c946801..d03410b 100644 --- a/src/arm/lithium-codegen-arm.cc +++ b/src/arm/lithium-codegen-arm.cc @@ -62,7 +62,7 @@ class SafepointGenerator : public CallWrapper { #define __ masm()-> bool LCodeGen::GenerateCode() { - HPhase phase("Code generation", chunk()); + HPhase phase("Z Code generation", chunk()); ASSERT(is_unused()); status_ = GENERATING; CpuFeatures::Scope scope1(VFP3); diff --git a/src/flag-definitions.h b/src/flag-definitions.h index b8f556d..9ab8ab5 100644 --- a/src/flag-definitions.h +++ b/src/flag-definitions.h @@ -148,6 +148,7 @@ DEFINE_bool(collect_megamorphic_maps_from_stub_cache, "crankshaft harvests type feedback from stub cache") DEFINE_bool(hydrogen_stats, false, "print statistics for hydrogen") DEFINE_bool(trace_hydrogen, false, "trace generated hydrogen to file") +DEFINE_string(trace_phase, "Z", "trace generated IR for specified phases") DEFINE_bool(trace_inlining, false, "trace inlining decisions") DEFINE_bool(trace_alloc, false, "trace register allocator") DEFINE_bool(trace_all_uses, false, "trace all use positions") diff --git a/src/hydrogen.cc b/src/hydrogen.cc index 6f3e466..e593857 100644 --- a/src/hydrogen.cc +++ b/src/hydrogen.cc @@ -730,7 +730,7 @@ HBasicBlock* HGraph::CreateBasicBlock() { void HGraph::Canonicalize() { if (!FLAG_use_canonicalizing) return; - HPhase phase("Canonicalize", this); + HPhase phase("H Canonicalize", this); for (int i = 0; i < blocks()->length(); ++i) { HInstruction* instr = blocks()->at(i)->first(); while (instr != NULL) { @@ -743,7 +743,7 @@ void HGraph::Canonicalize() { void HGraph::OrderBlocks() { - HPhase phase("Block ordering"); + HPhase phase("H Block ordering"); BitVector visited(blocks_.length(), zone()); ZoneList reverse_result(8); @@ -805,7 +805,7 @@ void HGraph::Postorder(HBasicBlock* block, void HGraph::AssignDominators() { - HPhase phase("Assign dominators", this); + HPhase phase("H Assign dominators", this); for (int i = 0; i < blocks_.length(); ++i) { HBasicBlock* block = blocks_[i]; if (block->IsLoopHeader()) { @@ -824,7 +824,7 @@ void HGraph::AssignDominators() { // Mark all blocks that are dominated by an unconditional soft deoptimize to // prevent code motion across those blocks. void HGraph::PropagateDeoptimizingMark() { - HPhase phase("Propagate deoptimizing mark", this); + HPhase phase("H Propagate deoptimizing mark", this); MarkAsDeoptimizingRecursively(entry_block()); } @@ -837,7 +837,7 @@ void HGraph::MarkAsDeoptimizingRecursively(HBasicBlock* block) { } void HGraph::EliminateRedundantPhis() { - HPhase phase("Redundant phi elimination", this); + HPhase phase("H Redundant phi elimination", this); // Worklist of phis that can potentially be eliminated. Initialized with // all phi nodes. When elimination of a phi node modifies another phi node @@ -871,7 +871,7 @@ void HGraph::EliminateRedundantPhis() { void HGraph::EliminateUnreachablePhis() { - HPhase phase("Unreachable phi elimination", this); + HPhase phase("H Unreachable phi elimination", this); // Initialize worklist. ZoneList phi_list(blocks_.length()); @@ -1010,7 +1010,7 @@ void HRangeAnalysis::TraceRange(const char* msg, ...) { void HRangeAnalysis::Analyze() { - HPhase phase("Range analysis", graph_); + HPhase phase("H Range analysis", graph_); Analyze(graph_->entry_block()); } @@ -1831,7 +1831,7 @@ Representation HInferRepresentation::TryChange(HValue* value) { void HInferRepresentation::Analyze() { - HPhase phase("Infer representations", graph_); + HPhase phase("H Infer representations", graph_); // (1) Initialize bit vectors and count real uses. Each phi gets a // bit-vector of length . @@ -1910,7 +1910,7 @@ void HInferRepresentation::Analyze() { void HGraph::InitializeInferredTypes() { - HPhase phase("Inferring types", this); + HPhase phase("H Inferring types", this); InitializeInferredTypes(0, this->blocks_.length() - 1); } @@ -2047,7 +2047,7 @@ void HGraph::InsertRepresentationChangesForValue(HValue* value) { void HGraph::InsertRepresentationChanges() { - HPhase phase("Insert representation changes", this); + HPhase phase("H Insert representation changes", this); // Compute truncation flag for phis: Initially assume that all @@ -2104,7 +2104,7 @@ void HGraph::RecursivelyMarkPhiDeoptimizeOnUndefined(HPhi* phi) { void HGraph::MarkDeoptimizeOnUndefined() { - HPhase phase("MarkDeoptimizeOnUndefined", this); + HPhase phase("H MarkDeoptimizeOnUndefined", this); // Compute DeoptimizeOnUndefined flag for phis. // Any phi that can reach a use with DeoptimizeOnUndefined set must // have DeoptimizeOnUndefined set. Currently only HCompareIDAndBranch, with @@ -2430,7 +2430,7 @@ HGraph* HGraphBuilder::CreateGraph() { if (FLAG_hydrogen_stats) HStatistics::Instance()->Initialize(info()); { - HPhase phase("Block building"); + HPhase phase("H Block building"); current_block_ = graph()->entry_block(); Scope* scope = info()->scope(); @@ -2515,7 +2515,7 @@ HGraph* HGraphBuilder::CreateGraph() { // Perform common subexpression elimination and loop-invariant code motion. if (FLAG_use_gvn) { - HPhase phase("Global value numbering", graph()); + HPhase phase("H Global value numbering", graph()); HGlobalValueNumberer gvn(graph(), info()); bool removed_side_effects = gvn.Analyze(); // Trigger a second analysis pass to further eliminate duplicate values that @@ -2548,7 +2548,7 @@ HGraph* HGraphBuilder::CreateGraph() { void HGraph::ReplaceCheckedValues() { - HPhase phase("Replace checked values", this); + HPhase phase("H Replace checked values", this); for (int i = 0; i < blocks()->length(); ++i) { HInstruction* instr = blocks()->at(i)->first(); while (instr != NULL) { @@ -8025,7 +8025,10 @@ void HPhase::End() const { HStatistics::Instance()->SaveTiming(name_, end - start_, size); } - if (FLAG_trace_hydrogen) { + // Produce trace output if flag is set so that the first letter of the + // phase name matches the command line parameter FLAG_trace_phase. + if (FLAG_trace_hydrogen && + OS::StrChr(const_cast(FLAG_trace_phase), name_[0]) != NULL) { if (graph_ != NULL) HTracer::Instance()->TraceHydrogen(name_, graph_); if (chunk_ != NULL) HTracer::Instance()->TraceLithium(name_, chunk_); if (allocator_ != NULL) { diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc index 36929f2..13b788c 100644 --- a/src/ia32/lithium-codegen-ia32.cc +++ b/src/ia32/lithium-codegen-ia32.cc @@ -67,7 +67,7 @@ class SafepointGenerator : public CallWrapper { #define __ masm()-> bool LCodeGen::GenerateCode() { - HPhase phase("Code generation", chunk()); + HPhase phase("Z Code generation", chunk()); ASSERT(is_unused()); status_ = GENERATING; CpuFeatures::Scope scope(SSE2); diff --git a/src/ia32/lithium-ia32.cc b/src/ia32/lithium-ia32.cc index 6067848..ef71836 100644 --- a/src/ia32/lithium-ia32.cc +++ b/src/ia32/lithium-ia32.cc @@ -388,7 +388,7 @@ LOperand* LChunk::GetNextSpillSlot(bool is_double) { void LChunk::MarkEmptyBlocks() { - HPhase phase("Mark empty blocks", this); + HPhase phase("L Mark empty blocks", this); for (int i = 0; i < graph()->blocks()->length(); ++i) { HBasicBlock* block = graph()->blocks()->at(i); int first = block->first_instruction_index(); @@ -551,7 +551,7 @@ Representation LChunk::LookupLiteralRepresentation( LChunk* LChunkBuilder::Build() { ASSERT(is_unused()); chunk_ = new(zone()) LChunk(info(), graph()); - HPhase phase("Building chunk", chunk_); + HPhase phase("L Building chunk", chunk_); status_ = BUILDING; const ZoneList* blocks = graph()->blocks(); for (int i = 0; i < blocks->length(); i++) { diff --git a/src/lithium-allocator.cc b/src/lithium-allocator.cc index 20003f0..a15435c 100644 --- a/src/lithium-allocator.cc +++ b/src/lithium-allocator.cc @@ -1105,7 +1105,7 @@ bool LAllocator::Allocate(LChunk* chunk) { void LAllocator::MeetRegisterConstraints() { - HPhase phase("Register constraints", chunk_); + HPhase phase("L Register constraints", chunk_); first_artificial_register_ = next_virtual_register_; const ZoneList* blocks = graph_->blocks(); for (int i = 0; i < blocks->length(); ++i) { @@ -1117,7 +1117,7 @@ void LAllocator::MeetRegisterConstraints() { void LAllocator::ResolvePhis() { - HPhase phase("Resolve phis", chunk_); + HPhase phase("L Resolve phis", chunk_); // Process the blocks in reverse order. const ZoneList* blocks = graph_->blocks(); @@ -1207,7 +1207,7 @@ HBasicBlock* LAllocator::GetBlock(LifetimePosition pos) { void LAllocator::ConnectRanges() { - HPhase phase("Connect ranges", this); + HPhase phase("L Connect ranges", this); for (int i = 0; i < live_ranges()->length(); ++i) { LiveRange* first_range = live_ranges()->at(i); if (first_range == NULL || first_range->parent() != NULL) continue; @@ -1247,7 +1247,7 @@ bool LAllocator::CanEagerlyResolveControlFlow(HBasicBlock* block) const { void LAllocator::ResolveControlFlow() { - HPhase phase("Resolve control flow", this); + HPhase phase("L Resolve control flow", this); const ZoneList* blocks = graph_->blocks(); for (int block_id = 1; block_id < blocks->length(); ++block_id) { HBasicBlock* block = blocks->at(block_id); @@ -1268,7 +1268,7 @@ void LAllocator::ResolveControlFlow() { void LAllocator::BuildLiveRanges() { - HPhase phase("Build live ranges", this); + HPhase phase("L Build live ranges", this); InitializeLivenessAnalysis(); // Process the blocks in reverse order. const ZoneList* blocks = graph_->blocks(); @@ -1373,7 +1373,7 @@ bool LAllocator::SafePointsAreInOrder() const { void LAllocator::PopulatePointerMaps() { - HPhase phase("Populate pointer maps", this); + HPhase phase("L Populate pointer maps", this); const ZoneList* pointer_maps = chunk_->pointer_maps(); ASSERT(SafePointsAreInOrder()); @@ -1492,14 +1492,14 @@ void LAllocator::ProcessOsrEntry() { void LAllocator::AllocateGeneralRegisters() { - HPhase phase("Allocate general registers", this); + HPhase phase("L Allocate general registers", this); num_registers_ = Register::kNumAllocatableRegisters; AllocateRegisters(); } void LAllocator::AllocateDoubleRegisters() { - HPhase phase("Allocate double registers", this); + HPhase phase("L Allocate double registers", this); num_registers_ = DoubleRegister::kNumAllocatableRegisters; mode_ = DOUBLE_REGISTERS; AllocateRegisters(); diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc index 5650d42..25754c5 100644 --- a/src/mips/lithium-codegen-mips.cc +++ b/src/mips/lithium-codegen-mips.cc @@ -62,7 +62,7 @@ class SafepointGenerator : public CallWrapper { #define __ masm()-> bool LCodeGen::GenerateCode() { - HPhase phase("Code generation", chunk()); + HPhase phase("Z Code generation", chunk()); ASSERT(is_unused()); status_ = GENERATING; CpuFeatures::Scope scope(FPU); diff --git a/src/mips/lithium-mips.cc b/src/mips/lithium-mips.cc index 4d86882..b18a85f 100644 --- a/src/mips/lithium-mips.cc +++ b/src/mips/lithium-mips.cc @@ -440,7 +440,7 @@ LOperand* LChunk::GetNextSpillSlot(bool is_double) { void LChunk::MarkEmptyBlocks() { - HPhase phase("Mark empty blocks", this); + HPhase phase("L Mark empty blocks", this); for (int i = 0; i < graph()->blocks()->length(); ++i) { HBasicBlock* block = graph()->blocks()->at(i); int first = block->first_instruction_index(); @@ -552,7 +552,7 @@ Representation LChunk::LookupLiteralRepresentation( LChunk* LChunkBuilder::Build() { ASSERT(is_unused()); chunk_ = new(zone()) LChunk(info(), graph()); - HPhase phase("Building chunk", chunk_); + HPhase phase("L Building chunk", chunk_); status_ = BUILDING; const ZoneList* blocks = graph()->blocks(); for (int i = 0; i < blocks->length(); i++) { diff --git a/src/x64/lithium-codegen-x64.cc b/src/x64/lithium-codegen-x64.cc index 17a1792..8615a4d 100644 --- a/src/x64/lithium-codegen-x64.cc +++ b/src/x64/lithium-codegen-x64.cc @@ -67,7 +67,7 @@ class SafepointGenerator : public CallWrapper { #define __ masm()-> bool LCodeGen::GenerateCode() { - HPhase phase("Code generation", chunk()); + HPhase phase("Z Code generation", chunk()); ASSERT(is_unused()); status_ = GENERATING; diff --git a/src/x64/lithium-x64.cc b/src/x64/lithium-x64.cc index d026a7a..45fda1a 100644 --- a/src/x64/lithium-x64.cc +++ b/src/x64/lithium-x64.cc @@ -382,7 +382,7 @@ LOperand* LChunk::GetNextSpillSlot(bool is_double) { void LChunk::MarkEmptyBlocks() { - HPhase phase("Mark empty blocks", this); + HPhase phase("L Mark empty blocks", this); for (int i = 0; i < graph()->blocks()->length(); ++i) { HBasicBlock* block = graph()->blocks()->at(i); int first = block->first_instruction_index(); @@ -545,7 +545,7 @@ Representation LChunk::LookupLiteralRepresentation( LChunk* LChunkBuilder::Build() { ASSERT(is_unused()); chunk_ = new(zone()) LChunk(info(), graph()); - HPhase phase("Building chunk", chunk_); + HPhase phase("L Building chunk", chunk_); status_ = BUILDING; const ZoneList* blocks = graph()->blocks(); for (int i = 0; i < blocks->length(); i++) { -- 2.7.4