Skip to content
New issue

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

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

Already on GitHub? Sign in to your account

Carry MemFlags on loads/stores in MachInst backends, and emit trap info only where needed. #2426

Merged
merged 1 commit into from
Nov 18, 2020

Conversation

cfallin
Copy link
Member

@cfallin cfallin commented Nov 17, 2020

x64 and aarch64: carry MemFlags on loads/stores; don't emit trap info unless an op can trap.

This end result was previously enacted by carrying a SourceLoc on
every load/store, which was somewhat cumbersome, and only indirectly
encoded metadata about a memory reference (can it trap) by its presence
or absence. We have a type for this -- MemFlags -- that tells us
everything we might want to know about a load or store, and we should
plumb it through to code emission instead.

This PR attaches a MemFlags to an Amode on x64, and puts it on load
and store Inst variants on aarch64. These two choices seem to factor
things out in the nicest way: there are relatively few load/store insts
on aarch64 but many addressing modes, while the opposite is true on x64.

Includes #2389 as prerequisite; will rebase out that commit once #2389 lands.

@github-actions github-actions bot added cranelift Issues related to the Cranelift code generator cranelift:area:aarch64 Issues related to AArch64 backend. cranelift:area:x64 Issues related to x64 codegen labels Nov 17, 2020
… unless an op can trap.

This end result was previously enacted by carrying a `SourceLoc` on
every load/store, which was somewhat cumbersome, and only indirectly
encoded metadata about a memory reference (can it trap) by its presence
or absence. We have a type for this -- `MemFlags` -- that tells us
everything we might want to know about a load or store, and we should
plumb it through to code emission instead.

This PR attaches a `MemFlags` to an `Amode` on x64, and puts it on load
and store `Inst` variants on aarch64. These two choices seem to factor
things out in the nicest way: there are relatively few load/store insts
on aarch64 but many addressing modes, while the opposite is true on x64.
@cfallin cfallin merged commit bf971ef into bytecodealliance:main Nov 18, 2020
@cfallin cfallin deleted the machinst-trap-info branch January 6, 2021 18:03
jameysharp added a commit to jameysharp/wasmtime that referenced this pull request Mar 13, 2024
In bytecodealliance#2426, @cfallin wrote:

> […] don't emit trap info unless an op can trap.
>
> This end result was previously enacted by carrying a SourceLoc on
> every load/store, which was somewhat cumbersome, and only indirectly
> encoded metadata about a memory reference (can it trap) by its
> presence or absence.

That PR changed both backends that existed at the time to check both the
source location and the memory flags to determine whether a memory
access could trap.

Then in bytecodealliance#2685, @cfallin wrote:

> Finally, while working out why trap records were not appearing, I had
> noticed that isa::x64::emit_std_enc_mem() was only emitting heap-OOB
> trap metadata for loads/stores when it had a srcloc. This PR ensures
> that the metadata is emitted even when the srcloc is empty.

However that PR did not apply the same change to other backends. Since
then, the pattern from bytecodealliance#2426 has been copied to new backends.

I believe checking the source location has been unnecessary since bytecodealliance#2426
and is now just a source of confusion at best, and possibly bugs at
worst. So this PR makes all targets match the behavior of the x64
backend.

In addition, this pattern was the only reason why source locations were
provided to any backend's emit state, so I'm removing that entirely.
The `cur_srcloc` field has been unused on x64 since bytecodealliance#2685.

This change is mostly straightforward, but there are two questionable
changes in the riscv64 backend:

- The riscv64 backend had one use of this pattern for a
  BadConversionToInteger trap. All other uses on all backends were for
  HeapOutOfBounds traps. I suspect that was a copy-paste bug so I've
  removed it just like all the others.

- The riscv64 `Inst::Atomic` does not have a MemFlags field, so this
  means the HeapOutOfBounds trap metadata is added unconditionally for
  such instructions.
github-merge-queue bot pushed a commit that referenced this pull request Mar 13, 2024
* cranelift: Remove srcloc from emit state on all targets

In #2426, @cfallin wrote:

> […] don't emit trap info unless an op can trap.
>
> This end result was previously enacted by carrying a SourceLoc on
> every load/store, which was somewhat cumbersome, and only indirectly
> encoded metadata about a memory reference (can it trap) by its
> presence or absence.

That PR changed both backends that existed at the time to check both the
source location and the memory flags to determine whether a memory
access could trap.

Then in #2685, @cfallin wrote:

> Finally, while working out why trap records were not appearing, I had
> noticed that isa::x64::emit_std_enc_mem() was only emitting heap-OOB
> trap metadata for loads/stores when it had a srcloc. This PR ensures
> that the metadata is emitted even when the srcloc is empty.

However that PR did not apply the same change to other backends. Since
then, the pattern from #2426 has been copied to new backends.

I believe checking the source location has been unnecessary since #2426
and is now just a source of confusion at best, and possibly bugs at
worst. So this PR makes all targets match the behavior of the x64
backend.

In addition, this pattern was the only reason why source locations were
provided to any backend's emit state, so I'm removing that entirely.
The `cur_srcloc` field has been unused on x64 since #2685.

This change is mostly straightforward, but there are two questionable
changes in the riscv64 backend:

- The riscv64 backend had one use of this pattern for a
  BadConversionToInteger trap. All other uses on all backends were for
  HeapOutOfBounds traps. I suspect that was a copy-paste bug so I've
  removed it just like all the others.

- The riscv64 `Inst::Atomic` does not have a MemFlags field, so this
  means the HeapOutOfBounds trap metadata is added unconditionally for
  such instructions.

* Filetests don't have srclocs so they get traps now
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
cranelift:area:aarch64 Issues related to AArch64 backend. cranelift:area:x64 Issues related to x64 codegen cranelift Issues related to the Cranelift code generator
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants