summaryrefslogtreecommitdiff
path: root/lisp/emacs-lisp/comp-cstr.el
Commit message (Collapse)AuthorAgeFilesLines
* * Improve `comp-normalize-valset' reproducibility (bug#48021)Andrea Corallo2021-04-291-7/+12
| | | | | * lisp/emacs-lisp/comp-cstr.el (comp-normalize-valset): Make it more reproducible.
* Have `comp-cstr-intersection-no-mem' intersect pos neg value setsAndrea Corallo2021-04-271-1/+3
| | | | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-cstr-intersection-no-mem): intersect pos and neg value sets * test/lisp/emacs-lisp/comp-cstr-tests.el (comp-cstr-typespec-tests-alist): Add two tests and fix some test number.
* * lisp/emacs-lisp/comp-cstr.el (comp-ctxt): Initialize it.Andrea Corallo2021-04-261-1/+1
|
* Rework where `comp-ctxt' is defined.Andrea Corallo2021-04-261-0/+4
| | | | | | | * test/lisp/emacs-lisp/comp-cstr-tests.el (comp-ctxt): Remove `comp-ctxt' definition. * lisp/emacs-lisp/comp.el (comp-ctxt): Likewise. * lisp/emacs-lisp/comp-cstr.el (comp-ctxt): Define it here.
* ; Add 2021 to copyright yearsGlenn Morris2021-04-251-2/+1
|
* * lisp/emacs-lisp/comp-cstr.el (comp-cstr-union-1-no-mem): (not null) => t.Andrea Corallo2021-04-131-1/+9
|
* * lisp/emacs-lisp/comp-cstr.el (comp-normalize-valset): Remove duplicates.Andrea Corallo2021-04-131-6/+8
|
* ; Remove two unnecessary quotesAndrea Corallo2021-03-211-1/+1
| | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-cstr-=): Remove unnecessary quote. * lisp/emacs-lisp/comp.el (comp-compile-ctxt-to-file): Likewise.
* Use `length=' and family where possible in native comp codeAndrea Corallo2021-03-071-2/+2
| | | | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-intersect-typesets) (comp-cstr-imm): Use Use `length=' and family where possible. * lisp/emacs-lisp/comp.el (comp-add-cond-cstrs-target-block) (comp-compute-dominator-frontiers) (batch-byte-native-compile-for-bootstrap): Likewise.
* Fix `comp-cstr-intersection-no-hashcons' for negated result cstrAndrea Corallo2021-03-061-13/+19
| | | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-cstr-intersection-no-hashcons): When negated and necessary relax dst to t. * test/src/comp-tests.el (comp-tests-type-spec-tests): Add a test.
* Fix `=' propagation to handle -0.0 0.0 caseAndrea Corallo2021-03-061-2/+6
| | | | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-cstr-intersection-homogeneous): Fix indent + use `memql'. (comp-cstr-=): Handle 0.0 -0.0 idiosyncrasy * test/src/comp-tests.el (comp-tests-type-spec-tests): Add two tests and fix enumeration.
* Fix two compiler ICEs dealing with nan and infinityAndrea Corallo2021-03-031-3/+6
| | | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-cstr-=): Don't crash when truncate fails. * test/src/comp-test-funcs.el (comp-test-=-nan): Add two functions to be compiled.
* Fix = propagation semantic for constrained inputsAndrea Corallo2021-03-021-11/+30
| | | | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-cstr): Synthesize `comp-cstr-shallow-copy'. (comp-cstr-=): Relax inputs before intersecting them. * test/src/comp-tests.el (comp-tests-type-spec-tests): Add three tests.
* Fix `eql' `equal' propagation of non hash consed values (bug#46843)Andrea Corallo2021-03-011-0/+22
| | | | | | | | | | | | | | | | | | | | | | Extend assumes allowing the following form: (assume dst (and-nhc src1 src2)) `and-nhc' assume operator allow for constraining correctly intersections where non hash consed values are not propagated as values but rather promoted to their types. * lisp/emacs-lisp/comp-cstr.el (comp-cstr-intersection-no-hashcons): New function. * lisp/emacs-lisp/comp.el (comp-emit-assume): Logic update to emit `and-nhc' operator (implemented in fwprop by `comp-cstr-intersection-no-hashcons'). (comp-add-cond-cstrs): Map `eq' to `and' assume operator and `equal' `eql' into `and-nhc'. (comp-fwprop-insn): Update to handle `and-nhc'. * test/src/comp-tests.el (comp-tests-type-spec-tests): Add two tests covering `eql' and `equal' propagation of non hash consed values.
* Don't treat '=' as simple equality emitting constraints (bug#46812)Andrea Corallo2021-02-281-0/+12
| | | | | | | | | | | | | | | | | | | Extend assumes allowing the following form (assume dst (= src1 src2)) to caputure '=' semanting during fwprop handling float integer conversions. * lisp/emacs-lisp/comp.el (comp-equality-fun-p): Don't treat '=' as simple equality. (comp-arithm-cmp-fun-p, comp-negate-arithm-cmp-fun) (comp-reverse-arithm-fun): Rename and add '=' '!='. (comp-emit-assume, comp-add-cond-cstrs, comp-fwprop-insn): Update for new function nameing and to handle '='. * lisp/emacs-lisp/comp-cstr.el (comp-cstr-=): New function. * test/src/comp-tests.el (comp-tests-type-spec-tests): Add a bunch of '=' specific tests.
* Migrate and rename a bunch of functions from comp.el to comp-cstr.elAndrea Corallo2021-02-281-0/+70
| | | | | | | | | | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-cstr-imm-vld-p) (comp-cstr-imm, comp-cstr-fixnum-p, comp-cstr-symbol-p) (comp-cstr-cons-p): Move and rename from 'comp.el'. * lisp/emacs-lisp/comp.el (comp-mvar-type-hint-match-p) (make-comp-mvar, comp-emit-assume, comp-fwprop-prologue) (comp-function-foldable-p, comp-function-call-maybe-fold) (comp-fwprop-call, comp-fwprop-insn, comp-call-optim-func) (comp-compute-function-type): Update for renamed functions. * src/comp.c (emit_mvar_rval): Likewise. * test/src/comp-tests.el (comp-tests-mentioned-p-1) (comp-tests-cond-rw-checker-val): Likewise.
* * Fix union constraint for mixed pos/neg constraintsAndrea Corallo2021-02-221-0/+6
| | | | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-cstr-union-1-no-mem): Fix neg type shadowing pos values. * test/lisp/emacs-lisp/comp-cstr-tests.el (comp-cstr-typespec-tests-alist): Add testcase. * test/src/comp-tests.el (comp-tests-type-spec-tests): Fix testcase.
* Fix inverted logic in constraint comparison (bug#46540)Andrea Corallo2021-02-171-4/+4
| | | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-cstr->, comp-cstr->=) (comp-cstr-<, comp-cstr-<=): Fix inverted logic. * test/src/comp-tests.el (comp-tests-type-spec-tests): Add three integer constrain tests.
* Do not add unnecesary arg constraints (bug#45812 bug#45705 bug#45751).Andrea Corallo2021-01-191-0/+3
| | | | | | | | | These have the effect of bloating the IR for no effect killing compile time. The typical cases for that are extremely long backuoted lists. * lisp/emacs-lisp/comp-cstr.el (comp-cstr-t): New var. * lisp/emacs-lisp/comp.el (comp-add-call-cstr): No need to add arg call constraints if this is t.
* Fix type inference for bug#45635Andrea Corallo2021-01-041-0/+16
| | | | | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-cstr-union-1-no-mem): Fix missing mixed pos neg handling. * test/lisp/emacs-lisp/comp-cstr-tests.el (comp-cstr-typespec-tests-alist): Add a test. * test/src/comp-tests.el (45635): New testcase. * test/src/comp-test-funcs.el (comp-test-45635-f): New function.
* Fix `functionp' contraining (bug#45576)Andrea Corallo2021-01-021-5/+1
| | | | | | | | | * lisp/emacs-lisp/comp.el (comp-known-predicates) (comp-known-predicates-h): New constants. (comp-known-predicate-p, comp-pred-to-cstr): New functions. * lisp/emacs-lisp/cl-macs.el (cl-deftype-satisfies): Don't define. * test/src/comp-tests.el (comp-test-45576): New testcase. * test/src/comp-test-funcs.el (comp-test-45576-f): New function.
* * Fix two predicates for missing negation handlingAndrea Corallo2021-01-011-5/+7
| | | | | * lisp/emacs-lisp/comp-cstr.el (comp-cstr-empty-p) (comp-cstr-null-p): Fix missing negation handling.
* * lisp/emacs-lisp/comp-cstr.el (comp-cstr): Better `comp-value-to-cstr'.Andrea Corallo2020-12-291-4/+7
|
* Constrain mvars under compare and branch with built-in predicatesAndrea Corallo2020-12-291-0/+11
| | | | | | | | | | * lisp/emacs-lisp/comp.el (comp-emit-assume): Update. (comp-known-predicate-p): New function. (comp-add-cond-cstrs): Extend to pattern match predicate calls. * lisp/emacs-lisp/comp-cstr.el (comp-cstr-null-p) (comp-pred-to-cstr): New function. * test/src/comp-tests.el (comp-tests-type-spec-tests): Add a number of tests and fix comments.
* * lisp/emacs-lisp/comp-cstr.el (comp-cstr): Better `comp-type-to-cstr'.Andrea Corallo2020-12-291-1/+10
|
* Add 1+ 1- integer range propagation supportAndrea Corallo2020-12-271-0/+4
| | | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-cstr-one): New special var. * lisp/emacs-lisp/comp.el (comp-fwprop-call): Propagate integer ranges on +1 -1. * test/src/comp-tests.el (comp-tests-type-spec-tests): Add two tests.
* Add sum/subtraction integer range propagation supportAndrea Corallo2020-12-271-0/+63
| | | | | | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-range-+, comp-range--): New functions. (comp-cstr-set-range-for-arithm): New macro. (comp-cstr-add-2, comp-cstr-sub-2, comp-cstr-add, comp-cstr-sub): New function. * lisp/emacs-lisp/comp.el (comp-fwprop-call): Wire-up + - integer range propagation.
* * lisp/emacs-lisp/comp-cstr.el (comp-cstr-set-cmp-range): Improve.Andrea Corallo2020-12-271-1/+4
|
* * Add comp-cstr-greatest-in-range comp-cstr-smallest-in-rangeAndrea Corallo2020-12-271-4/+12
| | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-cstr-smallest-in-range) (comp-cstr-greatest-in-range): New function. (comp-cstr->, comp-cstr->=, comp-cstr-<, comp-cstr-<=): Make use of.
* Fix missing float handling into `comp-cstr-set-cmp-range'Andrea Corallo2020-12-261-1/+1
| | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-cstr-set-cmp-range): Add float handling. * test/src/comp-tests.el (comp-tests-type-spec-tests): Update results.
* Enable integer range narrowing under compare and branchAndrea Corallo2020-12-261-0/+68
| | | | | | | | | | | | | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-cstr-set-cmp-range) (comp-cstr->, comp-cstr->=, comp-cstr-<, comp-cstr-<=): New functions. * lisp/emacs-lisp/comp.el (comp-equality-fun-p) (comp-range-cmp-fun-p): New functions. (comp-collect-rhs): Use `comp-assign-op-p' in place of `comp-set-op-p'. (comp-negate-range-cmp-fun, comp-reverse-cmp-fun): New functions. (comp-emit-assume): Rework to be able to emit also comparision assumption. (comp-add-cond-cstrs-simple): Update for new `comp-emit-assume'. (comp-add-cond-cstrs-simple): Update to emit range assumption. (comp-fwprop-insn): Execute range assumptions. * test/src/comp-tests.el (comp-tests-type-spec-tests): Add tests.
* * Memoize `comp-subtype-p'Andrea Corallo2020-12-241-1/+8
| | | | | * lisp/emacs-lisp/comp-cstr.el (comp-subtype-p): Memoize. (comp-cstr-ctxt): Add `subtype-p-mem' slot.
* Symplify (not t) => nil and (not nil) => tAndrea Corallo2020-12-241-4/+21
| | | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-cstr-negation): Symplify (not t) => nil and (not nil) => t. * test/lisp/emacs-lisp/comp-cstr-tests.el (comp-cstr-typespec-tests-alist): Add two tests.
* Negate only values while constraining variables (bug#45376)Andrea Corallo2020-12-231-0/+14
| | | | | | | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-cstr-value-negation): New function. * lisp/emacs-lisp/comp.el (comp-fwprop-insn): Use `comp-cstr-value-negation'. * test/src/comp-test-funcs.el (comp-test-45376-1-f): Rename. (comp-test-45376-2-f): New funcion. * test/src/comp-tests.el (bug-45376-1): Rename test. (bug-45376-2): Add test.
* * Fix non range cstr union operationAndrea Corallo2020-12-231-8/+10
| | | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-cstr-union-homogeneous): Add range parameter and handle the non range case. (comp-cstr-union-1-no-mem, comp-cstr-intersection-no-mem): Update `comp-cstr-union-homogeneous' call sites.
* Make input constraints into memoization hash immutable (bug#45376)Andrea Corallo2020-12-231-2/+2
| | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-cstr-union-1) (comp-cstr-intersection): Copy input before soting it into the memoization hash table.
* * lisp/emacs-lisp/comp-cstr.el (comp-cstr-copy): Tweak for perf.Andrea Corallo2020-12-231-3/+3
|
* Simplify correctly (or (integer 1 1) (not (integer 1 1))) as tAndrea Corallo2020-12-211-6/+11
| | | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-cstr-union-1-no-mem): Logic update. * test/lisp/emacs-lisp/comp-cstr-tests.el (comp-cstr-typespec-tests-alist): Add a test.
* * Allow for overlapping src and dst in cstr set operationsAndrea Corallo2020-12-211-185/+185
| | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-cstr-union-1-no-mem) (comp-cstr-union-1, comp-cstr-intersection-no-mem) (comp-cstr-intersection): Logic update.
* Symplify type specifier (not t) as nilAndrea Corallo2020-12-211-0/+9
| | | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-cstr-intersection-no-mem): Add logic. * test/lisp/emacs-lisp/comp-cstr-tests.el (comp-cstr-typespec-tests-alist): Add two tests.
* * Improve constraint simplification logic in comp-cstr.elAndrea Corallo2020-12-211-113/+131
| | | | | | | | | | | | | | | | | | * lisp/emacs-lisp/comp-cstr.el (with-comp-cstr-accessors): Simplify. (comp-cstr-empty-p): New Funchion. (comp-split-pos-neg): Minor. (comp-normalize-typeset): Logic update. (comp-union-typesets): Minor. (comp-intersect-two-typesets): New functio. (comp-intersect-typesets): Logic update. (comp-range-union, comp-range-intersection): Minor. (comp-cstr-union-homogeneous, comp-cstr-union-1-no-mem) (comp-cstr-intersection-homogeneous) (comp-cstr-intersection-no-mem, comp-cstr-negation) (comp-type-spec-to-cstr, comp-cstr-to-type-spec): Logic update. * lisp/emacs-lisp/comp-cstr.el (with-comp-cstr-accessors): Simplify.
* * Memoize `comp-cstr-intersection'Andrea Corallo2020-12-131-24/+44
| | | | | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-cstr-ctxt): Add new slot `intersection-mem'. (comp-cstr-intersection-homogeneous): Fix non local exit target. (comp-cstr-intersection-no-mem): Rename from `comp-cstr-intersection'. (comp-cstr-intersection): New function.
* * Add initial negated non-negegated intersection supportAndrea Corallo2020-12-131-21/+93
| | | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-range-intersection): Cosmetic. (comp-cstr-intersection-homogeneous): Rename from `comp-cstr-intersection'. (comp-cstr-intersection): New function.
* Normalize cstrs for cache hint effectiveness and test stabilityAndrea Corallo2020-12-121-15/+42
| | | | | | | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-normalize-valset) (comp-union-valsets, comp-intersection-valsets) (comp-normalize-typeset): New functions. (comp-union-typesets, comp-intersect-typesets) (comp-cstr-union-homogeneous-no-range, comp-cstr-union-1-no-mem): Update to return normalized results. * test/lisp/emacs-lisp/comp-cstr-tests.el (comp-cstr-typespec-tests-alist): Normalize expected type specifiers.
* * Add `comp-split-pos-neg' functionAndrea Corallo2020-12-121-86/+91
| | | | | * lisp/emacs-lisp/comp-cstr.el (comp-split-pos-neg): New function. (comp-cstr-union-1-no-mem): Update to call `comp-split-pos-neg'.
* * Code rework add `comp-cstrs-homogeneous'Andrea Corallo2020-12-121-12/+19
| | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-cstrs-homogeneous): New function. (comp-cstr-union-1-no-mem): Make use of.
* * Unify common fallback exit point in `comp-cstr-union-1-no-mem'.Andrea Corallo2020-12-061-112/+106
| | | | | * lisp/emacs-lisp/comp-cstr.el (comp-cstr-union-1-no-mem): Define a local function `give-up' as a common fall-back exit point.
* Couple of `comp-cstr-union-1-no-mem' improvements for mixed neg pos unionAndrea Corallo2020-12-061-9/+23
| | | | | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-cstr-union-1-no-mem): Generalize disjoint pos types vs neg values conditions. (comp-cstr-union-1-no-mem): Do not propagate ranges when we are already returning integer as generic type. * test/lisp/emacs-lisp/comp-cstr-tests.el (comp-cstr-typespec-tests-alist): Add corresponding tests.
* * Memoize `comp-cstr-union-1'Andrea Corallo2020-12-051-7/+42
| | | | | | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-cstr): Do not synthesize the copier. (comp-cstr-ctxt): Add `union-1-mem-no-range' `union-1-mem-range' slots. (comp-cstr-copy): New function. (comp-cstr-union-1-no-mem): Rename from `comp-cstr-union-1'. (comp-cstr-union-1): New function.
* More improvements to `comp-cstr-union-1' for mixed positive/negative casesAndrea Corallo2020-12-051-34/+54
| | | | | | | * lisp/emacs-lisp/comp-cstr.el (comp-cstr-union-1): Better handle mixed positive/negated cases. * test/lisp/emacs-lisp/comp-cstr-tests.el (comp-cstr-typespec-tests-alist): Add a number of tests.