| Index: test/cctest/compiler/test-bytecode-graph-builder.cc | 
| diff --git a/test/cctest/compiler/test-bytecode-graph-builder.cc b/test/cctest/compiler/test-bytecode-graph-builder.cc | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..3c710242d20ac769b844cd8ab6758ed20f7be7d9 | 
| --- /dev/null | 
| +++ b/test/cctest/compiler/test-bytecode-graph-builder.cc | 
| @@ -0,0 +1,126 @@ | 
| +// Copyright 2015 the V8 project authors. All rights reserved. | 
| +// Use of this source code is governed by a BSD-style license that can be | 
| +// found in the LICENSE file. | 
| + | 
| +#include <iostream> | 
| + | 
| +#include "src/compiler/bytecode-graph-builder.h" | 
| +#include "src/compiler/common-operator.h" | 
| +#include "src/compiler/graph-visualizer.h" | 
| +#include "src/compiler/instruction.h" | 
| +#include "src/compiler/instruction-selector.h" | 
| +#include "src/compiler/js-graph.h" | 
| +#include "src/compiler/js-operator.h" | 
| +#include "src/interpreter/bytecodes.h" | 
| +#include "src/parser.h" | 
| +#include "test/cctest/cctest.h" | 
| + | 
| +namespace v8 { | 
| +namespace internal { | 
| +namespace compiler { | 
| + | 
| + | 
| +struct BytecodeSnippet { | 
| +  const char* body; | 
| +  int frame_size; | 
| +  int parameter_count; | 
| +  int bytecode_length; | 
| +  const uint8_t bytecode[16]; | 
| +}; | 
| + | 
| + | 
| +// Helper macros for handcrafting bytecode sequences. | 
| +#define B(x) static_cast<uint8_t>(interpreter::Bytecode::k##x) | 
| +#define U8(x) static_cast<uint8_t>((x)&0xff) | 
| +#define R(x) static_cast<uint8_t>(-(x)&0xff) | 
| + | 
| + | 
| +static const int kLastParamIndex = | 
| +    -InterpreterFrameConstants::kLastParamFromRegisterPointer / kPointerSize; | 
| + | 
| + | 
| +const BytecodeSnippet kBytecodeSnippets[] = { | 
| +    {"var x = 0; return x;", | 
| +     kPointerSize, | 
| +     0, | 
| +     6, | 
| +     { | 
| +         B(LdaZero),     // | 
| +         B(Star), R(0),  // | 
| +         B(Ldar), R(0),  // | 
| +         B(Return)       // | 
| +     }}, | 
| +    {"var x = 0; return x + 3;", | 
| +     2 * kPointerSize, | 
| +     0, | 
| +     12, | 
| +     { | 
| +         B(LdaZero),         // | 
| +         B(Star), R(0),      // | 
| +         B(Ldar), R(0),      // Easy to spot r1 not really needed here. | 
| +         B(Star), R(1),      // Dead store. | 
| +         B(LdaSmi8), U8(3),  // | 
| +         B(Add), R(1),       // | 
| +         B(Return)           // | 
| +     }}, | 
| +    {"function f(arg1, arg2, arg3, arg4, arg5, arg6, arg7) { return arg4; }", | 
| +     0, | 
| +     8, | 
| +     3, | 
| +     { | 
| +         B(Ldar),                 // | 
| +         R(kLastParamIndex - 3),  // | 
| +         B(Return)                // | 
| +     }}, | 
| +}; | 
| + | 
| + | 
| +TEST(BytecodeGraphBuilder) { | 
| +  i::FLAG_ignition = true; | 
| +  i::FLAG_always_opt = true; | 
| + | 
| +  HandleAndZoneScope test_scope; | 
| + | 
| +  size_t snippet_count = | 
| +      sizeof(kBytecodeSnippets) / sizeof(kBytecodeSnippets[0]); | 
| +  for (size_t i = 0; i < snippet_count; i++) { | 
| +    Graph* graph = new (test_scope.main_zone()) Graph(test_scope.main_zone()); | 
| +    MachineOperatorBuilder* machine = | 
| +        new (test_scope.main_zone()) MachineOperatorBuilder( | 
| +            test_scope.main_zone(), kMachPtr, | 
| +            InstructionSelector::SupportedMachineOperatorFlags()); | 
| +    CommonOperatorBuilder* common = new (test_scope.main_zone()) | 
| +        CommonOperatorBuilder(test_scope.main_zone()); | 
| +    JSOperatorBuilder* javascript = | 
| +        new (test_scope.main_zone()) JSOperatorBuilder(test_scope.main_zone()); | 
| +    JSGraph* jsgraph = new (test_scope.main_zone()) | 
| +        JSGraph(test_scope.main_isolate(), graph, common, javascript, machine); | 
| + | 
| +    const BytecodeSnippet& snippet = kBytecodeSnippets[i]; | 
| +    Handle<FixedArray> constant_pool = | 
| +        test_scope.main_isolate()->factory()->NewFixedArray(0); | 
| +    Handle<BytecodeArray> bytecode_array = | 
| +        test_scope.main_isolate()->factory()->NewBytecodeArray( | 
| +            snippet.bytecode_length, snippet.bytecode, snippet.frame_size, | 
| +            snippet.parameter_count, constant_pool); | 
| +    MaybeHandle<Code> no_code; | 
| + | 
| +    Handle<String> name = | 
| +        test_scope.main_isolate()->factory()->NewStringFromStaticChars("test"); | 
| +    Handle<SharedFunctionInfo> shared_info = | 
| +        test_scope.main_isolate()->factory()->NewSharedFunctionInfo(name, | 
| +                                                                    no_code); | 
| + | 
| +    ParseInfo parse_info(test_scope.main_zone(), shared_info); | 
| +    CompilationInfo info(&parse_info); | 
| +    info.shared_info()->set_function_data(*bytecode_array); | 
| +    BytecodeGraphBuilder builder(test_scope.main_zone(), &info, jsgraph); | 
| +    builder.CreateGraph(); | 
| +    std::cout << AsDOT(*builder.graph()) << std::endl; | 
| +  } | 
| +} | 
| + | 
| + | 
| +}  // namespace compiler | 
| +}  // namespace internal | 
| +}  // namespace v8 | 
|  |