Skip to content

Commit 370de8c

Browse files
committed
slightly improve division and folding over constants (rescript-lang#221)
1 parent 0181b3c commit 370de8c

36 files changed

+197
-205
lines changed

jscomp/js_exp_make.ml

+24-10
Original file line numberDiff line numberDiff line change
@@ -1018,15 +1018,33 @@ let float_notequal ?comment e1 e2 =
10181018
let unchecked_int32_div ?comment e1 e2 : J.expression =
10191019
to_int32 (float_div ?comment e1 e2)
10201020

1021-
let int32_div ?comment e1 e2 : J.expression =
1022-
to_int32 (float_div ?comment e1 e2)
1021+
let int32_asr ?comment e1 e2 : J.expression =
1022+
{ comment ;
1023+
expression_desc = Bin (Asr, e1,e2)
1024+
}
1025+
1026+
let int32_div ?comment (e1 : J.expression) (e2 : J.expression)
1027+
: J.expression =
1028+
match e1.expression_desc, e2.expression_desc with
1029+
| Length _ , Number (Int {i = 2l} | Uint 2l | Nint 2n)
1030+
-> int32_asr e1 one_int_literal
1031+
| Number(Int {i = i0}) , Number (Int {i = i1} ) when i1 <> 0l
1032+
-> int (Int32.div i0 i1)
1033+
| _, _ ->
1034+
to_int32 (float_div ?comment e1 e2)
10231035

10241036

10251037
(* TODO: call primitive *)
1026-
let int32_mul ?comment e1 e2 : J.expression =
1027-
{ comment ;
1028-
expression_desc = Bin (Mul, e1,e2)
1029-
}
1038+
let int32_mul ?comment
1039+
(e1 : J.expression)
1040+
(e2 : J.expression) : J.expression =
1041+
match e1.expression_desc, e2.expression_desc with
1042+
| Number (Int{i = i0}), Number (Int {i = i1})
1043+
-> int (Int32.mul i0 i1)
1044+
| _ ->
1045+
{ comment ;
1046+
expression_desc = Bin (Mul, e1,e2)
1047+
}
10301048

10311049
let unchecked_int32_mul ?comment e1 e2 : J.expression =
10321050
{ comment ;
@@ -1051,10 +1069,6 @@ let int32_lsl ?comment e1 e2 : J.expression =
10511069

10521070

10531071

1054-
let int32_asr ?comment e1 e2 : J.expression =
1055-
{ comment ;
1056-
expression_desc = Bin (Asr, e1,e2)
1057-
}
10581072

10591073
let rec int32_bxor ?comment (e1 : t) (e2 : t) : J.expression =
10601074
match e1.expression_desc, e2.expression_desc with

jscomp/lam_compile_primitive.ml

+8-1
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,15 @@ let translate
145145
E.float_minus e1 e2
146146
| _ -> assert false
147147
end
148-
| Pmulint
149148
| Pmulbint Lambda.Pnativeint
149+
->
150+
begin match args with
151+
| [e1; e2] ->
152+
E.unchecked_int32_mul e1 e2
153+
| _ -> assert false
154+
end
155+
156+
| Pmulint
150157
| Pmulbint Lambda.Pint32
151158
->
152159
begin match args with

jscomp/lam_pass_lets_dce.ml

+8
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,14 @@ let lets_helper (count_var : Ident.t -> used_info) lam =
164164
| {times = 0; _}, _ -> simplif l2
165165
| {times = 1; captured = false }, _
166166
| {times = 1; captured = true }, (Lconst _ | Lvar _)
167+
| _, (Lconst (Const_base (
168+
Const_int _ | Const_char _ | Const_float _ | Const_int32 _
169+
| Const_nativeint _ )))
170+
(* Const_int64 is no longer primitive
171+
Note for some constant which is not
172+
inlined, we can still record it and
173+
do constant folding independently
174+
*)
167175
->
168176
Hashtbl.add subst v (simplif l1); simplif l2
169177
| _ -> Llet(Alias, v, simplif l1, simplif l2)

jscomp/runtime/caml_string.js

+2-3
Original file line numberDiff line numberDiff line change
@@ -122,14 +122,13 @@ function bytes_to_string(a) {
122122
var len = a.length;
123123
var s = "";
124124
var s_len = len;
125-
var seg = 1024;
126-
if (i === 0 && len <= 4 * seg && len === bytes.length) {
125+
if (i === 0 && len <= 4096 && len === bytes.length) {
127126
return String.fromCharCode.apply(null,bytes);
128127
}
129128
else {
130129
var offset = 0;
131130
while(s_len > 0) {
132-
var next = s_len < 1024 ? s_len : seg;
131+
var next = s_len < 1024 ? s_len : 1024;
133132
var tmp_bytes = new Array(next);
134133
caml_blit_bytes(bytes, offset, tmp_bytes, 0, next);
135134
s = s + String.fromCharCode.apply(null,tmp_bytes);

jscomp/stdlib/array.js

+2-4
Original file line numberDiff line numberDiff line change
@@ -355,8 +355,6 @@ function sort(cmp, a) {
355355
}
356356
}
357357

358-
var cutoff = 5;
359-
360358
function stable_sort(cmp, a) {
361359
var merge = function (src1ofs, src1len, src2, src2ofs, src2len, dst, dstofs) {
362360
var src1r = src1ofs + src1len;
@@ -415,7 +413,7 @@ function stable_sort(cmp, a) {
415413
return /* () */0;
416414
};
417415
var sortto = function (srcofs, dst, dstofs, len) {
418-
if (len <= cutoff) {
416+
if (len <= 5) {
419417
return isortto(srcofs, dst, dstofs, len);
420418
}
421419
else {
@@ -427,7 +425,7 @@ function stable_sort(cmp, a) {
427425
}
428426
};
429427
var l = a.length;
430-
if (l <= cutoff) {
428+
if (l <= 5) {
431429
return isortto(0, a, 0, l);
432430
}
433431
else {

jscomp/stdlib/camlinternalFormat.js

+3-5
Original file line numberDiff line numberDiff line change
@@ -269,8 +269,6 @@ function param_format_of_ignored_format(ign, fmt) {
269269
}
270270
}
271271

272-
var default_float_precision = 6;
273-
274272
function buffer_check_size(buf, overhead) {
275273
var len = buf[/* bytes */1].length;
276274
var min_len = buf[/* ind */0] + overhead;
@@ -3893,7 +3891,7 @@ function make_printf(_k, o, _acc, _fmt) {
38933891
else {
38943892
return (function(k$1,o$1,acc$1,fmt$1,fconv){
38953893
return function (x) {
3896-
var str = convert_float(fconv, default_float_precision, x);
3894+
var str = convert_float(fconv, 6, x);
38973895
return make_printf(k$1, o$1, /* Acc_data_string */{
38983896
0: acc$1,
38993897
1: str,
@@ -3938,7 +3936,7 @@ function make_printf(_k, o, _acc, _fmt) {
39383936
else {
39393937
return (function(k$1,o$1,acc$1,fmt$1,fconv,padty){
39403938
return function (w, x) {
3941-
var str = convert_float(fconv, default_float_precision, x);
3939+
var str = convert_float(fconv, 6, x);
39423940
var str$prime = fix_padding(padty, w, str);
39433941
return make_printf(k$1, o$1, /* Acc_data_string */{
39443942
0: acc$1,
@@ -3985,7 +3983,7 @@ function make_printf(_k, o, _acc, _fmt) {
39853983
else {
39863984
return (function(k$1,o$1,acc$1,fmt$1,fconv,padty$1,w){
39873985
return function (x) {
3988-
var str = convert_float(fconv, default_float_precision, x);
3986+
var str = convert_float(fconv, 6, x);
39893987
var str$prime = fix_padding(padty$1, w, str);
39903988
return make_printf(k$1, o$1, /* Acc_data_string */{
39913989
0: acc$1,

jscomp/stdlib/format.js

+4-6
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,6 @@ function pp_clear_queue(state) {
8080
return /* () */0;
8181
}
8282

83-
var pp_infinity = 1000000010;
84-
8583
function pp_output_string(state, s) {
8684
return Caml_curry.app3(state[/* pp_out_string */16], s, 0, s.length);
8785
}
@@ -356,7 +354,7 @@ function advance_left(state) {
356354
}
357355
else {
358356
take_queue(state$1[/* pp_queue */26]);
359-
format_pp_token(state$1, size < 0 ? pp_infinity : size, match[/* token */1]);
357+
format_pp_token(state$1, size < 0 ? 1000000010 : size, match[/* token */1]);
360358
state$1[/* pp_left_total */11] = match[/* length */2] + state$1[/* pp_left_total */11];
361359
continue ;
362360

@@ -634,7 +632,7 @@ function pp_flush_queue(state, b) {
634632
while(state[/* pp_curr_depth */13] > 1) {
635633
pp_close_box(state, /* () */0);
636634
};
637-
state[/* pp_right_total */12] = pp_infinity;
635+
state[/* pp_right_total */12] = 1000000010;
638636
advance_left(state);
639637
if (b) {
640638
Caml_curry.app1(state[/* pp_out_newline */18], /* () */0);
@@ -927,11 +925,11 @@ function pp_get_ellipsis_text(state, _) {
927925
}
928926

929927
function pp_limit(n) {
930-
if (n < pp_infinity) {
928+
if (n < 1000000010) {
931929
return n;
932930
}
933931
else {
934-
return pp_infinity - 1;
932+
return 1000000009;
935933
}
936934
}
937935

jscomp/stdlib/marshal.js

+6-6
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,8 @@ function to_buffer(buff, ofs, len, v, flags) {
1717
}
1818
}
1919

20-
var header_size = 20;
21-
2220
function data_size(buff, ofs) {
23-
if (ofs < 0 || ofs > buff.length - header_size) {
21+
if (ofs < 0 || ofs > buff.length - 20) {
2422
throw [
2523
Caml_builtin_exceptions.invalid_argument,
2624
"Marshal.data_size"
@@ -32,19 +30,19 @@ function data_size(buff, ofs) {
3230
}
3331

3432
function total_size(buff, ofs) {
35-
return header_size + data_size(buff, ofs);
33+
return 20 + data_size(buff, ofs);
3634
}
3735

3836
function from_bytes(buff, ofs) {
39-
if (ofs < 0 || ofs > buff.length - header_size) {
37+
if (ofs < 0 || ofs > buff.length - 20) {
4038
throw [
4139
Caml_builtin_exceptions.invalid_argument,
4240
"Marshal.from_bytes"
4341
];
4442
}
4543
else {
4644
var len = Caml_primitive.caml_marshal_data_size(buff, ofs);
47-
if (ofs > buff.length - (header_size + len)) {
45+
if (ofs > buff.length - (20 + len)) {
4846
throw [
4947
Caml_builtin_exceptions.invalid_argument,
5048
"Marshal.from_bytes"
@@ -68,6 +66,8 @@ function from_channel(prim) {
6866
return Caml_primitive.caml_input_value(prim);
6967
}
7068

69+
var header_size = 20;
70+
7171
exports.to_channel = to_channel;
7272
exports.to_buffer = to_buffer;
7373
exports.from_channel = from_channel;

jscomp/stdlib/obj.js

+10-10
Original file line numberDiff line numberDiff line change
@@ -25,22 +25,16 @@ function unmarshal(str, pos) {
2525
];
2626
}
2727

28-
var object_tag = 248;
29-
30-
var string_tag = 252;
31-
32-
var custom_tag = 255;
33-
3428
function extension_slot(x) {
35-
var slot = x.length && (x.tag | 0) !== object_tag && x.length >= 1 ? x[0] : x;
29+
var slot = x.length && (x.tag | 0) !== 248 && x.length >= 1 ? x[0] : x;
3630
var name;
37-
if (slot.length && (slot.tag | 0) === object_tag) {
31+
if (slot.length && slot.tag === 248) {
3832
name = slot[0];
3933
}
4034
else {
4135
throw Caml_builtin_exceptions.not_found;
4236
}
43-
if ((name.tag | 0) === string_tag) {
37+
if (name.tag === 252) {
4438
return slot;
4539
}
4640
else {
@@ -109,6 +103,8 @@ var lazy_tag = 246;
109103

110104
var closure_tag = 247;
111105

106+
var object_tag = 248;
107+
112108
var infix_tag = 249;
113109

114110
var forward_tag = 250;
@@ -117,11 +113,15 @@ var no_scan_tag = 251;
117113

118114
var abstract_tag = 251;
119115

116+
var string_tag = 252;
117+
120118
var double_tag = 253;
121119

122120
var double_array_tag = 254;
123121

124-
var final_tag = custom_tag;
122+
var custom_tag = 255;
123+
124+
var final_tag = 255;
125125

126126
var int_tag = 1000;
127127

jscomp/stdlib/random.js

+1-2
Original file line numberDiff line numberDiff line change
@@ -169,10 +169,9 @@ var nativeint = Nativeint.size === 32 ? function (s, bound) {
169169
};
170170

171171
function rawfloat(s) {
172-
var scale = 1073741824.0;
173172
var r1 = bits(s);
174173
var r2 = bits(s);
175-
return (r1 / scale + r2) / scale;
174+
return (r1 / 1073741824.0 + r2) / 1073741824.0;
176175
}
177176

178177
function $$float(s, bound) {

jscomp/stdlib/scanf.js

+3-5
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ var Caml_string = require("../runtime/caml_string");
1414
var List = require("./list");
1515
var CamlinternalFormat = require("./camlinternalFormat");
1616

17-
var null_char = /* "\000" */0;
18-
1917
function next_char(ib) {
2018
try {
2119
var c = Caml_curry.app1(ib[/* get_next_char */6], /* () */0);
@@ -29,10 +27,10 @@ function next_char(ib) {
2927
}
3028
catch (exn){
3129
if (exn === Caml_builtin_exceptions.end_of_file) {
32-
ib[/* current_char */1] = null_char;
30+
ib[/* current_char */1] = /* "\000" */0;
3331
ib[/* current_char_is_valid */2] = /* false */0;
3432
ib[/* eof */0] = /* true */1;
35-
return null_char;
33+
return /* "\000" */0;
3634
}
3735
else {
3836
throw exn;
@@ -115,7 +113,7 @@ function store_char(width, ib, c) {
115113
function create(iname, next) {
116114
return /* record */[
117115
/* false */0,
118-
null_char,
116+
/* "\000" */0,
119117
/* false */0,
120118
0,
121119
0,

jscomp/stdlib/sys.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@ function set_signal(sig_num, sig_beh) {
2828
return sig_beh;
2929
}
3030

31-
var sigint = -6;
32-
3331
var Break = {
3432
0: "Sys.Break",
3533
1: Caml_builtin_exceptions.get_id(),
@@ -39,7 +37,7 @@ var Break = {
3937

4038
function catch_break(on) {
4139
if (on) {
42-
;
40+
-6;
4341
return /* Signal_handle */{
4442
0: function () {
4543
throw Break;
@@ -49,7 +47,7 @@ function catch_break(on) {
4947
};
5048
}
5149
else {
52-
;
50+
-6;
5351
return /* Signal_default */0;
5452
}
5553
}
@@ -70,6 +68,8 @@ var sighup = -4;
7068

7169
var sigill = -5;
7270

71+
var sigint = -6;
72+
7373
var sigkill = -7;
7474

7575
var sigpipe = -8;

0 commit comments

Comments
 (0)