compilation-hints-streaming-compilation.js 5.48 KB
Newer Older
1 2 3 4 5 6
// Copyright 2019 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.

// Flags: --experimental-wasm-compilation-hints --wasm-test-streaming

7
d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js');
8 9 10 11 12 13

(function testInstantiateStreamingWithLazyHint() {
  print(arguments.callee.name);
  let builder = new WasmModuleBuilder();
  builder.addImport('mod', 'pow', kSig_i_ii);
  builder.addFunction('upow', kSig_i_i)
14 15
         .addBody([kExprLocalGet, 0,
                   kExprLocalGet, 0,
16 17
                   kExprCallFunction, 0])
  builder.addFunction('upow2', kSig_i_i)
18 19
         .addBody([kExprLocalGet, 0,
                   kExprLocalGet, 0,
20
                   kExprCallFunction, 0])
21 22 23
         .setCompilationHint(kCompilationHintStrategyLazy,
                             kCompilationHintTierDefault,
                             kCompilationHintTierDefault)
24 25
         .exportFunc();
  let bytes = builder.toBuffer();
26 27 28
  assertPromiseResult(WebAssembly.instantiateStreaming(Promise.resolve(bytes),
                                                       {mod: {pow: Math.pow}})
    .then(({module, instance}) => assertEquals(27, instance.exports.upow2(3))));
29 30
})();

31
(function testInstantiateStreamingWithBadLazyHint() {
32 33 34 35
  print(arguments.callee.name);
  let builder = new WasmModuleBuilder();
  builder.addImport('mod', 'pow', kSig_i_ii);
  builder.addFunction('upow', kSig_i_i)
36 37
         .addBody([kExprLocalGet, 0,
                   kExprLocalGet, 0,
38 39
                   kExprCallFunction, 0])
  builder.addFunction('upow2', kSig_i_i)
40 41
         .addBody([kExprLocalGet, 0,
                   kExprLocalGet, 0,
42
                   kExprCallFunction, 0])
43 44 45
         .setCompilationHint(kCompilationHintStrategyLazy,
                             kCompilationHintTierOptimized,
                             kCompilationHintTierBaseline)
46 47
         .exportFunc();
  let bytes = builder.toBuffer();
48 49 50
  assertPromiseResult(WebAssembly.instantiateStreaming(Promise.resolve(bytes),
                                                       {mod: {pow: Math.pow}})
    .then(assertUnreachable,
51
          error => assertEquals("WebAssembly.instantiateStreaming(): Invalid " +
52
                                "compilation hint 0x19 (forbidden downgrade) " +
53
                                "@+78",
54
                                error.message)));
55 56
})();

57
(function testInstantiateStreamingWithBadLazyFunctionBody() {
58 59 60 61
  print(arguments.callee.name);
  let builder = new WasmModuleBuilder();
  builder.addImport('mod', 'pow', kSig_f_ff);
  builder.addFunction('upow', kSig_i_i)
62 63
         .addBody([kExprLocalGet, 0,
                   kExprLocalGet, 0,
64 65
                   kExprCallFunction, 0])
  builder.addFunction('upow2', kSig_i_i)
66 67
         .addBody([kExprLocalGet, 0,
                   kExprLocalGet, 0,
68
                   kExprCallFunction, 0])
69 70 71
         .setCompilationHint(kCompilationHintStrategyLazy,
                             kCompilationHintTierDefault,
                             kCompilationHintTierDefault)
72 73
         .exportFunc();
  let bytes = builder.toBuffer();
74 75 76
  assertPromiseResult(WebAssembly.instantiateStreaming(Promise.resolve(bytes),
                                                       {mod: {pow: Math.pow}})
    .then(assertUnreachable,
77
          error => assertEquals("WebAssembly.instantiateStreaming(): call[0] " +
78
                                "expected type f32, found local.get of type " +
79
                                "i32 @+92",
80
                                error.message)));
81
})();
82 83 84 85 86 87

(function testInstantiateStreamingEmptyModule() {
  print(arguments.callee.name);
  let builder = new WasmModuleBuilder();
  builder.addImport('mod', 'pow', kSig_i_ii);
  let bytes = builder.toBuffer();
88 89
  assertPromiseResult(WebAssembly.instantiateStreaming(Promise.resolve(bytes),
                                                       {mod: {pow: Math.pow}}));
90 91
})();

92
(function testInstantiateStreamingLazyModule() {
93 94 95 96
  print(arguments.callee.name);
  let builder = new WasmModuleBuilder();
  builder.addImport('mod', 'pow', kSig_i_ii);
  builder.addFunction('upow', kSig_i_i)
97 98
         .addBody([kExprLocalGet, 0,
                   kExprLocalGet, 0,
99
                   kExprCallFunction, 0])
100 101 102
         .setCompilationHint(kCompilationHintStrategyLazy,
                             kCompilationHintTierDefault,
                             kCompilationHintTierDefault)
103 104
         .exportFunc();
  let bytes = builder.toBuffer();
105 106 107
  assertPromiseResult(WebAssembly.instantiateStreaming(Promise.resolve(bytes),
                                                       {mod: {pow: Math.pow}})
    .then(({module, instance}) => assertEquals(27, instance.exports.upow(3))));
108
})();
109 110 111 112 113 114

(function testInstantiateStreamingLazyBaselineModule() {
  print(arguments.callee.name);
  let builder = new WasmModuleBuilder();
  builder.addImport('mod', 'pow', kSig_i_ii);
  builder.addFunction('upow', kSig_i_i)
115 116
         .addBody([kExprLocalGet, 0,
                   kExprLocalGet, 0,
117 118 119 120 121 122 123 124 125 126
                   kExprCallFunction, 0])
         .setCompilationHint(kCompilationHintStrategyLazyBaselineEagerTopTier,
                             kCompilationHintTierDefault,
                             kCompilationHintTierDefault)
         .exportFunc();
  let bytes = builder.toBuffer();
  assertPromiseResult(WebAssembly.instantiateStreaming(Promise.resolve(bytes),
                                                       {mod: {pow: Math.pow}})
    .then(({module, instance}) => assertEquals(27, instance.exports.upow(3))));
})();