@scriptc/compiler 0.2.3 → 0.2.4
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/dist/backend/llvm/borrowed-inputs.d.ts +15 -0
- package/dist/backend/llvm/borrowed-inputs.js +28 -0
- package/dist/backend/llvm/borrowed-inputs.js.map +1 -0
- package/dist/backend/llvm/byte-numbers.d.ts +10 -0
- package/dist/backend/llvm/byte-numbers.js +235 -0
- package/dist/backend/llvm/byte-numbers.js.map +1 -0
- package/dist/backend/llvm/bytes-bounds.d.ts +9 -0
- package/dist/backend/llvm/bytes-bounds.js +189 -0
- package/dist/backend/llvm/bytes-bounds.js.map +1 -0
- package/dist/backend/llvm/call-lifetimes.d.ts +7 -0
- package/dist/backend/llvm/call-lifetimes.js +27 -7
- package/dist/backend/llvm/call-lifetimes.js.map +1 -1
- package/dist/backend/llvm/call-lifetimes.test.js +54 -0
- package/dist/backend/llvm/call-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/checked-value-lifetimes.d.ts +9 -0
- package/dist/backend/llvm/checked-value-lifetimes.js +35 -0
- package/dist/backend/llvm/checked-value-lifetimes.js.map +1 -0
- package/dist/backend/llvm/counted-loops.d.ts +6 -0
- package/dist/backend/llvm/counted-loops.js +28 -0
- package/dist/backend/llvm/counted-loops.js.map +1 -0
- package/dist/backend/llvm/emitter.d.ts +25 -9
- package/dist/backend/llvm/emitter.js +131 -31
- package/dist/backend/llvm/emitter.js.map +1 -1
- package/dist/backend/llvm/emitter.test.js +4 -4
- package/dist/backend/llvm/emitter.test.js.map +1 -1
- package/dist/backend/llvm/expr-async.js +3 -2
- package/dist/backend/llvm/expr-async.js.map +1 -1
- package/dist/backend/llvm/expr-bytes.d.ts +4 -4
- package/dist/backend/llvm/expr-bytes.js +68 -35
- package/dist/backend/llvm/expr-bytes.js.map +1 -1
- package/dist/backend/llvm/expr-calls.js +21 -13
- package/dist/backend/llvm/expr-calls.js.map +1 -1
- package/dist/backend/llvm/expr-containers.d.ts +2 -1
- package/dist/backend/llvm/expr-containers.js +68 -46
- package/dist/backend/llvm/expr-containers.js.map +1 -1
- package/dist/backend/llvm/expr-context.d.ts +11 -0
- package/dist/backend/llvm/expr-control.js +26 -5
- package/dist/backend/llvm/expr-control.js.map +1 -1
- package/dist/backend/llvm/expr-dynamic.js +32 -30
- package/dist/backend/llvm/expr-dynamic.js.map +1 -1
- package/dist/backend/llvm/expr-primitives.js +55 -22
- package/dist/backend/llvm/expr-primitives.js.map +1 -1
- package/dist/backend/llvm/expr-records.js +8 -2
- package/dist/backend/llvm/expr-records.js.map +1 -1
- package/dist/backend/llvm/integer-values.d.ts +10 -0
- package/dist/backend/llvm/integer-values.js +41 -0
- package/dist/backend/llvm/integer-values.js.map +1 -0
- package/dist/backend/llvm/integer-views.d.ts +7 -0
- package/dist/backend/llvm/integer-views.js +67 -0
- package/dist/backend/llvm/integer-views.js.map +1 -0
- package/dist/backend/llvm/integer-views.test.d.ts +1 -0
- package/dist/backend/llvm/integer-views.test.js +34 -0
- package/dist/backend/llvm/integer-views.test.js.map +1 -0
- package/dist/backend/llvm/lib-dispatch.js +3 -1
- package/dist/backend/llvm/lib-dispatch.js.map +1 -1
- package/dist/backend/llvm/lib-filesystem.js +5 -5
- package/dist/backend/llvm/lib-filesystem.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.d.ts +2 -4
- package/dist/backend/llvm/local-array-reads.js +4 -91
- package/dist/backend/llvm/local-array-reads.js.map +1 -1
- package/dist/backend/llvm/local-array-reads.test.js +11 -11
- package/dist/backend/llvm/local-array-reads.test.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.js +2 -2
- package/dist/backend/llvm/map-read-lifetimes.js.map +1 -1
- package/dist/backend/llvm/map-read-lifetimes.test.js +5 -1
- package/dist/backend/llvm/map-read-lifetimes.test.js.map +1 -1
- package/dist/backend/llvm/reference-effects.d.ts +22 -0
- package/dist/backend/llvm/reference-effects.js +148 -0
- package/dist/backend/llvm/reference-effects.js.map +1 -0
- package/dist/backend/llvm/reference-effects.test.d.ts +1 -0
- package/dist/backend/llvm/reference-effects.test.js +74 -0
- package/dist/backend/llvm/reference-effects.test.js.map +1 -0
- package/dist/backend/llvm/shapes.d.ts +7 -4
- package/dist/backend/llvm/shapes.js +23 -6
- package/dist/backend/llvm/shapes.js.map +1 -1
- package/dist/backend/llvm/stack-unions.test.js +23 -2
- package/dist/backend/llvm/stack-unions.test.js.map +1 -1
- package/dist/backend/llvm/string-construction.d.ts +10 -0
- package/dist/backend/llvm/string-construction.js +38 -0
- package/dist/backend/llvm/string-construction.js.map +1 -0
- package/dist/backend/llvm/string-construction.test.d.ts +1 -0
- package/dist/backend/llvm/string-construction.test.js +65 -0
- package/dist/backend/llvm/string-construction.test.js.map +1 -0
- package/dist/backend/llvm/string-lifetimes.d.ts +2 -2
- package/dist/backend/llvm/string-lifetimes.js +5 -3
- package/dist/backend/llvm/string-lifetimes.js.map +1 -1
- package/dist/backend/llvm/string-lifetimes.test.js +19 -10
- package/dist/backend/llvm/string-lifetimes.test.js.map +1 -1
- package/dist/frontend/lowering/collection-ingestion.js +9 -0
- package/dist/frontend/lowering/collection-ingestion.js.map +1 -1
- package/dist/frontend/lowering/containers/string-and-regexp.js +6 -0
- package/dist/frontend/lowering/containers/string-and-regexp.js.map +1 -1
- package/dist/frontend/lowering/lower-builtins.js +2 -0
- package/dist/frontend/lowering/lower-builtins.js.map +1 -1
- package/dist/frontend/lowering/lower-classes.js +3 -3
- package/dist/frontend/lowering/lower-classes.js.map +1 -1
- package/dist/frontend/lowering/lower-containers.js +12 -34
- package/dist/frontend/lowering/lower-containers.js.map +1 -1
- package/dist/frontend/lowering/lower-exprs.js +12 -2
- package/dist/frontend/lowering/lower-exprs.js.map +1 -1
- package/dist/frontend/lowering/lowerer.js +10 -3
- package/dist/frontend/lowering/lowerer.js.map +1 -1
- package/dist/frontend/type-mapper.js +2 -2
- package/dist/frontend/type-mapper.js.map +1 -1
- package/dist/ir/analysis.js +3 -1
- package/dist/ir/analysis.js.map +1 -1
- package/dist/ir/byte-numbers.d.ts +20 -0
- package/dist/ir/byte-numbers.js +65 -0
- package/dist/ir/byte-numbers.js.map +1 -0
- package/dist/ir/byte-numbers.test.d.ts +1 -0
- package/dist/ir/byte-numbers.test.js +42 -0
- package/dist/ir/byte-numbers.test.js.map +1 -0
- package/dist/ir/integer-loops.d.ts +19 -0
- package/dist/ir/integer-loops.js +107 -1
- package/dist/ir/integer-loops.js.map +1 -1
- package/dist/ir/integer-loops.test.js +51 -1
- package/dist/ir/integer-loops.test.js.map +1 -1
- package/dist/ir/integer-ranges.d.ts +8 -6
- package/dist/ir/integer-ranges.js +343 -89
- package/dist/ir/integer-ranges.js.map +1 -1
- package/dist/ir/integer-ranges.test.js +54 -3
- package/dist/ir/integer-ranges.test.js.map +1 -1
- package/dist/ir/ir.d.ts +8 -5
- package/dist/ir/ir.js +16 -5
- package/dist/ir/ir.js.map +1 -1
- package/dist/ir/validate.js +47 -29
- package/dist/ir/validate.js.map +1 -1
- package/dist/ir/validate.test.js +20 -0
- package/dist/ir/validate.test.js.map +1 -1
- package/dist/native/toolchain.js +6 -3
- package/dist/native/toolchain.js.map +1 -1
- package/dist/native/toolchain.test.js +43 -5
- package/dist/native/toolchain.test.js.map +1 -1
- package/package.json +20 -20
- package/surface-manifest.json +1 -1
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { IrExpr } from "../../ir/ir.js";
|
|
2
|
+
import type { LlValue, LlvmEmitterContext } from "./expr-context.js";
|
|
3
|
+
/** For a runtime input whose ABI borrows rather than consumes ownership.
|
|
4
|
+
* An unchanged, unboxed local owns its value across all later arguments and
|
|
5
|
+
* the operation, including callbacks and collection mutation. Projections,
|
|
6
|
+
* globals, captures and reassigned bindings keep their ordinary snapshots.
|
|
7
|
+
* Stored values that move into a container must still use emitExpr. */
|
|
8
|
+
export declare function emitBorrowedInput(host: LlvmEmitterContext, value: IrExpr): LlValue;
|
|
9
|
+
/** A projection or writable binding can borrow across later operands only
|
|
10
|
+
* while every operation preserves existing owners. Compute suffix facts
|
|
11
|
+
* once, keeping left-to-right evaluation and the owning fallback for each
|
|
12
|
+
* argument independently. The consumer must borrow all inputs and preserve
|
|
13
|
+
* reference edges itself; mutating runtime operations use emitBorrowedInput. */
|
|
14
|
+
export declare function borrowableInputs(host: LlvmEmitterContext, inputs: readonly IrExpr[], consumerPreserves?: boolean): boolean[];
|
|
15
|
+
export declare function emitBorrowedInputs(host: LlvmEmitterContext, inputs: readonly IrExpr[]): LlValue[];
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** For a runtime input whose ABI borrows rather than consumes ownership.
|
|
2
|
+
* An unchanged, unboxed local owns its value across all later arguments and
|
|
3
|
+
* the operation, including callbacks and collection mutation. Projections,
|
|
4
|
+
* globals, captures and reassigned bindings keep their ordinary snapshots.
|
|
5
|
+
* Stored values that move into a container must still use emitExpr. */
|
|
6
|
+
export function emitBorrowedInput(host, value) {
|
|
7
|
+
return host.canBorrowCallArgument(value) ? host.emitReadReceiver(value) : host.emitExpr(value);
|
|
8
|
+
}
|
|
9
|
+
/** A projection or writable binding can borrow across later operands only
|
|
10
|
+
* while every operation preserves existing owners. Compute suffix facts
|
|
11
|
+
* once, keeping left-to-right evaluation and the owning fallback for each
|
|
12
|
+
* argument independently. The consumer must borrow all inputs and preserve
|
|
13
|
+
* reference edges itself; mutating runtime operations use emitBorrowedInput. */
|
|
14
|
+
export function borrowableInputs(host, inputs, consumerPreserves = true) {
|
|
15
|
+
const result = new Array(inputs.length);
|
|
16
|
+
let preserves = consumerPreserves;
|
|
17
|
+
for (let i = inputs.length - 1; i >= 0; i--) {
|
|
18
|
+
const value = inputs[i];
|
|
19
|
+
result[i] = host.canBorrowCallArgument(value) || (preserves && host.canBorrowReceiver(value));
|
|
20
|
+
preserves = preserves && host.referenceEffects.preserves(value);
|
|
21
|
+
}
|
|
22
|
+
return result;
|
|
23
|
+
}
|
|
24
|
+
export function emitBorrowedInputs(host, inputs) {
|
|
25
|
+
const borrowed = borrowableInputs(host, inputs);
|
|
26
|
+
return inputs.map((value, index) => borrowed[index] ? host.emitReadReceiver(value) : host.emitExpr(value));
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=borrowed-inputs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"borrowed-inputs.js","sourceRoot":"","sources":["../../../src/backend/llvm/borrowed-inputs.ts"],"names":[],"mappings":"AAGA;;;;uEAIuE;AACvE,MAAM,UAAU,iBAAiB,CAAC,IAAwB,EAAE,KAAa;IACvE,OAAO,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACjG,CAAC;AAED;;;;gFAIgF;AAChF,MAAM,UAAU,gBAAgB,CAAC,IAAwB,EAAE,MAAyB,EAAE,iBAAiB,GAAG,IAAI;IAC5G,MAAM,MAAM,GAAc,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACnD,IAAI,SAAS,GAAG,iBAAiB,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;QACzB,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9F,SAAS,GAAG,SAAS,IAAI,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAwB,EAAE,MAAyB;IACpF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAChD,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AAC7G,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type ByteNumberAccess } from "../../ir/byte-numbers.js";
|
|
2
|
+
import type { IrExpr } from "../../ir/ir.js";
|
|
3
|
+
import type { LlValue, LlvmEmitterContext } from "./expr-context.js";
|
|
4
|
+
/** Emit the successful numeric access directly. The original runtime call
|
|
5
|
+
* remains the error path, preserving Buffer's value-before-offset errors,
|
|
6
|
+
* DataView's ToIndex behavior, and exception cleanup through the host. All
|
|
7
|
+
* operands have already been evaluated, exactly once and in source order. */
|
|
8
|
+
export declare function emitByteNumber(host: LlvmEmitterContext, e: IrExpr & {
|
|
9
|
+
kind: "bytesIntrinsic";
|
|
10
|
+
}, spec: ByteNumberAccess, receiver: LlValue, offset: LlValue, value: LlValue | null, little: string, fallback: () => LlValue): LlValue;
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { byteNumberRange } from "../../ir/byte-numbers.js";
|
|
2
|
+
import { f64Lit } from "./common.js";
|
|
3
|
+
import { exactInteger, widenInteger } from "./integer-values.js";
|
|
4
|
+
/** Supported LLVM targets are little-endian. All memory accesses use align
|
|
5
|
+
* 1: Buffer fields and DataView windows can start at arbitrary byte offsets. */
|
|
6
|
+
function endianBits(host, raw, width, little) {
|
|
7
|
+
if (width === 1 || little === "true")
|
|
8
|
+
return raw;
|
|
9
|
+
const B = host.B, bits = width * 8;
|
|
10
|
+
const swapBits = bits <= 16 ? 16 : bits <= 32 ? 32 : 64;
|
|
11
|
+
let operand = raw;
|
|
12
|
+
if (bits !== swapBits) {
|
|
13
|
+
operand = B.tmp();
|
|
14
|
+
B.line(`${operand} = zext i${bits} ${raw} to i${swapBits}`);
|
|
15
|
+
}
|
|
16
|
+
host.declare(`declare i${swapBits} @llvm.bswap.i${swapBits}(i${swapBits})`);
|
|
17
|
+
let swapped = B.tmp();
|
|
18
|
+
B.line(`${swapped} = call i${swapBits} @llvm.bswap.i${swapBits}(i${swapBits} ${operand})`);
|
|
19
|
+
if (bits !== swapBits) {
|
|
20
|
+
const shifted = B.tmp(), narrowed = B.tmp();
|
|
21
|
+
B.line(`${shifted} = lshr i${swapBits} ${swapped}, ${swapBits - bits}`);
|
|
22
|
+
B.line(`${narrowed} = trunc i${swapBits} ${shifted} to i${bits}`);
|
|
23
|
+
swapped = narrowed;
|
|
24
|
+
}
|
|
25
|
+
if (little === "false")
|
|
26
|
+
return swapped;
|
|
27
|
+
const selected = B.tmp();
|
|
28
|
+
B.line(`${selected} = select i1 ${little}, i${bits} ${raw}, i${bits} ${swapped}`);
|
|
29
|
+
return selected;
|
|
30
|
+
}
|
|
31
|
+
/** Emit the successful numeric access directly. The original runtime call
|
|
32
|
+
* remains the error path, preserving Buffer's value-before-offset errors,
|
|
33
|
+
* DataView's ToIndex behavior, and exception cleanup through the host. All
|
|
34
|
+
* operands have already been evaluated, exactly once and in source order. */
|
|
35
|
+
export function emitByteNumber(host, e, spec, receiver, offset, value, little, fallback) {
|
|
36
|
+
const B = host.B, size = host.sizeType;
|
|
37
|
+
const slow = B.newLabel("bytes.number.slow"), access = B.newLabel("bytes.number.access");
|
|
38
|
+
const fastDone = B.newLabel("bytes.number.fast.done"), slowDone = B.newLabel("bytes.number.slow.done");
|
|
39
|
+
const done = B.newLabel("bytes.number.done");
|
|
40
|
+
const bits = spec.width * 8;
|
|
41
|
+
const integer = exactInteger(host, offset, e.args[spec.offsetArg]);
|
|
42
|
+
let index, fits, room = "true";
|
|
43
|
+
if (integer && host.bytesBounds.has(e)) {
|
|
44
|
+
const wide = widenInteger(host, integer);
|
|
45
|
+
index = size === "i64" ? wide : B.tmp();
|
|
46
|
+
if (size !== "i64")
|
|
47
|
+
B.line(`${index} = trunc i64 ${wide} to ${size}`);
|
|
48
|
+
fits = "true";
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
const lengthPtr = B.tmp(), length = B.tmp(), capacity = B.tmp();
|
|
52
|
+
room = B.tmp();
|
|
53
|
+
B.line(`${lengthPtr} = getelementptr inbounds %ScrBytes, ptr ${receiver.name}, i64 0, i32 1`);
|
|
54
|
+
B.line(`${length} = load ${size}, ptr ${lengthPtr}`);
|
|
55
|
+
B.line(`${room} = icmp uge ${size} ${length}, ${spec.width}`);
|
|
56
|
+
B.line(`${capacity} = sub ${size} ${length}, ${spec.width}`);
|
|
57
|
+
if (integer) {
|
|
58
|
+
const wide = widenInteger(host, integer);
|
|
59
|
+
const cap = size === "i64" ? capacity : B.tmp();
|
|
60
|
+
if (size !== "i64")
|
|
61
|
+
B.line(`${cap} = zext ${size} ${capacity} to i64`);
|
|
62
|
+
fits = B.tmp();
|
|
63
|
+
B.line(`${fits} = icmp ule i64 ${wide}, ${cap}`);
|
|
64
|
+
if (spec.dataView && integer.range.max > Number.MAX_SAFE_INTEGER) {
|
|
65
|
+
const safe = B.tmp(), both = B.tmp();
|
|
66
|
+
B.line(`${safe} = icmp ule i64 ${wide}, ${Number.MAX_SAFE_INTEGER}`);
|
|
67
|
+
B.line(`${both} = and i1 ${fits}, ${safe}`);
|
|
68
|
+
fits = both;
|
|
69
|
+
}
|
|
70
|
+
index = size === "i64" ? wide : B.tmp();
|
|
71
|
+
if (size !== "i64")
|
|
72
|
+
B.line(`${index} = trunc i64 ${wide} to ${size}`);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
let normalized = offset.name;
|
|
76
|
+
if (spec.dataView) {
|
|
77
|
+
const nan = B.tmp(), finiteOrZero = B.tmp();
|
|
78
|
+
normalized = B.tmp();
|
|
79
|
+
B.line(`${nan} = fcmp uno double ${offset.name}, ${offset.name}`);
|
|
80
|
+
B.line(`${finiteOrZero} = select i1 ${nan}, double ${f64Lit(0)}, double ${offset.name}`);
|
|
81
|
+
host.declare("declare double @llvm.trunc.f64(double)");
|
|
82
|
+
B.line(`${normalized} = call double @llvm.trunc.f64(double ${finiteOrZero})`);
|
|
83
|
+
}
|
|
84
|
+
const cap = B.tmp(), positive = B.tmp(), bounded = B.tmp(), representable = B.tmp(), range = B.tmp();
|
|
85
|
+
const addressRange = B.tmp(), initial = B.tmp(), convert = B.newLabel("bytes.number.index");
|
|
86
|
+
B.line(`${cap} = uitofp ${size} ${capacity} to double`);
|
|
87
|
+
B.line(`${positive} = fcmp oge double ${normalized}, ${f64Lit(0)}`);
|
|
88
|
+
B.line(`${bounded} = fcmp ole double ${normalized}, ${cap}`);
|
|
89
|
+
// The separate address limit makes fptoui safe even if converting a
|
|
90
|
+
// maximum size_t length to double rounds upward on a 64-bit target.
|
|
91
|
+
B.line(`${representable} = fcmp olt double ${normalized}, ${f64Lit(size === "i64" ? 2 ** 64 : 2 ** 32)}`);
|
|
92
|
+
B.line(`${range} = and i1 ${positive}, ${bounded}`);
|
|
93
|
+
B.line(`${addressRange} = and i1 ${range}, ${representable}`);
|
|
94
|
+
B.line(`${initial} = and i1 ${room}, ${addressRange}`);
|
|
95
|
+
B.condBr(initial, convert, slow);
|
|
96
|
+
B.startBlock(convert);
|
|
97
|
+
index = B.tmp();
|
|
98
|
+
B.line(`${index} = fptoui double ${normalized} to ${size}`);
|
|
99
|
+
fits = B.tmp();
|
|
100
|
+
const roundTrip = B.tmp();
|
|
101
|
+
B.line(`${roundTrip} = uitofp ${size} ${index} to double`);
|
|
102
|
+
B.line(`${fits} = fcmp oeq double ${roundTrip}, ${normalized}`);
|
|
103
|
+
const withinCapacity = B.tmp(), exactBounds = B.tmp();
|
|
104
|
+
B.line(`${withinCapacity} = icmp ule ${size} ${index}, ${capacity}`);
|
|
105
|
+
B.line(`${exactBounds} = and i1 ${fits}, ${withinCapacity}`);
|
|
106
|
+
fits = exactBounds;
|
|
107
|
+
if (spec.dataView) {
|
|
108
|
+
const safe = B.tmp(), both = B.tmp();
|
|
109
|
+
B.line(`${safe} = fcmp ole double ${normalized}, ${f64Lit(Number.MAX_SAFE_INTEGER)}`);
|
|
110
|
+
B.line(`${both} = and i1 ${fits}, ${safe}`);
|
|
111
|
+
fits = both;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
let valid = B.tmp();
|
|
116
|
+
B.line(`${valid} = and i1 ${room}, ${fits}`);
|
|
117
|
+
if (spec.write && !spec.dataView && !spec.floating) {
|
|
118
|
+
const range = byteNumberRange(spec);
|
|
119
|
+
const known = host.integerRanges.get(e.args[spec.valueArg]);
|
|
120
|
+
if (!known || known.min < range.min || known.max > range.max) {
|
|
121
|
+
const above = B.tmp(), below = B.tmp(), valueFits = B.tmp(), both = B.tmp();
|
|
122
|
+
// Buffer integer writes accept NaN (stored as zero) and fractions
|
|
123
|
+
// within the declared range. Unordered comparisons preserve that.
|
|
124
|
+
B.line(`${above} = fcmp uge double ${value.name}, ${f64Lit(range.min)}`);
|
|
125
|
+
B.line(`${below} = fcmp ule double ${value.name}, ${f64Lit(range.max)}`);
|
|
126
|
+
B.line(`${valueFits} = and i1 ${above}, ${below}`);
|
|
127
|
+
B.line(`${both} = and i1 ${valid}, ${valueFits}`);
|
|
128
|
+
valid = both;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
B.condBr(valid, access, slow);
|
|
132
|
+
B.startBlock(access);
|
|
133
|
+
const data = host.emitBytesData(receiver.name), pointer = B.tmp();
|
|
134
|
+
B.line(`${pointer} = getelementptr inbounds i8, ptr ${data}, ${size} ${index}`);
|
|
135
|
+
let fastResult = "", fastInteger = "";
|
|
136
|
+
const readRange = !spec.write ? byteNumberRange(spec) : null;
|
|
137
|
+
const integerType = bits <= 32 ? "i32" : "i64";
|
|
138
|
+
if (spec.write) {
|
|
139
|
+
let raw;
|
|
140
|
+
if (spec.floating) {
|
|
141
|
+
let stored = value.name;
|
|
142
|
+
if (bits === 32) {
|
|
143
|
+
stored = B.tmp();
|
|
144
|
+
B.line(`${stored} = fptrunc double ${value.name} to float`);
|
|
145
|
+
}
|
|
146
|
+
raw = B.tmp();
|
|
147
|
+
B.line(`${raw} = bitcast ${bits === 32 ? "float" : "double"} ${stored} to i${bits}`);
|
|
148
|
+
}
|
|
149
|
+
else if (spec.dataView) {
|
|
150
|
+
const stored = host.emitToUint32(value.name, e.args[spec.valueArg], value.uint32);
|
|
151
|
+
raw = stored;
|
|
152
|
+
if (bits < 32) {
|
|
153
|
+
raw = B.tmp();
|
|
154
|
+
B.line(`${raw} = trunc i32 ${stored} to i${bits}`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
const integerValue = exactInteger(host, value, e.args[spec.valueArg]);
|
|
159
|
+
if (integerValue && (integerValue.type === "i64" || bits <= 32)) {
|
|
160
|
+
raw = integerValue.name;
|
|
161
|
+
if (integerValue.type !== `i${bits}`) {
|
|
162
|
+
raw = B.tmp();
|
|
163
|
+
B.line(`${raw} = trunc ${integerValue.type} ${integerValue.name} to i${bits}`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
const nan = B.tmp(), normalized = B.tmp(), whole = B.tmp();
|
|
168
|
+
B.line(`${nan} = fcmp uno double ${value.name}, ${value.name}`);
|
|
169
|
+
B.line(`${normalized} = select i1 ${nan}, double ${f64Lit(0)}, double ${value.name}`);
|
|
170
|
+
B.line(`${whole} = fptosi double ${normalized} to i64`);
|
|
171
|
+
raw = B.tmp();
|
|
172
|
+
B.line(`${raw} = trunc i64 ${whole} to i${bits}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
const stored = endianBits(host, raw, spec.width, little);
|
|
176
|
+
B.line(`store i${bits} ${stored}, ptr ${pointer}, align 1`);
|
|
177
|
+
if (!spec.dataView) {
|
|
178
|
+
fastResult = B.tmp();
|
|
179
|
+
B.line(`${fastResult} = fadd double ${offset.name}, ${f64Lit(spec.width)}`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
const loaded = B.tmp();
|
|
184
|
+
B.line(`${loaded} = load i${bits}, ptr ${pointer}, align 1`);
|
|
185
|
+
const raw = endianBits(host, loaded, spec.width, little);
|
|
186
|
+
fastResult = B.tmp();
|
|
187
|
+
if (spec.floating) {
|
|
188
|
+
if (bits === 32) {
|
|
189
|
+
const float = B.tmp();
|
|
190
|
+
B.line(`${float} = bitcast i32 ${raw} to float`);
|
|
191
|
+
B.line(`${fastResult} = fpext float ${float} to double`);
|
|
192
|
+
}
|
|
193
|
+
else
|
|
194
|
+
B.line(`${fastResult} = bitcast i64 ${raw} to double`);
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
B.line(`${fastResult} = ${spec.signed ? "sitofp" : "uitofp"} i${bits} ${raw} to double`);
|
|
198
|
+
if (readRange) {
|
|
199
|
+
fastInteger = raw;
|
|
200
|
+
if (`i${bits}` !== integerType) {
|
|
201
|
+
fastInteger = B.tmp();
|
|
202
|
+
B.line(`${fastInteger} = ${spec.signed ? "sext" : "zext"} i${bits} ${raw} to ${integerType}`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
B.br(fastDone);
|
|
208
|
+
B.startBlock(fastDone);
|
|
209
|
+
B.br(done);
|
|
210
|
+
B.startBlock(slow);
|
|
211
|
+
const failure = fallback();
|
|
212
|
+
let slowInteger = "";
|
|
213
|
+
if (readRange) {
|
|
214
|
+
slowInteger = B.tmp();
|
|
215
|
+
B.line(`${slowInteger} = ${spec.signed ? "fptosi" : "fptoui"} double ${failure.name} to ${integerType}`);
|
|
216
|
+
}
|
|
217
|
+
B.br(slowDone);
|
|
218
|
+
B.startBlock(slowDone);
|
|
219
|
+
B.br(done);
|
|
220
|
+
B.startBlock(done);
|
|
221
|
+
if (e.type.kind === "void")
|
|
222
|
+
return { name: "", type: e.type };
|
|
223
|
+
const result = B.tmp();
|
|
224
|
+
B.line(`${result} = phi double [ ${fastResult}, %${fastDone} ], [ ${failure.name}, %${slowDone} ]`);
|
|
225
|
+
if (readRange) {
|
|
226
|
+
const integer = B.tmp();
|
|
227
|
+
B.line(`${integer} = phi ${integerType} [ ${fastInteger}, %${fastDone} ], [ ${slowInteger}, %${slowDone} ]`);
|
|
228
|
+
const uint32 = integerType === "i32" ? integer : B.tmp();
|
|
229
|
+
if (integerType !== "i32")
|
|
230
|
+
B.line(`${uint32} = trunc i64 ${integer} to i32`);
|
|
231
|
+
return { name: result, type: e.type, uint32, integer: { name: integer, type: integerType, signed: spec.signed, range: readRange } };
|
|
232
|
+
}
|
|
233
|
+
return { name: result, type: e.type };
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=byte-numbers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"byte-numbers.js","sourceRoot":"","sources":["../../../src/backend/llvm/byte-numbers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAyB,MAAM,0BAA0B,CAAC;AAGlF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEjE;gFACgF;AAChF,SAAS,UAAU,CAAC,IAAwB,EAAE,GAAW,EAAE,KAAa,EAAE,MAAc;IACtF,IAAI,KAAK,KAAK,CAAC,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,GAAG,CAAC;IACjD,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,IAAI,OAAO,GAAG,GAAG,CAAC;IAClB,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,OAAO,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAClB,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,YAAY,IAAI,IAAI,GAAG,QAAQ,QAAQ,EAAE,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,YAAY,QAAQ,iBAAiB,QAAQ,KAAK,QAAQ,GAAG,CAAC,CAAC;IAC5E,IAAI,OAAO,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACtB,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,YAAY,QAAQ,iBAAiB,QAAQ,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,CAAC;IAC3F,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,QAAQ,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAC5C,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,YAAY,QAAQ,IAAI,OAAO,KAAK,QAAQ,GAAG,IAAI,EAAE,CAAC,CAAC;QACxE,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,aAAa,QAAQ,IAAI,OAAO,QAAQ,IAAI,EAAE,CAAC,CAAC;QAClE,OAAO,GAAG,QAAQ,CAAC;IACrB,CAAC;IACD,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,OAAO,CAAC;IACvC,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACzB,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,gBAAgB,MAAM,MAAM,IAAI,IAAI,GAAG,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;IAClF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;6EAG6E;AAC7E,MAAM,UAAU,cAAc,CAC5B,IAAwB,EACxB,CAAsC,EACtC,IAAsB,EACtB,QAAiB,EACjB,MAAe,EACf,KAAqB,EACrB,MAAc,EACd,QAAuB;IAEvB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC;IACvC,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;IACzF,MAAM,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC;IACvG,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;IAC5B,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACnE,IAAI,KAAa,EAAE,IAAY,EAAE,IAAI,GAAG,MAAM,CAAC;IAC/C,IAAI,OAAO,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACzC,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QACxC,IAAI,IAAI,KAAK,KAAK;YAAE,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,gBAAgB,IAAI,OAAO,IAAI,EAAE,CAAC,CAAC;QACtE,IAAI,GAAG,MAAM,CAAC;IAChB,CAAC;SAAM,CAAC;QACN,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,QAAQ,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QAChE,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACf,CAAC,CAAC,IAAI,CAAC,GAAG,SAAS,4CAA4C,QAAQ,CAAC,IAAI,gBAAgB,CAAC,CAAC;QAC9F,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,WAAW,IAAI,SAAS,SAAS,EAAE,CAAC,CAAC;QACrD,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,eAAe,IAAI,IAAI,MAAM,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAC9D,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,UAAU,IAAI,IAAI,MAAM,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QAC7D,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACzC,MAAM,GAAG,GAAG,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YAChD,IAAI,IAAI,KAAK,KAAK;gBAAE,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,WAAW,IAAI,IAAI,QAAQ,SAAS,CAAC,CAAC;YACvE,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACf,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,mBAAmB,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC;YACjD,IAAI,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBACjE,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;gBACrC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,mBAAmB,IAAI,KAAK,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC;gBACrE,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,aAAa,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC;gBAC5C,IAAI,GAAG,IAAI,CAAC;YACd,CAAC;YACD,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YACxC,IAAI,IAAI,KAAK,KAAK;gBAAE,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,gBAAgB,IAAI,OAAO,IAAI,EAAE,CAAC,CAAC;QACxE,CAAC;aAAM,CAAC;YACN,IAAI,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;YAC7B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,YAAY,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;gBAC5C,UAAU,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;gBACrB,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,sBAAsB,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBAClE,CAAC,CAAC,IAAI,CAAC,GAAG,YAAY,gBAAgB,GAAG,YAAY,MAAM,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBACzF,IAAI,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC;gBACvD,CAAC,CAAC,IAAI,CAAC,GAAG,UAAU,yCAAyC,YAAY,GAAG,CAAC,CAAC;YAChF,CAAC;YACD,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,QAAQ,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,aAAa,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACrG,MAAM,YAAY,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;YAC5F,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,aAAa,IAAI,IAAI,QAAQ,YAAY,CAAC,CAAC;YACxD,CAAC,CAAC,IAAI,CAAC,GAAG,QAAQ,sBAAsB,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACpE,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,sBAAsB,UAAU,KAAK,GAAG,EAAE,CAAC,CAAC;YAC7D,oEAAoE;YACpE,oEAAoE;YACpE,CAAC,CAAC,IAAI,CAAC,GAAG,aAAa,sBAAsB,UAAU,KAAK,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YAC1G,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,aAAa,QAAQ,KAAK,OAAO,EAAE,CAAC,CAAC;YACpD,CAAC,CAAC,IAAI,CAAC,GAAG,YAAY,aAAa,KAAK,KAAK,aAAa,EAAE,CAAC,CAAC;YAC9D,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,aAAa,IAAI,KAAK,YAAY,EAAE,CAAC,CAAC;YACvD,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YACjC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACtB,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAChB,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,oBAAoB,UAAU,OAAO,IAAI,EAAE,CAAC,CAAC;YAC5D,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACf,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAC1B,CAAC,CAAC,IAAI,CAAC,GAAG,SAAS,aAAa,IAAI,IAAI,KAAK,YAAY,CAAC,CAAC;YAC3D,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,sBAAsB,SAAS,KAAK,UAAU,EAAE,CAAC,CAAC;YAChE,MAAM,cAAc,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACtD,CAAC,CAAC,IAAI,CAAC,GAAG,cAAc,eAAe,IAAI,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC,CAAC;YACrE,CAAC,CAAC,IAAI,CAAC,GAAG,WAAW,aAAa,IAAI,KAAK,cAAc,EAAE,CAAC,CAAC;YAC7D,IAAI,GAAG,WAAW,CAAC;YACnB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;gBACrC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,sBAAsB,UAAU,KAAK,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBACtF,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,aAAa,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC;gBAC5C,IAAI,GAAG,IAAI,CAAC;YACd,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACpB,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,aAAa,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC;IAC7C,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnD,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAE,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAE,CAAC,CAAC;QAC7D,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;YAC7D,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAC5E,kEAAkE;YAClE,kEAAkE;YAClE,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,sBAAsB,KAAM,CAAC,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1E,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,sBAAsB,KAAM,CAAC,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1E,CAAC,CAAC,IAAI,CAAC,GAAG,SAAS,aAAa,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC;YACnD,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,aAAa,KAAK,KAAK,SAAS,EAAE,CAAC,CAAC;YAClD,KAAK,GAAG,IAAI,CAAC;QACf,CAAC;IACH,CAAC;IACD,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAC9B,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACrB,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IAClE,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,qCAAqC,IAAI,KAAK,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC;IAChF,IAAI,UAAU,GAAG,EAAE,EAAE,WAAW,GAAG,EAAE,CAAC;IACtC,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7D,MAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/C,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,IAAI,GAAW,CAAC;QAChB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,MAAM,GAAG,KAAM,CAAC,IAAI,CAAC;YACzB,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;gBAChB,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;gBACjB,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,qBAAqB,KAAM,CAAC,IAAI,WAAW,CAAC,CAAC;YAC/D,CAAC;YACD,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACd,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,cAAc,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,IAAI,MAAM,QAAQ,IAAI,EAAE,CAAC,CAAC;QACvF,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzB,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAM,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAM,CAAC,MAAM,CAAC,CAAC;YACpF,GAAG,GAAG,MAAM,CAAC;YACb,IAAI,IAAI,GAAG,EAAE,EAAE,CAAC;gBACd,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;gBACd,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,gBAAgB,MAAM,QAAQ,IAAI,EAAE,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,EAAE,KAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YACvE,IAAI,YAAY,IAAI,CAAC,YAAY,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;gBAChE,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC;gBACxB,IAAI,YAAY,CAAC,IAAI,KAAK,IAAI,IAAI,EAAE,EAAE,CAAC;oBACrC,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;oBACd,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,YAAY,YAAY,CAAC,IAAI,IAAI,YAAY,CAAC,IAAI,QAAQ,IAAI,EAAE,CAAC,CAAC;gBACjF,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,UAAU,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;gBAC3D,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,sBAAsB,KAAM,CAAC,IAAI,KAAK,KAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBAClE,CAAC,CAAC,IAAI,CAAC,GAAG,UAAU,gBAAgB,GAAG,YAAY,MAAM,CAAC,CAAC,CAAC,YAAY,KAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBACvF,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,oBAAoB,UAAU,SAAS,CAAC,CAAC;gBACxD,GAAG,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;gBACd,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,gBAAgB,KAAK,QAAQ,IAAI,EAAE,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACzD,CAAC,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,MAAM,SAAS,OAAO,WAAW,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,UAAU,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACrB,CAAC,CAAC,IAAI,CAAC,GAAG,UAAU,kBAAkB,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACvB,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,YAAY,IAAI,SAAS,OAAO,WAAW,CAAC,CAAC;QAC7D,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACzD,UAAU,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACrB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;gBAChB,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;gBACtB,CAAC,CAAC,IAAI,CAAC,GAAG,KAAK,kBAAkB,GAAG,WAAW,CAAC,CAAC;gBACjD,CAAC,CAAC,IAAI,CAAC,GAAG,UAAU,kBAAkB,KAAK,YAAY,CAAC,CAAC;YAC3D,CAAC;;gBAAM,CAAC,CAAC,IAAI,CAAC,GAAG,UAAU,kBAAkB,GAAG,YAAY,CAAC,CAAC;QAChE,CAAC;aAAM,CAAC;YACN,CAAC,CAAC,IAAI,CAAC,GAAG,UAAU,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,IAAI,GAAG,YAAY,CAAC,CAAC;YACzF,IAAI,SAAS,EAAE,CAAC;gBACd,WAAW,GAAG,GAAG,CAAC;gBAClB,IAAI,IAAI,IAAI,EAAE,KAAK,WAAW,EAAE,CAAC;oBAC/B,WAAW,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;oBACtB,CAAC,CAAC,IAAI,CAAC,GAAG,WAAW,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,IAAI,IAAI,GAAG,OAAO,WAAW,EAAE,CAAC,CAAC;gBAChG,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IACf,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IACX,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,MAAM,OAAO,GAAG,QAAQ,EAAE,CAAC;IAC3B,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,IAAI,SAAS,EAAE,CAAC;QACd,WAAW,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACtB,CAAC,CAAC,IAAI,CAAC,GAAG,WAAW,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,WAAW,OAAO,CAAC,IAAI,OAAO,WAAW,EAAE,CAAC,CAAC;IAC3G,CAAC;IACD,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IACf,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;IACX,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACnB,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9D,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;IACvB,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,mBAAmB,UAAU,MAAM,QAAQ,SAAS,OAAO,CAAC,IAAI,MAAM,QAAQ,IAAI,CAAC,CAAC;IACpG,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;QACxB,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,UAAU,WAAW,MAAM,WAAW,MAAM,QAAQ,SAAS,WAAW,MAAM,QAAQ,IAAI,CAAC,CAAC;QAC7G,MAAM,MAAM,GAAG,WAAW,KAAK,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QACzD,IAAI,WAAW,KAAK,KAAK;YAAE,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,gBAAgB,OAAO,SAAS,CAAC,CAAC;QAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,CAAC;IACtI,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { IrExpr, IrFunction, IrStmt } from "../../ir/ir.js";
|
|
2
|
+
import type { IntegerRanges } from "../../ir/integer-ranges.js";
|
|
3
|
+
type Node = IrExpr | IrStmt;
|
|
4
|
+
/** Relational proofs for fixed typed-array lengths. Cached lengths retain
|
|
5
|
+
* their receiver identity only when that binding is never reassigned.
|
|
6
|
+
* Loops may use offsets in either direction, but both index integrality
|
|
7
|
+
* and receiver stability are established separately from the relation. */
|
|
8
|
+
export declare function findBytesBounds(fn: IrFunction, ranges: IntegerRanges): ReadonlySet<Node>;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { integerArithmeticRange } from "../../ir/integer-ranges.js";
|
|
2
|
+
import { everyExprChild, everyStmtChild, everyStmtList } from "../../ir/traverse.js";
|
|
3
|
+
import { isStableReceiverOperand } from "../../ir/analysis.js";
|
|
4
|
+
import { byteNumberAccess } from "../../ir/byte-numbers.js";
|
|
5
|
+
/** Relational proofs for fixed typed-array lengths. Cached lengths retain
|
|
6
|
+
* their receiver identity only when that binding is never reassigned.
|
|
7
|
+
* Loops may use offsets in either direction, but both index integrality
|
|
8
|
+
* and receiver stability are established separately from the relation. */
|
|
9
|
+
export function findBytesBounds(fn, ranges) {
|
|
10
|
+
const proved = new Map();
|
|
11
|
+
if (fn.async || fn.generator || !fn.locals.some((local) => local.type.kind === "bytes"))
|
|
12
|
+
return new Set();
|
|
13
|
+
const locals = new Map(fn.locals.map((l) => [l.id, l]));
|
|
14
|
+
const captured = new Set([...(fn.captures ?? []), ...(fn.classCaptures ?? [])].map((c) => c.localId));
|
|
15
|
+
const changed = new Set();
|
|
16
|
+
const initializers = new Map();
|
|
17
|
+
everyStmtList(fn.body, {
|
|
18
|
+
expr: (e) => { if (e.kind === "assignExpr" || e.kind === "incDec")
|
|
19
|
+
changed.add(e.localId); return true; },
|
|
20
|
+
stmt: (s) => {
|
|
21
|
+
if (s.kind === "assign" || s.kind === "forOf")
|
|
22
|
+
changed.add(s.localId);
|
|
23
|
+
if (s.kind === "varDecl" && s.init)
|
|
24
|
+
initializers.set(s.localId, s.init);
|
|
25
|
+
return true;
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
const eligible = (id) => {
|
|
29
|
+
const local = locals.get(id);
|
|
30
|
+
return local !== undefined && !local.boxed && !local.tdz && !captured.has(id);
|
|
31
|
+
};
|
|
32
|
+
const cached = new Map();
|
|
33
|
+
const resolving = new Set();
|
|
34
|
+
function extent(e, cache) {
|
|
35
|
+
if (e.kind === "bytesIntrinsic" && (e.method === "length" || e.method === "byteLength" &&
|
|
36
|
+
e.receiver.type.kind === "bytes" && (e.receiver.type.elem === "u8" || e.receiver.type.elem === "u8c")) && e.receiver.kind === "varRef" &&
|
|
37
|
+
eligible(e.receiver.localId) && (!cache || !changed.has(e.receiver.localId)))
|
|
38
|
+
return { receiver: e.receiver.localId, offset: 0 };
|
|
39
|
+
if (e.kind === "varRef" && eligible(e.localId) && !changed.has(e.localId)) {
|
|
40
|
+
const previous = cached.get(e.localId);
|
|
41
|
+
if (previous !== undefined)
|
|
42
|
+
return previous;
|
|
43
|
+
const init = initializers.get(e.localId);
|
|
44
|
+
if (!init || resolving.has(e.localId))
|
|
45
|
+
return null;
|
|
46
|
+
resolving.add(e.localId);
|
|
47
|
+
const result = extent(init, true);
|
|
48
|
+
resolving.delete(e.localId);
|
|
49
|
+
cached.set(e.localId, result);
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
if (e.kind === "bin" && (e.op === "+" || e.op === "-") && e.right.kind === "numLit" &&
|
|
53
|
+
Number.isSafeInteger(e.right.value) && ranges.get(e)) {
|
|
54
|
+
const left = extent(e.left, cache);
|
|
55
|
+
const offset = left ? left.offset + (e.op === "+" ? e.right.value : -e.right.value) : NaN;
|
|
56
|
+
if (left && Number.isSafeInteger(offset))
|
|
57
|
+
return { receiver: left.receiver, offset };
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
function affine(e, counter) {
|
|
62
|
+
if (e.kind === "varRef" && e.localId === counter)
|
|
63
|
+
return 0;
|
|
64
|
+
if (e.kind !== "bin" || (e.op !== "+" && e.op !== "-") || e.right.kind !== "numLit" || !Number.isSafeInteger(e.right.value))
|
|
65
|
+
return null;
|
|
66
|
+
const left = affine(e.left, counter);
|
|
67
|
+
if (left === null)
|
|
68
|
+
return null;
|
|
69
|
+
const result = left + (e.op === "+" ? e.right.value : -e.right.value);
|
|
70
|
+
return Number.isSafeInteger(result) ? result : null;
|
|
71
|
+
}
|
|
72
|
+
function affineRange(e, bound) {
|
|
73
|
+
if (e.kind === "varRef" && e.localId === bound.counter) {
|
|
74
|
+
const max = Number.MAX_SAFE_INTEGER + bound.offset - 1;
|
|
75
|
+
return Number.isSafeInteger(max) && bound.minimum <= max ? { min: bound.minimum, max } : null;
|
|
76
|
+
}
|
|
77
|
+
if (e.kind !== "bin" || (e.op !== "+" && e.op !== "-") || e.right.kind !== "numLit" || !Number.isSafeInteger(e.right.value))
|
|
78
|
+
return null;
|
|
79
|
+
const left = affineRange(e.left, bound);
|
|
80
|
+
return left ? integerArithmeticRange(e.op, left, { min: e.right.value, max: e.right.value }) : null;
|
|
81
|
+
}
|
|
82
|
+
function stable(body, receiver, counter) {
|
|
83
|
+
return everyStmtList(body, {
|
|
84
|
+
expr: (e) => {
|
|
85
|
+
if ((e.kind === "assignExpr" || e.kind === "incDec") && (e.localId === receiver || e.localId === counter))
|
|
86
|
+
return false;
|
|
87
|
+
return isStableReceiverOperand(e, receiver);
|
|
88
|
+
},
|
|
89
|
+
stmt: (s) => {
|
|
90
|
+
if (s.kind === "assign" && (s.localId === receiver || s.localId === counter))
|
|
91
|
+
return false;
|
|
92
|
+
switch (s.kind) {
|
|
93
|
+
case "varDecl":
|
|
94
|
+
case "assign":
|
|
95
|
+
case "exprStmt":
|
|
96
|
+
case "bytesSet":
|
|
97
|
+
case "if":
|
|
98
|
+
case "block":
|
|
99
|
+
case "for":
|
|
100
|
+
case "while":
|
|
101
|
+
case "doWhile":
|
|
102
|
+
case "break":
|
|
103
|
+
case "continue":
|
|
104
|
+
case "return": return true;
|
|
105
|
+
default: return false;
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
function loopBound(s) {
|
|
111
|
+
if (s.init?.kind !== "varDecl" || !s.init.init || !eligible(s.init.localId) || s.cond?.kind !== "bin")
|
|
112
|
+
return null;
|
|
113
|
+
const counter = s.init.localId;
|
|
114
|
+
let right = s.cond.right, op = s.cond.op;
|
|
115
|
+
if (s.cond.left.kind !== "varRef" || s.cond.left.localId !== counter) {
|
|
116
|
+
if (right.kind !== "varRef" || right.localId !== counter)
|
|
117
|
+
return null;
|
|
118
|
+
right = s.cond.left;
|
|
119
|
+
op = { "<": ">", "<=": ">=", ">": "<", ">=": "<=" }[op] ?? "";
|
|
120
|
+
}
|
|
121
|
+
const update = s.update;
|
|
122
|
+
let step = 0;
|
|
123
|
+
if (update?.kind === "assign" && update.localId === counter && update.value.kind === "bin" && update.value.left.kind === "varRef" &&
|
|
124
|
+
update.value.left.localId === counter && update.value.right.kind === "numLit") {
|
|
125
|
+
step = update.value.op === "+" ? update.value.right.value : update.value.op === "-" ? -update.value.right.value : 0;
|
|
126
|
+
}
|
|
127
|
+
else if (update?.kind === "exprStmt" && update.expr.kind === "incDec" && update.expr.localId === counter)
|
|
128
|
+
step = update.expr.op === "+" ? 1 : -1;
|
|
129
|
+
if (!Number.isSafeInteger(step) || step === 0)
|
|
130
|
+
return null;
|
|
131
|
+
let result = null;
|
|
132
|
+
if (step > 0 && (op === "<" || op === "<=")) {
|
|
133
|
+
const length = extent(right, false), start = ranges.get(s.init.init);
|
|
134
|
+
if (length && start)
|
|
135
|
+
result = { ...length, counter, offset: length.offset + (op === "<=" ? 1 : 0), minimum: start.min };
|
|
136
|
+
}
|
|
137
|
+
else if (step < 0 && (op === ">" || op === ">=") && right.kind === "numLit" && Number.isFinite(right.value)) {
|
|
138
|
+
const start = extent(s.init.init, false);
|
|
139
|
+
if (start)
|
|
140
|
+
result = { ...start, counter, offset: start.offset + 1, minimum: op === ">" ? Math.floor(right.value) + 1 : Math.ceil(right.value) };
|
|
141
|
+
}
|
|
142
|
+
return result && stable(s.body, result.receiver, counter) ? result : null;
|
|
143
|
+
}
|
|
144
|
+
function access(node, array, index, active, width) {
|
|
145
|
+
const integer = ranges.get(index);
|
|
146
|
+
let safe = false;
|
|
147
|
+
if (array.kind === "varRef" && eligible(array.localId)) {
|
|
148
|
+
for (const bound of active) {
|
|
149
|
+
if (array.localId !== bound.receiver)
|
|
150
|
+
continue;
|
|
151
|
+
if (!integer && !affineRange(index, bound))
|
|
152
|
+
continue;
|
|
153
|
+
const offset = affine(index, bound.counter);
|
|
154
|
+
if (offset !== null && bound.minimum + offset >= 0 && bound.offset + offset + width - 1 <= 0) {
|
|
155
|
+
safe = true;
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
proved.set(node, (proved.get(node) ?? true) && safe);
|
|
161
|
+
}
|
|
162
|
+
function expr(e, active) {
|
|
163
|
+
if (e.kind === "bytesIntrinsic" && e.method === "get" && e.args[0])
|
|
164
|
+
access(e, e.receiver, e.args[0], active, 1);
|
|
165
|
+
const numeric = byteNumberAccess(e);
|
|
166
|
+
if (numeric && e.kind === "bytesIntrinsic")
|
|
167
|
+
access(e, e.receiver, e.args[numeric.offsetArg], active, numeric.width);
|
|
168
|
+
return everyExprChild(e, (child) => expr(child, active), (child) => stmt(child, active));
|
|
169
|
+
}
|
|
170
|
+
function stmt(s, active) {
|
|
171
|
+
if (s.kind === "bytesSet")
|
|
172
|
+
access(s, s.arr, s.index, active, 1);
|
|
173
|
+
if (s.kind === "for") {
|
|
174
|
+
if (s.init)
|
|
175
|
+
stmt(s.init, active);
|
|
176
|
+
if (s.cond)
|
|
177
|
+
expr(s.cond, active);
|
|
178
|
+
if (s.update)
|
|
179
|
+
stmt(s.update, active);
|
|
180
|
+
const bound = loopBound(s);
|
|
181
|
+
const body = bound ? [...active, bound] : active;
|
|
182
|
+
return s.body.every((child) => stmt(child, body));
|
|
183
|
+
}
|
|
184
|
+
return everyStmtChild(s, (child) => expr(child, active), (child) => stmt(child, active));
|
|
185
|
+
}
|
|
186
|
+
fn.body.every((s) => stmt(s, []));
|
|
187
|
+
return new Set([...proved].filter(([, safe]) => safe).map(([node]) => node));
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=bytes-bounds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bytes-bounds.js","sourceRoot":"","sources":["../../../src/backend/llvm/bytes-bounds.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import { type IrFunction } from "../../ir/ir.js";
|
|
2
2
|
export interface CallLifetimes {
|
|
3
|
+
/** Unchanged heap bindings can borrow the caller's owner. Copies that
|
|
4
|
+
* escape through returns, stores or other calls still acquire ownership.
|
|
5
|
+
* This does not permit passing a stack box to the parameter. */
|
|
6
|
+
borrowed: Map<string, Set<number>>;
|
|
7
|
+
/** Locals initialized once and never assigned or captured. A source let
|
|
8
|
+
* binding may be stable too; source mutability alone is not a write. */
|
|
9
|
+
bindings: Map<string, Set<string>>;
|
|
3
10
|
/** Parameters consumed only by projections, borrowing string operations,
|
|
4
11
|
* or other proven parameters.
|
|
5
12
|
* This is a lifetime fact, not a purity or nonthrowing guarantee. */
|