namespace internal {
-Handle<Code> HydrogenCodeStub::CodeFromGraph(HGraph* graph) {
- graph->OrderBlocks();
- graph->AssignDominators();
- graph->CollectPhis();
- graph->InsertRepresentationChanges();
- graph->EliminateRedundantBoundsChecks();
+// TODO(svenpanne) Merge with OptimizingCompiler::OptimizeGraph().
+static LChunk* OptimizeGraph(HGraph* graph) {
+ AssertNoAllocation no_gc;
+ NoHandleAllocation no_handles;
+ NoHandleDereference no_deref;
+
+ ASSERT(graph != NULL);
+ SmartArrayPointer<char> bailout_reason;
+ if (!graph->Optimize(&bailout_reason)) {
+ FATAL(bailout_reason.is_empty() ? "unknown" : *bailout_reason);
+ }
LChunk* chunk = LChunk::NewChunk(graph);
- ASSERT(chunk != NULL);
- Handle<Code> stub = chunk->Codegen(Code::COMPILED_STUB);
- return stub;
+ if (chunk == NULL) {
+ FATAL(graph->info()->bailout_reason());
+ }
+ return chunk;
}
Handle<Code> KeyedLoadFastElementStub::GenerateCode() {
CodeStubGraphBuilder<KeyedLoadFastElementStub> builder(this);
- return CodeFromGraph(builder.CreateGraph());
+ LChunk* chunk = OptimizeGraph(builder.CreateGraph());
+ return chunk->Codegen(Code::COMPILED_STUB);
}
virtual void InitializeInterfaceDescriptor(
Isolate* isolate,
CodeStubInterfaceDescriptor* descriptor) = 0;
-
- protected:
- Handle<Code> CodeFromGraph(HGraph* graph);
};