@scriptc/compiler 0.3.4 → 0.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ambient/scriptc-node-fallback.d.ts +409 -42
- package/dist/backend/llvm/array-search.js +1 -1
- package/dist/backend/llvm/array-search.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.d.ts +6 -0
- package/dist/backend/llvm/call-lifetimes.js +19 -0
- package/dist/backend/llvm/call-lifetimes.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.d.ts +2 -21
- package/dist/backend/llvm/constant-callbacks.js +36 -219
- package/dist/backend/llvm/constant-callbacks.js.map +1 -1
- package/dist/backend/llvm/constant-callbacks.test.js +22 -0
- package/dist/backend/llvm/constant-callbacks.test.js.map +1 -1
- package/dist/backend/llvm/dense-array-access.d.ts +9 -0
- package/dist/backend/llvm/dense-array-access.js +27 -1
- package/dist/backend/llvm/dense-array-access.js.map +1 -1
- package/dist/backend/llvm/dyn.d.ts +6 -0
- package/dist/backend/llvm/dyn.js +71 -7
- package/dist/backend/llvm/dyn.js.map +1 -1
- package/dist/backend/llvm/emitter.d.ts +120 -2
- package/dist/backend/llvm/emitter.js +820 -142
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +17 -7
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.js +1 -1
- package/dist/backend/llvm/expr-callbacks.d.ts +11 -0
- package/dist/backend/llvm/expr-callbacks.js +53 -0
- package/dist/backend/llvm/expr-callbacks.js.map +1 -1
- package/dist/backend/llvm/expr-calls.js +88 -2
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.js +50 -27
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-dispatch.js +1 -0
- package/dist/backend/llvm/expr-dispatch.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +25 -1
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.d.ts +1 -1
- package/dist/backend/llvm/expr-primitives.js +20 -1
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-stream-bridges.js +4 -0
- package/dist/backend/llvm/expr-stream-bridges.js.map +1 -1
- package/dist/backend/llvm/integer-clones.d.ts +103 -0
- package/dist/backend/llvm/integer-clones.js +1336 -0
- package/dist/backend/llvm/integer-clones.js.map +1 -0
- package/dist/backend/llvm/integer-clones.test.d.ts +1 -0
- package/dist/backend/llvm/integer-clones.test.js +219 -0
- package/dist/backend/llvm/integer-clones.test.js.map +1 -0
- package/dist/backend/llvm/lib-datagram.js +14 -0
- package/dist/backend/llvm/lib-datagram.js.map +1 -1
- package/dist/backend/llvm/lib-dispatch.js +32 -1
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +61 -1
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/lib-network.js +21 -3
- package/dist/backend/llvm/lib-network.js.map +1 -1
- package/dist/backend/llvm/lib-process.js +34 -0
- package/dist/backend/llvm/lib-process.js.map +1 -1
- package/dist/backend/llvm/lib-shared.js +77 -2
- package/dist/backend/llvm/lib-shared.js.map +1 -1
- package/dist/backend/llvm/lib-test.js +16 -3
- package/dist/backend/llvm/lib-test.js.map +1 -1
- package/dist/backend/llvm/lib-tls.js +6 -0
- package/dist/backend/llvm/lib-tls.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.js +1 -1
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/map-entry-fusion.d.ts +28 -0
- package/dist/backend/llvm/map-entry-fusion.js +233 -0
- package/dist/backend/llvm/map-entry-fusion.js.map +1 -0
- package/dist/backend/llvm/map-entry-fusion.test.d.ts +1 -0
- package/dist/backend/llvm/map-entry-fusion.test.js +183 -0
- package/dist/backend/llvm/map-entry-fusion.test.js.map +1 -0
- package/dist/backend/llvm/map-number-lookup.d.ts +2 -0
- package/dist/backend/llvm/map-number-lookup.js +1 -1
- package/dist/backend/llvm/map-number-lookup.js.map +1 -1
- package/dist/backend/llvm/map-number-lookup.test.js +10 -11
- package/dist/backend/llvm/map-number-lookup.test.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.d.ts +2 -0
- package/dist/backend/llvm/map-read-lifetimes.js +3 -0
- package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.test.js +2 -2
- package/dist/backend/llvm/nullable-unions.d.ts +6 -3
- package/dist/backend/llvm/nullable-unions.js +2 -0
- package/dist/backend/llvm/nullable-unions.js.map +1 -1
- package/dist/backend/llvm/publish.d.ts +16 -0
- package/dist/backend/llvm/publish.js +81 -10
- package/dist/backend/llvm/publish.js.map +1 -1
- package/dist/backend/llvm/publish.test.d.ts +1 -0
- package/dist/backend/llvm/publish.test.js +94 -0
- package/dist/backend/llvm/publish.test.js.map +1 -0
- package/dist/backend/llvm/record-results.d.ts +1 -1
- package/dist/backend/llvm/record-results.js +78 -4
- package/dist/backend/llvm/record-results.js.map +1 -1
- package/dist/backend/llvm/record-sources.d.ts +7 -0
- package/dist/backend/llvm/record-sources.js +14 -0
- package/dist/backend/llvm/record-sources.js.map +1 -0
- package/dist/backend/llvm/reference-writes.js +1 -0
- package/dist/backend/llvm/reference-writes.js.map +1 -1
- package/dist/backend/llvm/shapes.d.ts +12 -3
- package/dist/backend/llvm/shapes.js +23 -14
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/shapes.test.js +5 -3
- package/dist/backend/llvm/shapes.test.js.map +1 -1
- package/dist/backend/llvm/speculative-integers.d.ts +74 -0
- package/dist/backend/llvm/speculative-integers.js +571 -0
- package/dist/backend/llvm/speculative-integers.js.map +1 -0
- package/dist/backend/llvm/speculative-integers.test.d.ts +1 -0
- package/dist/backend/llvm/speculative-integers.test.js +148 -0
- package/dist/backend/llvm/speculative-integers.test.js.map +1 -0
- package/dist/backend/llvm/string-lifetimes.test.js +75 -1
- package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/walkers.d.ts +17 -0
- package/dist/backend/llvm/walkers.js +123 -0
- package/dist/backend/llvm/walkers.js.map +1 -1
- package/dist/backend/may-throw.js +2 -0
- package/dist/backend/may-throw.js.map +1 -1
- package/dist/backend/native/contracts.d.ts +2 -1
- package/dist/backend/native/executable.js +6 -1
- package/dist/backend/native/executable.js.map +1 -1
- package/dist/backend/native/runtime-inputs.d.ts +1 -1
- package/dist/backend/native/runtime-inputs.js +1 -0
- package/dist/backend/native/runtime-inputs.js.map +1 -1
- package/dist/backend/runtime-abi.d.ts +2 -2
- package/dist/backend/runtime-abi.js +2 -2
- package/dist/backend/runtime-pack-targets.test.js +1 -1
- package/dist/backend/runtime-pack.d.ts +7 -3
- package/dist/backend/runtime-pack.js +12 -6
- package/dist/backend/runtime-pack.js.map +1 -1
- package/dist/backend/runtime-pack.test.js +16 -7
- package/dist/backend/runtime-pack.test.js.map +1 -1
- package/dist/contracts/check.js +1 -0
- package/dist/contracts/check.js.map +1 -1
- package/dist/coverage/surface-manifest.js +3 -3
- package/dist/coverage/surface-manifest.js.map +1 -1
- package/dist/diagnostics/diagnostic.d.ts +1 -1
- package/dist/diagnostics/diagnostic.js +6 -2
- package/dist/diagnostics/diagnostic.js.map +1 -1
- package/dist/frontend/lowering/builtin-calls.js +13 -0
- package/dist/frontend/lowering/builtin-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/callable-aliases.js +82 -8
- package/dist/frontend/lowering/builtins/callable-aliases.js.map +1 -1
- package/dist/frontend/lowering/builtins/child-process-async.d.ts +8 -6
- package/dist/frontend/lowering/builtins/child-process-async.js +45 -29
- package/dist/frontend/lowering/builtins/child-process-async.js.map +1 -1
- package/dist/frontend/lowering/builtins/compression.d.ts +9 -0
- package/dist/frontend/lowering/builtins/compression.js +145 -30
- package/dist/frontend/lowering/builtins/compression.js.map +1 -1
- package/dist/frontend/lowering/builtins/crypto.js +12 -1
- package/dist/frontend/lowering/builtins/crypto.js.map +1 -1
- package/dist/frontend/lowering/builtins/errors.js +5 -3
- package/dist/frontend/lowering/builtins/errors.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem-calls.d.ts +6 -0
- package/dist/frontend/lowering/builtins/filesystem-calls.js +16 -0
- package/dist/frontend/lowering/builtins/filesystem-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/filesystem.d.ts +8 -0
- package/dist/frontend/lowering/builtins/filesystem.js +199 -2
- package/dist/frontend/lowering/builtins/filesystem.js.map +1 -1
- package/dist/frontend/lowering/builtins/fs-streams.d.ts +26 -0
- package/dist/frontend/lowering/builtins/fs-streams.js +131 -0
- package/dist/frontend/lowering/builtins/fs-streams.js.map +1 -0
- package/dist/frontend/lowering/builtins/hash-stream.d.ts +12 -0
- package/dist/frontend/lowering/builtins/hash-stream.js +80 -0
- package/dist/frontend/lowering/builtins/hash-stream.js.map +1 -0
- package/dist/frontend/lowering/builtins/module-calls.js +17 -3
- package/dist/frontend/lowering/builtins/module-calls.js.map +1 -1
- package/dist/frontend/lowering/builtins/process.js +9 -2
- package/dist/frontend/lowering/builtins/process.js.map +1 -1
- package/dist/frontend/lowering/builtins/readline.d.ts +45 -13
- package/dist/frontend/lowering/builtins/readline.js +812 -47
- package/dist/frontend/lowering/builtins/readline.js.map +1 -1
- package/dist/frontend/lowering/builtins/workers.d.ts +4 -0
- package/dist/frontend/lowering/builtins/workers.js +58 -0
- package/dist/frontend/lowering/builtins/workers.js.map +1 -1
- package/dist/frontend/lowering/class-dynamic-dispatch.js +150 -8
- package/dist/frontend/lowering/class-dynamic-dispatch.js.map +1 -1
- package/dist/frontend/lowering/class-protocols.d.ts +55 -0
- package/dist/frontend/lowering/class-protocols.js +735 -0
- package/dist/frontend/lowering/class-protocols.js.map +1 -1
- package/dist/frontend/lowering/containers/array-from-async.d.ts +18 -0
- package/dist/frontend/lowering/containers/array-from-async.js +282 -0
- package/dist/frontend/lowering/containers/array-from-async.js.map +1 -0
- package/dist/frontend/lowering/containers/bytes.js +33 -12
- package/dist/frontend/lowering/containers/bytes.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-grouping.js +2 -1
- package/dist/frontend/lowering/containers/collection-grouping.js.map +1 -1
- package/dist/frontend/lowering/containers/collection-methods.js +27 -23
- package/dist/frontend/lowering/containers/collection-methods.js.map +1 -1
- package/dist/frontend/lowering/devirtualize.js +20 -7
- package/dist/frontend/lowering/devirtualize.js.map +1 -1
- package/dist/frontend/lowering/divergences.js +188 -15
- package/dist/frontend/lowering/divergences.js.map +1 -1
- package/dist/frontend/lowering/lower-calls.js +129 -25
- package/dist/frontend/lowering/lower-calls.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.js +46 -1
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-dgram.js +55 -15
- package/dist/frontend/lowering/lower-dgram.js.map +1 -1
- package/dist/frontend/lowering/lower-event-emitter.d.ts +9 -1
- package/dist/frontend/lowering/lower-event-emitter.js +88 -1
- package/dist/frontend/lowering/lower-event-emitter.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.d.ts +4 -0
- package/dist/frontend/lowering/lower-exprs.js +239 -71
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lower-inspect.js +49 -3
- package/dist/frontend/lowering/lower-inspect.js.map +1 -1
- package/dist/frontend/lowering/lower-mock.d.ts +11 -1
- package/dist/frontend/lowering/lower-mock.js +377 -61
- package/dist/frontend/lowering/lower-mock.js.map +1 -1
- package/dist/frontend/lowering/lower-modules.js +1 -0
- package/dist/frontend/lowering/lower-modules.js.map +1 -1
- package/dist/frontend/lowering/lower-server.d.ts +2 -1
- package/dist/frontend/lowering/lower-server.js +234 -21
- package/dist/frontend/lowering/lower-server.js.map +1 -1
- package/dist/frontend/lowering/lower-stmts.js +60 -13
- package/dist/frontend/lowering/lower-stmts.js.map +1 -1
- package/dist/frontend/lowering/lower-stream.d.ts +1 -3
- package/dist/frontend/lowering/lower-stream.js +325 -20
- package/dist/frontend/lowering/lower-stream.js.map +1 -1
- package/dist/frontend/lowering/lower-test.js +147 -48
- package/dist/frontend/lowering/lower-test.js.map +1 -1
- package/dist/frontend/lowering/lowerer.d.ts +13 -1
- package/dist/frontend/lowering/lowerer.js +10 -2
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/lowering/null-prototype.d.ts +13 -0
- package/dist/frontend/lowering/null-prototype.js +33 -0
- package/dist/frontend/lowering/null-prototype.js.map +1 -0
- package/dist/frontend/lowering/record-sources.d.ts +15 -0
- package/dist/frontend/lowering/record-sources.js +46 -0
- package/dist/frontend/lowering/record-sources.js.map +1 -0
- package/dist/frontend/lowering/surfaces.d.ts +3 -3
- package/dist/frontend/lowering/surfaces.js +59 -5
- package/dist/frontend/lowering/surfaces.js.map +1 -1
- package/dist/frontend/mock-shapes.d.ts +5 -0
- package/dist/frontend/mock-shapes.js +27 -2
- package/dist/frontend/mock-shapes.js.map +1 -1
- package/dist/frontend/program.js +5 -4
- package/dist/frontend/program.js.map +1 -1
- package/dist/frontend/type-mapper.d.ts +3 -0
- package/dist/frontend/type-mapper.js +148 -4
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/index.js +18 -8
- package/dist/index.js.map +1 -1
- package/dist/ir/analysis.d.ts +10 -0
- package/dist/ir/analysis.js +35 -0
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/analysis.test.js +69 -1
- package/dist/ir/analysis.test.js.map +1 -1
- package/dist/ir/builtin-effects.js +72 -0
- package/dist/ir/builtin-effects.js.map +1 -1
- package/dist/ir/builtin-signatures.d.ts +1 -1
- package/dist/ir/builtin-signatures.js +258 -13
- package/dist/ir/builtin-signatures.js.map +1 -1
- package/dist/ir/capture-values.d.ts +107 -0
- package/dist/ir/capture-values.js +850 -0
- package/dist/ir/capture-values.js.map +1 -0
- package/dist/ir/capture-values.test.d.ts +1 -0
- package/dist/ir/capture-values.test.js +268 -0
- package/dist/ir/capture-values.test.js.map +1 -0
- package/dist/ir/field-values.d.ts +16 -0
- package/dist/ir/field-values.js +128 -0
- package/dist/ir/field-values.js.map +1 -0
- package/dist/ir/field-values.test.d.ts +1 -0
- package/dist/ir/field-values.test.js +160 -0
- package/dist/ir/field-values.test.js.map +1 -0
- package/dist/ir/final-fields.d.ts +4 -1
- package/dist/ir/final-fields.js +11 -3
- package/dist/ir/final-fields.js.map +1 -1
- package/dist/ir/function-references.test.js +2 -1
- package/dist/ir/function-references.test.js.map +1 -1
- package/dist/ir/init-only-globals.d.ts +16 -0
- package/dist/ir/init-only-globals.js +121 -0
- package/dist/ir/init-only-globals.js.map +1 -0
- package/dist/ir/init-only-globals.test.d.ts +1 -0
- package/dist/ir/init-only-globals.test.js +115 -0
- package/dist/ir/init-only-globals.test.js.map +1 -0
- package/dist/ir/initializer-bindings.d.ts +18 -1
- package/dist/ir/initializer-bindings.js +91 -1
- package/dist/ir/initializer-bindings.js.map +1 -1
- package/dist/ir/initializer-bindings.test.js +57 -2
- package/dist/ir/initializer-bindings.test.js.map +1 -1
- package/dist/ir/int32-slots.d.ts +22 -0
- package/dist/ir/int32-slots.js +398 -13
- package/dist/ir/int32-slots.js.map +1 -1
- package/dist/ir/int32-slots.test.js +119 -8
- package/dist/ir/int32-slots.test.js.map +1 -1
- package/dist/ir/integer-loop-facts.d.ts +27 -1
- package/dist/ir/integer-loop-facts.js +239 -7
- package/dist/ir/integer-loop-facts.js.map +1 -1
- package/dist/ir/integer-ranges.d.ts +8 -5
- package/dist/ir/integer-ranges.js +147 -59
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/integer-ranges.test.js +285 -7
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/ir.d.ts +22 -1
- package/dist/ir/ir.js +4 -0
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/property-bags.d.ts +14 -0
- package/dist/ir/property-bags.js +121 -0
- package/dist/ir/property-bags.js.map +1 -0
- package/dist/ir/receiver-readers.d.ts +21 -0
- package/dist/ir/receiver-readers.js +217 -0
- package/dist/ir/receiver-readers.js.map +1 -0
- package/dist/ir/runtime-features.d.ts +3 -1
- package/dist/ir/runtime-features.js +102 -7
- package/dist/ir/runtime-features.js.map +1 -1
- package/dist/ir/runtime-features.test.js +62 -0
- package/dist/ir/runtime-features.test.js.map +1 -1
- package/dist/ir/traverse.js +4 -0
- package/dist/ir/traverse.js.map +1 -1
- package/dist/ir/validate.js +71 -3
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +59 -0
- package/dist/ir/validate.test.js.map +1 -1
- package/dist/library/int-infer.js +3 -0
- package/dist/library/int-infer.js.map +1 -1
- package/dist/library/ir-policy.js +5 -0
- package/dist/library/ir-policy.js.map +1 -1
- package/package.json +20 -20
- package/surface-manifest.json +57 -19
|
@@ -0,0 +1,571 @@
|
|
|
1
|
+
import { everyExprChild, everyStmtChild } from "../../ir/traverse.js";
|
|
2
|
+
import { f64Lit } from "./common.js";
|
|
3
|
+
import { exactInteger, widenInteger } from "./integer-values.js";
|
|
4
|
+
import { withinInt32 } from "../../ir/integer-ranges.js";
|
|
5
|
+
/** The fast copy duplicates the loop; keep the duplicated code small. */
|
|
6
|
+
const MAX_LOOP_NODES = 400;
|
|
7
|
+
/** Statements whose emission is plain control flow or a single write.
|
|
8
|
+
* Nested loops, switches and try statements keep the loop on the ordinary
|
|
9
|
+
* path (their emission keeps state that the two copies would not share). */
|
|
10
|
+
const SIMPLE_STATEMENTS = new Set([
|
|
11
|
+
"varDecl",
|
|
12
|
+
"assign",
|
|
13
|
+
"exprStmt",
|
|
14
|
+
"if",
|
|
15
|
+
"block",
|
|
16
|
+
"arraySet",
|
|
17
|
+
"bytesSet",
|
|
18
|
+
"fieldSet",
|
|
19
|
+
"recordSet",
|
|
20
|
+
"break",
|
|
21
|
+
"continue",
|
|
22
|
+
"return",
|
|
23
|
+
]);
|
|
24
|
+
/** Statements and expressions that run no other code and cannot throw. */
|
|
25
|
+
const OBSERVER_FREE_STATEMENTS = new Set([
|
|
26
|
+
"varDecl",
|
|
27
|
+
"assign",
|
|
28
|
+
"exprStmt",
|
|
29
|
+
"if",
|
|
30
|
+
"block",
|
|
31
|
+
"break",
|
|
32
|
+
"continue",
|
|
33
|
+
]);
|
|
34
|
+
const OBSERVER_FREE_EXPRESSIONS = new Set([
|
|
35
|
+
"numLit",
|
|
36
|
+
"boolLit",
|
|
37
|
+
"varRef",
|
|
38
|
+
"bin",
|
|
39
|
+
"unary",
|
|
40
|
+
"incDec",
|
|
41
|
+
"assignExpr",
|
|
42
|
+
"toBool",
|
|
43
|
+
"logical",
|
|
44
|
+
"ternary",
|
|
45
|
+
]);
|
|
46
|
+
/** Operators whose double form costs conversions or long latency, and that
|
|
47
|
+
* take an integer operand directly. */
|
|
48
|
+
const CONSUMING_OPS = new Set([
|
|
49
|
+
"*",
|
|
50
|
+
"/",
|
|
51
|
+
"%",
|
|
52
|
+
"**",
|
|
53
|
+
"&",
|
|
54
|
+
"|",
|
|
55
|
+
"^",
|
|
56
|
+
"<<",
|
|
57
|
+
">>",
|
|
58
|
+
">>>",
|
|
59
|
+
"<",
|
|
60
|
+
"<=",
|
|
61
|
+
">",
|
|
62
|
+
">=",
|
|
63
|
+
"===",
|
|
64
|
+
"!==",
|
|
65
|
+
]);
|
|
66
|
+
const INTEGER_OPS = new Set(["+", "-", "*", "%", "&", "|", "^", "<<", ">>", ">>>"]);
|
|
67
|
+
const ARITHMETIC_OPS = new Set(["+", "-", "*", "%"]);
|
|
68
|
+
/** A number expression that reads only locals and literals through integer
|
|
69
|
+
* operators: evaluating it has no effects, so a failed check may restart its
|
|
70
|
+
* statement. Division and exponentiation usually leave the integers and
|
|
71
|
+
* would only bail. */
|
|
72
|
+
export function isSpeculableValue(e, reads = true) {
|
|
73
|
+
if (e.type.kind !== "f64")
|
|
74
|
+
return false;
|
|
75
|
+
switch (e.kind) {
|
|
76
|
+
case "numLit":
|
|
77
|
+
return Number.isSafeInteger(e.value) && !Object.is(e.value, -0);
|
|
78
|
+
case "varRef":
|
|
79
|
+
return true;
|
|
80
|
+
case "bin": {
|
|
81
|
+
if (!INTEGER_OPS.has(e.op))
|
|
82
|
+
return false;
|
|
83
|
+
// Bitwise operators evaluate through the ordinary emitter, which
|
|
84
|
+
// must not read the heap after a check (see speculativeReads).
|
|
85
|
+
const inner = reads && ARITHMETIC_OPS.has(e.op);
|
|
86
|
+
return isSpeculableValue(e.left, inner) && isSpeculableValue(e.right, inner);
|
|
87
|
+
}
|
|
88
|
+
case "unary":
|
|
89
|
+
return (e.op === "-" || e.op === "~") && isSpeculableValue(e.operand, reads && e.op === "-");
|
|
90
|
+
default:
|
|
91
|
+
return reads && isSpeculativeRead(e);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/** A number read from a string, an array, a record or an object field that
|
|
95
|
+
* has no effect: it may throw (a missing element), but it changes nothing,
|
|
96
|
+
* so a failed check may restart its statement. Its value carries no range,
|
|
97
|
+
* so it is checked like any other unproven integer. */
|
|
98
|
+
export function isSpeculativeRead(e) {
|
|
99
|
+
if (e.type.kind !== "f64")
|
|
100
|
+
return false;
|
|
101
|
+
switch (e.kind) {
|
|
102
|
+
case "strIntrinsic":
|
|
103
|
+
return (e.method === "charCodeAt" &&
|
|
104
|
+
isEffectFree(e.receiver) &&
|
|
105
|
+
e.args.length === 1 &&
|
|
106
|
+
isEffectFree(e.args[0]));
|
|
107
|
+
case "arrayGet":
|
|
108
|
+
return isEffectFree(e.arr) && isEffectFree(e.index);
|
|
109
|
+
case "recordGet":
|
|
110
|
+
case "fieldGet":
|
|
111
|
+
return isEffectFree(e.obj);
|
|
112
|
+
default:
|
|
113
|
+
return false;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/** Receivers and indexes of speculative reads: locals, literals, number
|
|
117
|
+
* arithmetic and nested reads. */
|
|
118
|
+
function isEffectFree(e) {
|
|
119
|
+
switch (e.kind) {
|
|
120
|
+
case "numLit":
|
|
121
|
+
case "varRef":
|
|
122
|
+
return true;
|
|
123
|
+
case "bin":
|
|
124
|
+
return e.left.type.kind === "f64" && isEffectFree(e.left) && isEffectFree(e.right);
|
|
125
|
+
case "arrayGet":
|
|
126
|
+
return isEffectFree(e.arr) && isEffectFree(e.index);
|
|
127
|
+
case "recordGet":
|
|
128
|
+
case "fieldGet":
|
|
129
|
+
return isEffectFree(e.obj);
|
|
130
|
+
default:
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/** The speculative reads of a speculable value in evaluation order. */
|
|
135
|
+
export function speculativeReads(e, out = []) {
|
|
136
|
+
if (e.kind === "bin" && ARITHMETIC_OPS.has(e.op)) {
|
|
137
|
+
speculativeReads(e.left, out);
|
|
138
|
+
speculativeReads(e.right, out);
|
|
139
|
+
}
|
|
140
|
+
else if (e.kind === "unary" && e.op === "-")
|
|
141
|
+
speculativeReads(e.operand, out);
|
|
142
|
+
else if (isSpeculativeRead(e))
|
|
143
|
+
out.push(e);
|
|
144
|
+
return out;
|
|
145
|
+
}
|
|
146
|
+
/** `x = x + y` or `x = x - y` with a step that is not a literal, as in a
|
|
147
|
+
* sieve's `j += i`: the double copy pays a conversion of every index and
|
|
148
|
+
* the step's own latency, while counters stepping by a literal usually
|
|
149
|
+
* have a static proof or too little work to repay a second copy. */
|
|
150
|
+
function isVariableStep(localId, e) {
|
|
151
|
+
if (e.kind !== "bin" || (e.op !== "+" && e.op !== "-"))
|
|
152
|
+
return false;
|
|
153
|
+
const self = (x) => x.kind === "varRef" && x.localId === localId;
|
|
154
|
+
const step = self(e.left) ? e.right : e.op === "+" && self(e.right) ? e.left : null;
|
|
155
|
+
return step !== null && step.kind !== "numLit";
|
|
156
|
+
}
|
|
157
|
+
function hasProduct(e) {
|
|
158
|
+
if (e.kind === "bin")
|
|
159
|
+
return e.op === "*" || e.op === "%" || hasProduct(e.left) || hasProduct(e.right);
|
|
160
|
+
if (e.kind === "unary")
|
|
161
|
+
return hasProduct(e.operand);
|
|
162
|
+
return false;
|
|
163
|
+
}
|
|
164
|
+
function hasArithmetic(e) {
|
|
165
|
+
if (e.kind === "bin")
|
|
166
|
+
return ARITHMETIC_OPS.has(e.op) || hasArithmetic(e.left) || hasArithmetic(e.right);
|
|
167
|
+
if (e.kind === "unary")
|
|
168
|
+
return e.op === "-" || hasArithmetic(e.operand);
|
|
169
|
+
return false;
|
|
170
|
+
}
|
|
171
|
+
/** The written local and value of a statement-level write, or null. A
|
|
172
|
+
* value of null with a local means `x++`/`x--`. */
|
|
173
|
+
export function speculativeWriteTarget(s) {
|
|
174
|
+
switch (s.kind) {
|
|
175
|
+
case "assign":
|
|
176
|
+
return { localId: s.localId, value: s.value, op: "+" };
|
|
177
|
+
case "varDecl":
|
|
178
|
+
return s.init ? { localId: s.localId, value: s.init, op: "+" } : null;
|
|
179
|
+
case "exprStmt":
|
|
180
|
+
if (s.expr.kind === "incDec")
|
|
181
|
+
return { localId: s.expr.localId, value: null, op: s.expr.op };
|
|
182
|
+
if (s.expr.kind === "assignExpr")
|
|
183
|
+
return { localId: s.expr.localId, value: s.expr.value, op: "+" };
|
|
184
|
+
return null;
|
|
185
|
+
default:
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/** `eligible` names the locals a shadow may stand for; `integral` those the
|
|
190
|
+
* emitter already holds as integers (counters, int32 locals); `proven` the
|
|
191
|
+
* expressions the static range analysis already proves integral. Static
|
|
192
|
+
* proofs come first: a local whose reads are all proven is never shadowed
|
|
193
|
+
* or checked, and a loop with nothing unproven is never duplicated. */
|
|
194
|
+
export function planSpeculativeLoop(loop, eligible, integral = () => false, proven = () => false, invariantEligible = eligible) {
|
|
195
|
+
const writes = new Map();
|
|
196
|
+
const unspeculable = new Set();
|
|
197
|
+
const reads = new Set();
|
|
198
|
+
// Locals with at least one read the static analysis does not prove.
|
|
199
|
+
const unproven = new Set();
|
|
200
|
+
const declared = new Set();
|
|
201
|
+
let nodes = 0;
|
|
202
|
+
let rejected = false;
|
|
203
|
+
let arithmetic = false;
|
|
204
|
+
let observerFree = true;
|
|
205
|
+
// Locals the loop reads as integers: operands of multiplication,
|
|
206
|
+
// remainder, bitwise operators and comparisons, and indexes. An
|
|
207
|
+
// accumulator only ever added to gains little from an integer shadow
|
|
208
|
+
// (the double add is cheap), so it keeps its double.
|
|
209
|
+
const consumed = new Set();
|
|
210
|
+
const consume = (e) => {
|
|
211
|
+
if (e.kind === "varRef")
|
|
212
|
+
consumed.add(e.localId);
|
|
213
|
+
};
|
|
214
|
+
// Operands of multiplication, division and remainder: the operations whose
|
|
215
|
+
// double forms cost the most. A loop whose integers only count and compare
|
|
216
|
+
// gains nothing measurable from a second copy, so it keeps one.
|
|
217
|
+
const multiplied = new Set();
|
|
218
|
+
// A product in the condition alone (`i < Math.floor(n * scale)`) does not
|
|
219
|
+
// make the body's work integer.
|
|
220
|
+
let inCondition = false;
|
|
221
|
+
const expr = (e) => {
|
|
222
|
+
if (rejected)
|
|
223
|
+
return false;
|
|
224
|
+
nodes++;
|
|
225
|
+
if (!OBSERVER_FREE_EXPRESSIONS.has(e.kind) || (e.kind === "bin" && e.left.type.kind !== "f64"))
|
|
226
|
+
observerFree = false;
|
|
227
|
+
if (e.kind === "varRef") {
|
|
228
|
+
reads.add(e.localId);
|
|
229
|
+
if (!proven(e))
|
|
230
|
+
unproven.add(e.localId);
|
|
231
|
+
}
|
|
232
|
+
else if (e.kind === "assignExpr" || e.kind === "incDec")
|
|
233
|
+
unspeculable.add(e.localId);
|
|
234
|
+
else if (e.kind === "bin" && CONSUMING_OPS.has(e.op)) {
|
|
235
|
+
consume(e.left);
|
|
236
|
+
consume(e.right);
|
|
237
|
+
if (!inCondition && (e.op === "*" || e.op === "/" || e.op === "%"))
|
|
238
|
+
for (const operand of [e.left, e.right])
|
|
239
|
+
if (operand.kind === "varRef")
|
|
240
|
+
multiplied.add(operand.localId);
|
|
241
|
+
}
|
|
242
|
+
else if (e.kind === "arrayGet" || e.kind === "arrayHas" || e.kind === "arrayState")
|
|
243
|
+
consume(e.index);
|
|
244
|
+
else if (e.kind === "bytesIntrinsic" || e.kind === "strIntrinsic")
|
|
245
|
+
e.args.forEach(consume);
|
|
246
|
+
return everyExprChild(e, expr, nested);
|
|
247
|
+
};
|
|
248
|
+
// Statements inside expressions (sequence expressions) run mid-expression,
|
|
249
|
+
// where no statement can restart: their writes stay unspeculated.
|
|
250
|
+
const nested = (s) => {
|
|
251
|
+
nodes++;
|
|
252
|
+
observerFree = false;
|
|
253
|
+
if (s.kind === "assign" || s.kind === "varDecl")
|
|
254
|
+
unspeculable.add(s.localId);
|
|
255
|
+
return everyStmtChild(s, expr, nested);
|
|
256
|
+
};
|
|
257
|
+
const stmt = (s) => {
|
|
258
|
+
if (rejected)
|
|
259
|
+
return false;
|
|
260
|
+
nodes++;
|
|
261
|
+
if (!SIMPLE_STATEMENTS.has(s.kind)) {
|
|
262
|
+
rejected = true;
|
|
263
|
+
return false;
|
|
264
|
+
}
|
|
265
|
+
if (!OBSERVER_FREE_STATEMENTS.has(s.kind) ||
|
|
266
|
+
((s.kind === "break" || s.kind === "continue") && s.label !== undefined))
|
|
267
|
+
observerFree = false;
|
|
268
|
+
if (s.kind === "varDecl")
|
|
269
|
+
declared.add(s.localId);
|
|
270
|
+
if (s.kind === "arraySet" || s.kind === "bytesSet")
|
|
271
|
+
consume(s.index);
|
|
272
|
+
const target = speculativeWriteTarget(s);
|
|
273
|
+
if (target) {
|
|
274
|
+
if (target.value === null || isSpeculableValue(target.value)) {
|
|
275
|
+
const list = writes.get(target.localId) ?? [];
|
|
276
|
+
list.push(s);
|
|
277
|
+
writes.set(target.localId, list);
|
|
278
|
+
if (target.value === null) {
|
|
279
|
+
reads.add(target.localId);
|
|
280
|
+
if (s.kind !== "exprStmt" || !proven(s.expr))
|
|
281
|
+
unproven.add(target.localId);
|
|
282
|
+
}
|
|
283
|
+
else
|
|
284
|
+
expr(target.value);
|
|
285
|
+
return !rejected;
|
|
286
|
+
}
|
|
287
|
+
unspeculable.add(target.localId);
|
|
288
|
+
if (target.value)
|
|
289
|
+
expr(target.value);
|
|
290
|
+
return !rejected;
|
|
291
|
+
}
|
|
292
|
+
return everyStmtChild(s, expr, stmt);
|
|
293
|
+
};
|
|
294
|
+
if (loop.cond) {
|
|
295
|
+
inCondition = true;
|
|
296
|
+
expr(loop.cond);
|
|
297
|
+
inCondition = false;
|
|
298
|
+
}
|
|
299
|
+
if (loop.kind === "for" && loop.update)
|
|
300
|
+
stmt(loop.update);
|
|
301
|
+
for (const s of loop.body)
|
|
302
|
+
stmt(s);
|
|
303
|
+
if (rejected || nodes > MAX_LOOP_NODES)
|
|
304
|
+
return null;
|
|
305
|
+
const locals = new Map();
|
|
306
|
+
for (const id of writes.keys())
|
|
307
|
+
if (!unspeculable.has(id) && consumed.has(id) && unproven.has(id) && eligible(id))
|
|
308
|
+
locals.set(id, !declared.has(id));
|
|
309
|
+
// Every local a speculated write reads must be an integer whenever the
|
|
310
|
+
// write runs: speculated itself, already an integer, or loop-invariant
|
|
311
|
+
// (checked on entry). A value computed from doubles the loop writes
|
|
312
|
+
// would only fail its check on every entry.
|
|
313
|
+
const grounded = (e) => {
|
|
314
|
+
if (e.kind === "varRef") {
|
|
315
|
+
const id = e.localId;
|
|
316
|
+
return (proven(e) ||
|
|
317
|
+
locals.has(id) ||
|
|
318
|
+
integral(id) ||
|
|
319
|
+
(!writes.has(id) && !unspeculable.has(id) && invariantEligible(id)));
|
|
320
|
+
}
|
|
321
|
+
if (isSpeculativeRead(e))
|
|
322
|
+
return true;
|
|
323
|
+
return everyExprChild(e, grounded, () => false);
|
|
324
|
+
};
|
|
325
|
+
for (let changed = true; changed;) {
|
|
326
|
+
changed = false;
|
|
327
|
+
for (const id of [...locals.keys()]) {
|
|
328
|
+
for (const s of writes.get(id)) {
|
|
329
|
+
const target = speculativeWriteTarget(s);
|
|
330
|
+
if (target.value !== null && !grounded(target.value)) {
|
|
331
|
+
locals.delete(id);
|
|
332
|
+
changed = true;
|
|
333
|
+
break;
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
const speculated = new Set();
|
|
339
|
+
for (const id of locals.keys())
|
|
340
|
+
for (const s of writes.get(id))
|
|
341
|
+
speculated.add(s);
|
|
342
|
+
if (speculated.size === 0)
|
|
343
|
+
return null;
|
|
344
|
+
// Loop-invariant integer inputs of the writes and the condition join the
|
|
345
|
+
// shadows, so their reads carry integer facts too.
|
|
346
|
+
const invariant = (e) => {
|
|
347
|
+
if (e.kind === "varRef") {
|
|
348
|
+
const id = e.localId;
|
|
349
|
+
if (!proven(e) &&
|
|
350
|
+
!locals.has(id) &&
|
|
351
|
+
!writes.has(id) &&
|
|
352
|
+
!unspeculable.has(id) &&
|
|
353
|
+
invariantEligible(id))
|
|
354
|
+
locals.set(id, true);
|
|
355
|
+
return true;
|
|
356
|
+
}
|
|
357
|
+
return everyExprChild(e, invariant, () => true);
|
|
358
|
+
};
|
|
359
|
+
for (const s of speculated) {
|
|
360
|
+
const target = speculativeWriteTarget(s);
|
|
361
|
+
if (target.value === null)
|
|
362
|
+
arithmetic = true;
|
|
363
|
+
else {
|
|
364
|
+
if (hasArithmetic(target.value))
|
|
365
|
+
arithmetic = true;
|
|
366
|
+
invariant(target.value);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
if (!arithmetic)
|
|
370
|
+
return null;
|
|
371
|
+
if (loop.cond)
|
|
372
|
+
invariant(loop.cond);
|
|
373
|
+
const heavy = [...locals.keys()].some((id) => multiplied.has(id)) ||
|
|
374
|
+
[...speculated].some((s) => {
|
|
375
|
+
const target = speculativeWriteTarget(s);
|
|
376
|
+
return (target.value !== null &&
|
|
377
|
+
(hasProduct(target.value) || isVariableStep(target.localId, target.value)));
|
|
378
|
+
});
|
|
379
|
+
if (!heavy)
|
|
380
|
+
return null;
|
|
381
|
+
return { locals, writes: speculated, observerFree };
|
|
382
|
+
}
|
|
383
|
+
const SAFE = Number.MAX_SAFE_INTEGER;
|
|
384
|
+
/** The range every speculative shadow holds. */
|
|
385
|
+
export const SPECULATIVE_RANGE = { min: -SAFE, max: SAFE };
|
|
386
|
+
/** Convert a double to i64 and test that it is a safe integer other than
|
|
387
|
+
* -0: the ordered range tests reject NaN and infinities, and the bit
|
|
388
|
+
* patterns of the value and its round trip agree only for integers that are
|
|
389
|
+
* not -0. `freeze` keeps out-of-range conversions from producing poison. */
|
|
390
|
+
export function emitSafeIntegerCheck(host, value) {
|
|
391
|
+
const B = host.B;
|
|
392
|
+
const low = B.tmp(), high = B.tmp(), inRange = B.tmp(), raw = B.tmp(), integer = B.tmp(), back = B.tmp(), bits = B.tmp(), backBits = B.tmp(), exact = B.tmp(), ok = B.tmp();
|
|
393
|
+
B.line(`${low} = fcmp oge double ${value}, ${f64Lit(-SAFE)}`);
|
|
394
|
+
B.line(`${high} = fcmp ole double ${value}, ${f64Lit(SAFE)}`);
|
|
395
|
+
B.line(`${inRange} = and i1 ${low}, ${high}`);
|
|
396
|
+
B.line(`${raw} = fptosi double ${value} to i64`);
|
|
397
|
+
B.line(`${integer} = freeze i64 ${raw}`);
|
|
398
|
+
B.line(`${back} = sitofp i64 ${integer} to double`);
|
|
399
|
+
B.line(`${bits} = bitcast double ${value} to i64`);
|
|
400
|
+
B.line(`${backBits} = bitcast double ${back} to i64`);
|
|
401
|
+
B.line(`${exact} = icmp eq i64 ${bits}, ${backBits}`);
|
|
402
|
+
B.line(`${ok} = and i1 ${inRange}, ${exact}`);
|
|
403
|
+
return [integer, ok];
|
|
404
|
+
}
|
|
405
|
+
/** A condition that is true when an i64 lies outside the safe range. */
|
|
406
|
+
function unsafeInteger(host, value) {
|
|
407
|
+
const B = host.B;
|
|
408
|
+
const biased = B.tmp(), outside = B.tmp();
|
|
409
|
+
B.line(`${biased} = add i64 ${value}, ${SAFE}`);
|
|
410
|
+
B.line(`${outside} = icmp ugt i64 ${biased}, ${2 * SAFE}`);
|
|
411
|
+
return outside;
|
|
412
|
+
}
|
|
413
|
+
/** A condition that is true when a safe i64 lies outside [low, high]. Every
|
|
414
|
+
* speculative value is within ±(2^53 - 1), so bounds at or past those
|
|
415
|
+
* limits need no test, and the remaining bounds are exact integers. */
|
|
416
|
+
function outsideRange(host, value, low, high) {
|
|
417
|
+
const B = host.B;
|
|
418
|
+
let outside = "false";
|
|
419
|
+
if (low > -SAFE) {
|
|
420
|
+
outside = B.tmp();
|
|
421
|
+
B.line(`${outside} = icmp slt i64 ${value}, ${low}`);
|
|
422
|
+
}
|
|
423
|
+
if (high < SAFE) {
|
|
424
|
+
const above = B.tmp();
|
|
425
|
+
B.line(`${above} = icmp sgt i64 ${value}, ${high}`);
|
|
426
|
+
outside = outside === "false" ? above : either(host, outside, above);
|
|
427
|
+
}
|
|
428
|
+
return outside;
|
|
429
|
+
}
|
|
430
|
+
/** A literal's value or the range analysis' proof for an expression whose
|
|
431
|
+
* range lies well inside the safe integers. */
|
|
432
|
+
function staticRange(host, e) {
|
|
433
|
+
const range = e.kind === "numLit" ? { min: e.value, max: e.value } : host.integerRanges.get(e);
|
|
434
|
+
if (!range)
|
|
435
|
+
return undefined;
|
|
436
|
+
const limit = 2 ** 52;
|
|
437
|
+
return range.min >= -limit && range.max <= limit ? range : undefined;
|
|
438
|
+
}
|
|
439
|
+
function either(host, a, b) {
|
|
440
|
+
const t = host.B.tmp();
|
|
441
|
+
host.B.line(`${t} = or i1 ${a}, ${b}`);
|
|
442
|
+
return t;
|
|
443
|
+
}
|
|
444
|
+
/** Evaluate a speculable value (isSpeculableValue) as a safe i64. `bail`
|
|
445
|
+
* branches away when its condition holds, so the integer result equals the
|
|
446
|
+
* JS number exactly whenever control continues: sums and products stay
|
|
447
|
+
* within 2^53 - 1, no result is -0, and `%` never divides by zero. Other
|
|
448
|
+
* operators evaluate through the ordinary emitter and must yield a safe
|
|
449
|
+
* integer. */
|
|
450
|
+
export function emitSpeculativeInteger(host, e, bail, reads = new Map()) {
|
|
451
|
+
const B = host.B;
|
|
452
|
+
// A value the range analysis already proves takes the ordinary integer
|
|
453
|
+
// emission, which needs no checks.
|
|
454
|
+
const proven = e.kind === "bin" ? host.integerRanges.get(e) : undefined;
|
|
455
|
+
if (proven && proven.min >= -SAFE && proven.max <= SAFE && speculativeReads(e).length === 0)
|
|
456
|
+
return speculativeLeaf(host, host.emitExpr(e), e, bail);
|
|
457
|
+
switch (e.kind) {
|
|
458
|
+
case "numLit":
|
|
459
|
+
return String(e.value);
|
|
460
|
+
case "varRef": {
|
|
461
|
+
const slot = host.integerLoopBindings.get(e.localId);
|
|
462
|
+
if (slot !== undefined) {
|
|
463
|
+
const value = B.tmp();
|
|
464
|
+
B.line(`${value} = load ${slot.type}, ptr ${slot.slot}`);
|
|
465
|
+
if (slot.type === "i64")
|
|
466
|
+
return value;
|
|
467
|
+
const wide = B.tmp();
|
|
468
|
+
B.line(`${wide} = ${slot.signed ? "sext" : "zext"} i32 ${value} to i64`);
|
|
469
|
+
return wide;
|
|
470
|
+
}
|
|
471
|
+
const int32 = host.int32Locals.get(e.localId);
|
|
472
|
+
if (int32 !== undefined) {
|
|
473
|
+
const bits = B.tmp(), wide = B.tmp();
|
|
474
|
+
B.line(`${bits} = load i32, ptr ${host.binding(e.localId).slot}`);
|
|
475
|
+
B.line(`${wide} = ${int32.signed ? "sext" : "zext"} i32 ${bits} to i64`);
|
|
476
|
+
return wide;
|
|
477
|
+
}
|
|
478
|
+
break;
|
|
479
|
+
}
|
|
480
|
+
case "bin": {
|
|
481
|
+
if (e.op !== "+" && e.op !== "-" && e.op !== "*" && e.op !== "%")
|
|
482
|
+
break;
|
|
483
|
+
const a = emitSpeculativeInteger(host, e.left, bail, reads);
|
|
484
|
+
const b = emitSpeculativeInteger(host, e.right, bail, reads);
|
|
485
|
+
const result = B.tmp();
|
|
486
|
+
if (e.op === "+" || e.op === "-") {
|
|
487
|
+
// With one operand's range known, the other is checked against the
|
|
488
|
+
// narrowed bounds before the operation: the check then depends on
|
|
489
|
+
// no new value, and LLVM keeps the operation itself simple.
|
|
490
|
+
const right = staticRange(host, e.right);
|
|
491
|
+
const left = e.op === "+" ? staticRange(host, e.left) : undefined;
|
|
492
|
+
if (right) {
|
|
493
|
+
// a + b with b in [lo, hi] is safe iff a in [-SAFE - lo, SAFE - hi];
|
|
494
|
+
// a - b iff a in [-SAFE + hi, SAFE + lo].
|
|
495
|
+
const low = e.op === "+" ? -SAFE - right.min : -SAFE + right.max;
|
|
496
|
+
const high = e.op === "+" ? SAFE - right.max : SAFE + right.min;
|
|
497
|
+
bail(outsideRange(host, a, low, high));
|
|
498
|
+
}
|
|
499
|
+
else if (left)
|
|
500
|
+
bail(outsideRange(host, b, -SAFE - left.min, SAFE - left.max));
|
|
501
|
+
// Safe operands cannot overflow i64; an exact zero sum is +0.
|
|
502
|
+
B.line(`${result} = ${e.op === "+" ? "add" : "sub"} nsw i64 ${a}, ${b}`);
|
|
503
|
+
if (!right && !left)
|
|
504
|
+
bail(unsafeInteger(host, result));
|
|
505
|
+
return result;
|
|
506
|
+
}
|
|
507
|
+
if (e.op === "*") {
|
|
508
|
+
host.declare("declare { i64, i1 } @llvm.smul.with.overflow.i64(i64, i64)");
|
|
509
|
+
const pair = B.tmp(), overflow = B.tmp(), zero = B.tmp(), signs = B.tmp(), negative = B.tmp(), negativeZero = B.tmp();
|
|
510
|
+
B.line(`${pair} = call { i64, i1 } @llvm.smul.with.overflow.i64(i64 ${a}, i64 ${b})`);
|
|
511
|
+
B.line(`${result} = extractvalue { i64, i1 } ${pair}, 0`);
|
|
512
|
+
B.line(`${overflow} = extractvalue { i64, i1 } ${pair}, 1`);
|
|
513
|
+
// A zero product with a negative factor is -0.
|
|
514
|
+
B.line(`${zero} = icmp eq i64 ${result}, 0`);
|
|
515
|
+
B.line(`${signs} = or i64 ${a}, ${b}`);
|
|
516
|
+
B.line(`${negative} = icmp slt i64 ${signs}, 0`);
|
|
517
|
+
B.line(`${negativeZero} = and i1 ${zero}, ${negative}`);
|
|
518
|
+
bail(either(host, either(host, overflow, unsafeInteger(host, result)), negativeZero));
|
|
519
|
+
return result;
|
|
520
|
+
}
|
|
521
|
+
// `%`: a zero divisor yields NaN, and a zero remainder of a negative
|
|
522
|
+
// dividend is -0. Safe operands cannot hit INT64_MIN % -1.
|
|
523
|
+
const zeroDivisor = B.tmp();
|
|
524
|
+
B.line(`${zeroDivisor} = icmp eq i64 ${b}, 0`);
|
|
525
|
+
bail(zeroDivisor);
|
|
526
|
+
const zero = B.tmp(), negative = B.tmp(), negativeZero = B.tmp();
|
|
527
|
+
B.line(`${result} = srem i64 ${a}, ${b}`);
|
|
528
|
+
B.line(`${zero} = icmp eq i64 ${result}, 0`);
|
|
529
|
+
B.line(`${negative} = icmp slt i64 ${a}, 0`);
|
|
530
|
+
B.line(`${negativeZero} = and i1 ${zero}, ${negative}`);
|
|
531
|
+
bail(negativeZero);
|
|
532
|
+
return result;
|
|
533
|
+
}
|
|
534
|
+
case "unary": {
|
|
535
|
+
if (e.op !== "-")
|
|
536
|
+
break;
|
|
537
|
+
const a = emitSpeculativeInteger(host, e.operand, bail, reads);
|
|
538
|
+
const zero = B.tmp(), result = B.tmp();
|
|
539
|
+
// -0 is not an integer result.
|
|
540
|
+
B.line(`${zero} = icmp eq i64 ${a}, 0`);
|
|
541
|
+
bail(zero);
|
|
542
|
+
B.line(`${result} = sub nsw i64 0, ${a}`);
|
|
543
|
+
return result;
|
|
544
|
+
}
|
|
545
|
+
default:
|
|
546
|
+
break;
|
|
547
|
+
}
|
|
548
|
+
return speculativeLeaf(host, reads.get(e) ?? host.emitExpr(e), e, bail);
|
|
549
|
+
}
|
|
550
|
+
/** The safe i64 of an evaluated number: its proven integer, or a checked
|
|
551
|
+
* conversion. */
|
|
552
|
+
function speculativeLeaf(host, value, e, bail) {
|
|
553
|
+
const integer = exactInteger(host, value, e);
|
|
554
|
+
if (integer && integer.type === "i64" && withinInt32(integer.range)) {
|
|
555
|
+
// Only the low half is used, as by a double conversion of an int32:
|
|
556
|
+
// LLVM then narrows the operation that produced it (a 64-bit remainder
|
|
557
|
+
// by a constant costs a wide multiply).
|
|
558
|
+
const narrow = host.B.tmp(), wide = host.B.tmp();
|
|
559
|
+
host.B.line(`${narrow} = trunc i64 ${integer.name} to i32`);
|
|
560
|
+
host.B.line(`${wide} = sext i32 ${narrow} to i64`);
|
|
561
|
+
return wide;
|
|
562
|
+
}
|
|
563
|
+
if (integer && integer.range.min >= -SAFE && integer.range.max <= SAFE)
|
|
564
|
+
return widenInteger(host, integer);
|
|
565
|
+
const [wide, ok] = emitSafeIntegerCheck(host, value.name);
|
|
566
|
+
const fail = host.B.tmp();
|
|
567
|
+
host.B.line(`${fail} = xor i1 ${ok}, true`);
|
|
568
|
+
bail(fail);
|
|
569
|
+
return wide;
|
|
570
|
+
}
|
|
571
|
+
//# sourceMappingURL=speculative-integers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"speculative-integers.js","sourceRoot":"","sources":["../../../src/backend/llvm/speculative-integers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|