Skip to content

Refactor and correct the "is pure" and "can raise" (port upstream PR#10354 and PR#10387) #555

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Merged
merged 9 commits into from
Apr 15, 2022

Conversation

gretay-js
Copy link
Contributor

Copy link
Contributor

@xclerc xclerc left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am slightly worried about various catch-all patterns
in predicate definitions under backend/, since there
is a decent chance we will add new constructors.

@gretay-js gretay-js added 4.12.0-7 Bug fix patches for 4.12.0-7 release 4.12.0-8 and removed 4.12.0-7 Bug fix patches for 4.12.0-7 release labels Mar 3, 2022
@mshinwell
Copy link
Collaborator

@gretay-js Please could you resolve the conflicts, then this should be ready to merge.

xavierleroy and others added 8 commits April 15, 2022 08:45
These two predicates test properties of Mach operations.  For the
standard operations, the results are independent of the target
platform.  For the platform-specific operations, results vary.

The "is pure" predicate was implemented in a platform-specific file,
$ARCH/proc.ml. The treatment of standard operations was duplicated.

The "can raise" predicate was implemented in a platform-independent file,
mach.ml.  All specific operations were assumed not to raise, which is
incorrect for ARM and ARM64 and their "shiftcheckbound" specific operation.
(See #10339.)

This commit refactors the two predicates as follows:
- `Arch.operation_is_pure` and `Arch.operation_can_raise` predicates
  are added to each platform description file.  They deal with
  specific operations only.
- `Mach.operation_is_pure` was added and `Mach.operation_can_raise`
  was fixed to implement the test for standard operations and
  delegate to the Arch functions for specific operations.
The ARM and ARM64 architectures have `Ishiftcheckbound` specific instructions
that can raise an Invalid_argument exception.  This exception can, in turn,
be handled in the same function (see PR#10339 for an example).

However, these specific instructions were not taken into account
during insertion of spill code in asmcomp/spill.ml.  The consequence
is a variable that is reloaded from stack in the exception handler,
yet has not been spilled to stack before.

This commit fixes the issue by using the recently-fixed
`Mach.operation_can_raise` predicate to handle operations during spill
code insertion, instead of an ad-hoc pattern-matching.

Fixes: PR#10339
… analysis (#10387)

This is a follow-up to 15e6354 and #10354.

Use the `Mach.operation_can_raise` predicate instead of an ad-hoc
pattern matching to spot operations where the variables live at entry
to the enclosing exception handler must also be live.

The ad-hoc pattern matching was missing the `Ishiftcheckbound`
specific operations of ARM and ARM64.
@gretay-js gretay-js merged commit 2225ebf into oxcaml:main Apr 15, 2022
lpw25 added a commit that referenced this pull request May 19, 2022
fe8a98b flambda-backend: Save Mach as Cfg after Selection (#624)
2b205d8 flambda-backend: Clean up algorithms (#611)
524f0b4 flambda-backend: Initial refactoring of To_cmm (#619)
0bf75de flambda-backend: Refactor and correct the "is pure" and "can raise" (port upstream PR#10354 and PR#10387) (#555)
d234bfd flambda-backend: Cpp mangling is now a configuration option (#614)
20fc614 flambda-backend: Check that stack frames are not too large (#10085) (#561)
5fc2e95 flambda-backend: Allow CSE of immutable loads across stores (port upstream PR#9562) (#562)
2a650de flambda-backend: Backport commit fc95347 from trunk (#584)
31651b8 flambda-backend: Improved ARM64 code generation (port upstream PR#9937) (#556)
f0b6d68 flambda-backend: Simplify processing and remove dead code (error paths) in asmlink (port upstream PR#9943) (#557)
90c6746 flambda-backend: Improve code-generation for inlined comparisons (port upstream PR#10228) (#563)

git-subtree-dir: ocaml
git-subtree-split: fe8a98b
mshinwell pushed a commit that referenced this pull request May 20, 2022
…10354 and PR#10387) (#555)

* Refactor Proc.op_is_pure and fix Mach.operation_can_raise

These two predicates test properties of Mach operations.  For the
standard operations, the results are independent of the target
platform.  For the platform-specific operations, results vary.

The "is pure" predicate was implemented in a platform-specific file,
$ARCH/proc.ml. The treatment of standard operations was duplicated.

The "can raise" predicate was implemented in a platform-independent file,
mach.ml.  All specific operations were assumed not to raise, which is
incorrect for ARM and ARM64 and their "shiftcheckbound" specific operation.
(See #10339.)

This commit refactors the two predicates as follows:
- `Arch.operation_is_pure` and `Arch.operation_can_raise` predicates
  are added to each platform description file.  They deal with
  specific operations only.
- `Mach.operation_is_pure` was added and `Mach.operation_can_raise`
  was fixed to implement the test for standard operations and
  delegate to the Arch functions for specific operations.

* Fix handling of exception-raising specific operations during spilling

The ARM and ARM64 architectures have `Ishiftcheckbound` specific instructions
that can raise an Invalid_argument exception.  This exception can, in turn,
be handled in the same function (see PR#10339 for an example).

However, these specific instructions were not taken into account
during insertion of spill code in asmcomp/spill.ml.  The consequence
is a variable that is reloaded from stack in the exception handler,
yet has not been spilled to stack before.

This commit fixes the issue by using the recently-fixed
`Mach.operation_can_raise` predicate to handle operations during spill
code insertion, instead of an ad-hoc pattern-matching.

Fixes: PR#10339

* Fix handling of exception-raising specific operations during liveness analysis (#10387)

This is a follow-up to 15e6354 and #10354.

Use the `Mach.operation_can_raise` predicate instead of an ad-hoc
pattern matching to spot operations where the variables live at entry
to the enclosing exception handler must also be live.

The ad-hoc pattern matching was missing the `Ishiftcheckbound`
specific operations of ARM and ARM64.

* Handle flambda-backend operations

* Update cfg

* Iprobe_is_enabled is pure

* Exhaustive match

* Fix after rebase

* Fix arm64 after rebase and cleanup

Co-authored-by: Xavier Leroy <xavier.leroy@college-de-france.fr>
Co-authored-by: Xavier Leroy <xavierleroy@users.noreply.github.com>
lpw25 added a commit to lpw25/flambda-backend that referenced this pull request May 20, 2022
fe8a98b flambda-backend: Save Mach as Cfg after Selection (oxcaml#624)
2b205d8 flambda-backend: Clean up algorithms (oxcaml#611)
524f0b4 flambda-backend: Initial refactoring of To_cmm (oxcaml#619)
0bf75de flambda-backend: Refactor and correct the "is pure" and "can raise" (port upstream PR#10354 and PR#10387) (oxcaml#555)
d234bfd flambda-backend: Cpp mangling is now a configuration option (oxcaml#614)
20fc614 flambda-backend: Check that stack frames are not too large (#10085) (oxcaml#561)
5fc2e95 flambda-backend: Allow CSE of immutable loads across stores (port upstream PR#9562) (oxcaml#562)
2a650de flambda-backend: Backport commit fc95347 from trunk (oxcaml#584)
31651b8 flambda-backend: Improved ARM64 code generation (port upstream PR#9937) (oxcaml#556)
f0b6d68 flambda-backend: Simplify processing and remove dead code (error paths) in asmlink (port upstream PR#9943) (oxcaml#557)
90c6746 flambda-backend: Improve code-generation for inlined comparisons (port upstream PR#10228) (oxcaml#563)

git-subtree-dir: ocaml
git-subtree-split: fe8a98b
mshinwell added a commit that referenced this pull request May 24, 2022
454150b flambda-backend: Speed up testsuite (#658)
8362f9e flambda-backend: Speed up builds (#585)
a527cab flambda-backend: Update backends for changes from ocaml-jst
ce88833 Merge flambda-backend changes
b7506bb Revert "Cherry-pick of ocaml/ocaml 1eeb0e7fe595f5f9e1ea1edbdf785ff3b49feeeb (#12)"
183f688 Add config option to enable/disable stack allocation (#22)
ee7c849 If both the type and mode of an ident are wrong, complain about the type. (#19)
44bade0 Allow submoding during module inclusion checks (#21)
de3bec9 Add subtyping between arrows of related modes (#20)
fe8a98b flambda-backend: Save Mach as Cfg after Selection (#624)
2b205d8 flambda-backend: Clean up algorithms (#611)
93d8615 Enable the local keywords even when the local extension is off (#18)
524f0b4 flambda-backend: Initial refactoring of To_cmm (#619)
81dd85e Documentation for local allocations
b05519f Fix a GC bug in local stack scanning (#17)
9f879de Fix __FUNCTION__ (#15)
0bf75de flambda-backend: Refactor and correct the "is pure" and "can raise" (port upstream PR#10354 and PR#10387) (#555)
d234bfd flambda-backend: Cpp mangling is now a configuration option (#614)
20fc614 flambda-backend: Check that stack frames are not too large (#10085) (#561)
5fc2e95 flambda-backend: Allow CSE of immutable loads across stores (port upstream PR#9562) (#562)
2a650de flambda-backend: Backport commit fc95347 from trunk (#584)
a78975e Optimise "include struct ... end" in more cases (ocaml/ocaml#11134)
b819c66 Cherry-pick of ocaml/ocaml 1eeb0e7fe595f5f9e1ea1edbdf785ff3b49feeeb (#12)
bb363d4 Optimise the allocation of optional arguments (#11)
31651b8 flambda-backend: Improved ARM64 code generation (port upstream PR#9937) (#556)
f0b6d68 flambda-backend: Simplify processing and remove dead code (error paths) in asmlink (port upstream PR#9943) (#557)
90c6746 flambda-backend: Improve code-generation for inlined comparisons (port upstream PR#10228) (#563)

git-subtree-dir: ocaml
git-subtree-split: 454150b
# for free to join this conversation on GitHub. Already have an account? # to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants