Skip to content

Commit 2e55465

Browse files
authored
Forward useful improvements within blocked PRs (AssemblyScript#964)
1 parent af0ab31 commit 2e55465

29 files changed

+512
-272
lines changed

.github/workflows/publish.yml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ jobs:
3030
npm run build
3131
- name: Test distribution files
3232
run: npm test
33-
- name: Reconfigure for release
34-
run: npm run release
3533
- name: Set up version
3634
run: |
3735
VERSION=$(node -e "console.log(require('./package.json').version)")

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ node_modules/
55
out/
66
raw/
77
.history
8+
*.backup

cli/asc.js

Lines changed: 123 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -600,34 +600,143 @@ exports.main = function main(argv, options, callback) {
600600
module.setShrinkLevel(shrinkLevel);
601601
module.setDebugInfo(args.debug);
602602

603-
var runPasses = [];
603+
const runPasses = [];
604604
if (args.runPasses) {
605605
if (typeof args.runPasses === "string") {
606606
args.runPasses = args.runPasses.split(",");
607607
}
608608
if (args.runPasses.length) {
609609
args.runPasses.forEach(pass => {
610-
if (runPasses.indexOf(pass) < 0)
610+
if (runPasses.indexOf(pass = pass.trim()) < 0)
611611
runPasses.push(pass);
612612
});
613613
}
614614
}
615615

616-
// Optimize the module if requested
617-
if (optimizeLevel > 0 || shrinkLevel > 0) {
618-
stats.optimizeCount++;
619-
stats.optimizeTime += measure(() => {
620-
module.optimize();
621-
});
616+
function doOptimize() {
617+
const hasARC = args.runtime == "half" || args.runtime == "full";
618+
const passes = [];
619+
function add(pass) { passes.push(pass); }
620+
621+
// Optimize the module if requested
622+
if (optimizeLevel > 0 || shrinkLevel > 0) {
623+
// Binaryen's default passes with Post-AssemblyScript passes added.
624+
// see: Binaryen/src/pass.cpp
625+
626+
// PassRunner::addDefaultGlobalOptimizationPrePasses
627+
add("duplicate-function-elimination");
628+
629+
// PassRunner::addDefaultFunctionOptimizationPasses
630+
if (optimizeLevel >= 3 || shrinkLevel >= 1) {
631+
add("ssa-nomerge");
632+
}
633+
if (optimizeLevel >= 4) {
634+
add("flatten");
635+
add("local-cse");
636+
}
637+
// if (hasARC) { // differs
638+
// if (optimizeLevel < 4) {
639+
// add("flatten");
640+
// }
641+
// add("post-assemblyscript");
642+
// }
643+
add("dce");
644+
add("remove-unused-brs");
645+
add("remove-unused-names");
646+
add("optimize-instructions");
647+
if (optimizeLevel >= 2 || shrinkLevel >= 2) {
648+
add("pick-load-signs");
649+
}
650+
if (optimizeLevel >= 3 || shrinkLevel >= 2) {
651+
add("precompute-propagate");
652+
} else {
653+
add("precompute");
654+
}
655+
if (optimizeLevel >= 2 || shrinkLevel >= 2) {
656+
add("code-pushing");
657+
}
658+
add("simplify-locals-nostructure");
659+
add("vacuum");
660+
add("reorder-locals");
661+
add("remove-unused-brs");
662+
if (optimizeLevel >= 3 || shrinkLevel >= 2) {
663+
add("merge-locals");
664+
}
665+
add("coalesce-locals");
666+
add("simplify-locals");
667+
add("vacuum");
668+
add("reorder-locals");
669+
add("coalesce-locals");
670+
add("reorder-locals");
671+
add("vacuum");
672+
if (optimizeLevel >= 3 || shrinkLevel >= 1) {
673+
add("code-folding");
674+
}
675+
add("merge-blocks");
676+
add("remove-unused-brs");
677+
add("remove-unused-names");
678+
add("merge-blocks");
679+
if (optimizeLevel >= 3 || shrinkLevel >= 2) {
680+
add("precompute-propagate");
681+
} else {
682+
add("precompute");
683+
}
684+
add("optimize-instructions");
685+
if (optimizeLevel >= 2 || shrinkLevel >= 1) {
686+
add("rse");
687+
}
688+
// if (hasARC) { // differs
689+
// add("post-assemblyscript-finalize");
690+
// }
691+
add("vacuum");
692+
693+
// PassRunner::addDefaultGlobalOptimizationPostPasses
694+
if (optimizeLevel >= 2 || shrinkLevel >= 1) {
695+
add("dae-optimizing");
696+
}
697+
if (optimizeLevel >= 2 || shrinkLevel >= 2) {
698+
add("inlining-optimizing");
699+
}
700+
add("duplicate-function-elimination");
701+
add("duplicate-import-elimination");
702+
if (optimizeLevel >= 2 || shrinkLevel >= 2) {
703+
add("simplify-globals-optimizing");
704+
} else {
705+
add("simplify-globals");
706+
}
707+
add("remove-unused-module-elements");
708+
add("memory-packing");
709+
add("directize");
710+
add("inlining-optimizing"); // differs
711+
if (optimizeLevel >= 2 || shrinkLevel >= 1) {
712+
add("generate-stack-ir");
713+
add("optimize-stack-ir");
714+
}
715+
}
716+
717+
// Append additional passes if requested and execute
718+
module.runPasses(passes.concat(runPasses));
622719
}
623720

624-
// Run additional passes if requested
625-
if (runPasses.length) {
721+
stats.optimizeTime += measure(() => {
626722
stats.optimizeCount++;
627-
stats.optimizeTime += measure(() => {
628-
module.runPasses(runPasses.map(pass => pass.trim()));
629-
});
630-
}
723+
doOptimize();
724+
if (args.converge) {
725+
let last = module.toBinary();
726+
do {
727+
stats.optimizeCount++;
728+
doOptimize();
729+
let next = module.toBinary();
730+
if (next.output.length >= last.output.length) {
731+
if (next.output.length > last.output.length) {
732+
stderr.write("Last converge was suboptimial." + EOL);
733+
}
734+
break;
735+
}
736+
last = next;
737+
} while (true);
738+
}
739+
});
631740

632741
// Prepare output
633742
if (!args.noEmit) {

cli/asc.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@
3333
"description": "How much to focus on shrinking code size. [0-2, s=1, z=2]",
3434
"type": "i"
3535
},
36+
"converge": {
37+
"description": "Re-optimizes until no further improvements can be made.",
38+
"type": "b",
39+
"default": false
40+
},
3641
"validate": {
3742
"description": "Validates the module using Binaryen. Exits if invalid.",
3843
"type": "b",

package-lock.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
"url": "https://github.com/AssemblyScript/assemblyscript/issues"
2222
},
2323
"dependencies": {
24-
"binaryen": "89.0.0-nightly.20191113",
24+
"binaryen": "89.0.0-nightly.20191116",
2525
"long": "^4.0.0",
2626
"source-map-support": "^0.5.16",
2727
"ts-node": "^6.2.0",
@@ -63,7 +63,8 @@
6363
"make": "npm run clean && npm test && npm run build && npm test",
6464
"all": "npm run check && npm run make",
6565
"docs": "typedoc --tsconfig tsconfig-docs.json --mode modules --name \"AssemblyScript Compiler API\" --out ./docs/api --ignoreCompilerErrors --excludeNotExported --excludePrivate --excludeExternals --exclude **/std/** --includeDeclarations --readme src/README.md",
66-
"release": "node scripts/release"
66+
"prepublishOnly": "node scripts/prepublish",
67+
"postpublish": "node scripts/postpublish"
6768
},
6869
"releaseFiles": [
6970
"lib/rtrace/index.d.ts",

scripts/postpublish-files.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
[
2+
"package.json",
3+
"index.js",
4+
"index.d.ts"
5+
]

scripts/postpublish.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// Reconfigures the repository after publishing
2+
3+
const fs = require("fs");
4+
const path = require("path");
5+
const devFiles = require("./postpublish-files.json");
6+
7+
console.log("Restoring development files ...");
8+
9+
devFiles.forEach(originalName => {
10+
const backupName = originalName + ".backup";
11+
const backupPath = path.join(__dirname, "..", backupName);
12+
if (!fs.existsSync(backupPath)) {
13+
console.log("- " + backupName + " does not exist");
14+
} else {
15+
console.log("- " + backupName + " -> " + originalName);
16+
fs.copyFileSync(
17+
backupPath,
18+
path.join(__dirname, "..", originalName)
19+
);
20+
fs.unlinkSync(backupPath);
21+
}
22+
});

scripts/release.js renamed to scripts/prepublish.js

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,25 @@
1-
// Reconfigures the repository before publishing a release
1+
// Reconfigures the repository before publishing
22

33
const fs = require("fs");
44
const path = require("path");
55
const pkg = require("../package.json");
6+
const devFiles = require("./postpublish-files.json");
7+
8+
if (!pkg.releaseFiles) {
9+
console.log("Package has already been updated");
10+
return;
11+
}
12+
13+
console.log("Backing up development files ...");
14+
15+
devFiles.forEach(originalName => {
16+
const backupName = originalName + ".backup";
17+
console.log("- " + originalName + " -> " + backupName);
18+
fs.copyFileSync(
19+
path.join(__dirname, "..", originalName),
20+
path.join(__dirname, "..", backupName)
21+
);
22+
});
623

724
console.log("Updating package.json ...");
825

src/builtins.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -905,6 +905,7 @@ export function compileCall(
905905
case TypeKind.USIZE: { value = "usize"; break; }
906906
case TypeKind.V128: { value = "v128"; break; }
907907
case TypeKind.ANYREF: { value = "anyref"; break; }
908+
case TypeKind.EXNREF: { value = "exnref"; break; }
908909
default: assert(false);
909910
case TypeKind.VOID: { value = "void"; break; }
910911
}
@@ -4788,7 +4789,7 @@ export function compileAbort(
47884789
// essentially ignoring the message GC-wise. Doesn't matter anyway on a crash.
47894790
messageArg = compiler.compileExpression(message, stringInstance.type, Constraints.CONV_IMPLICIT | Constraints.WILL_RETAIN);
47904791
} else {
4791-
messageArg = stringInstance.type.toNativeZero(module);
4792+
messageArg = compiler.makeZero(stringInstance.type);
47924793
}
47934794

47944795
var filenameArg = compiler.ensureStaticString(reportNode.range.source.normalizedPath);

src/common.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@ export namespace CommonSymbols {
198198
export const Uint64Array = "Uint64Array";
199199
export const Float32Array = "Float32Array";
200200
export const Float64Array = "Float64Array";
201+
export const Error = "Error";
201202
// runtime
202203
export const abort = "abort";
203204
export const pow = "pow";

0 commit comments

Comments
 (0)