159 Commits

Author SHA1 Message Date
Nick Lewycky
ad752d66a7 When modifying the value, also update its ExtraInfo.
Fixes a debug_assert! on python3.7 and rustpython in wapm.
2019-12-02 15:45:12 -08:00
Nick Lewycky
31a77b0eb7 Fix llvm backend to work with latest inkwell.
cargo update to pick up latest inkwell branch commit.

Add lifetime annotations to Module which now takes a lifetime, and more lifetime annotations across intrinsics.rs.

Add <'ctx> to missing places in CtxType and Intrinsics. Remove it from reference bindings.

Use ManuallyDrop to ensure that context's members are dropped before the Context.

Co-authored-by: Mark McCaskey <mark@wasmer.io>
2019-11-26 19:59:03 -08:00
Nick Lewycky
5a49fe76df Turn a few more assert!s that should never fire into debug_assert!s.
These are here to protect against errors when refactoring more than anything else.
2019-11-26 16:43:17 -08:00
Nick Lewycky
ff73c5d71b Address review feedback from Mark.
Fix a bug in Operator::Select and add a comment to explain the intention.

Use derived default for ExtraInfo.

Make ExtraInfo associated functions const.

Turn two asserts into debug_asserts.
2019-11-26 12:25:03 -08:00
Nick Lewycky
fa576093c2 Fix ExtraInfo on F32Add and similar.
We want to ignore the incoming pending NaN state (since the pending will propagate to the output if there was one on the input), and we want to add a new pending NaN state if we can (that is to say, if it isn't cancelled out by both inputs having arithmetic state). Do this by discarding the pending states on the inputs, intersecting them (to keep only the arithmetic state), then union in a pending nan state (which might do nothing, if it's arithmetic).

If the above sounds confusing, keep in mind that when a value is arithmetic, the act of performing the "NaN canonicalization" is a no-op. Thus, being arithmetic cancels out pending NaN states.
2019-11-26 12:20:44 -08:00
Nick Lewycky
a06c858087 Make ExtraInfo bitand check for pending validity.
Unfortunately, this is quite buggy. For something as simple as F32Sub, to combine two ExtraInfos, we want to add a new pending_f32_nan(), unless both of the inputs are arithmetic_f32(). In this commit, we incorrectly calculate that we don't need a pending_f32_nan if either one of the inputs was arithmetic_f32().
2019-11-26 12:20:43 -08:00
Nick Lewycky
284948b6d4 Refactor so as to convert ExtraInfo when potentially canonicalizing.
It seemed like a good idea at the time, but in practice we discard the extra info all or almost all of the time.

This also introduces a new bug. In an operation like multiply, it's valid to multiply two values, one with a pending NaN and one without. As written, in the SIMD case (because of the two kinds of pending in play), we assert.
2019-11-26 12:20:43 -08:00
Nick Lewycky
26c8fd52c8 Initial implementation of "known to be arithmetic NaN / not NaN". 2019-11-26 12:20:43 -08:00
Nick Lewycky
fafc7ad38c Add "known to not contain non-arithmetic NaNs" to ExtraInfo in LLVM backend.
Not wired up yet.
2019-11-26 12:20:43 -08:00
bors[bot]
5c1c786e35
Merge #1002
1002: Update the LLVM pass list. r=nlewycky a=nlewycky

# Description
Adds optimizations of loops, and inlinling and some simple interprocedural optimization.

Measured on the libsodium benchmarks, the new pass pipeline is a 2.35% geomean improvement. No major performance regressions known.

Co-authored-by: Nick Lewycky <nick@wasmer.io>
2019-11-23 05:11:44 +00:00
Nick Lewycky
681219b06c Fix bug in LLVM lowering of 'return' when the stack has a float on it. 2019-11-22 17:03:31 -08:00
Nick Lewycky
2433d365af Add new test feature, enabled in test crates.
When test feature is enabled, turn on LLVM verifier. This was previously never enabled.
2019-11-22 16:51:44 -08:00
Nick Lewycky
9fe5e261ea Update the LLVM pass list.
Adds optimizations of loops, and inlinling and some simple interprocedural optimization.
2019-11-21 22:41:23 -08:00
anb
3b2d751c55 Enable compilation for specific target
By exposing the target information through `CompilerConfig`,
compiler(only LLVM at the moment) could create a machine with
different CPU feature flags other than current host, which makes it
capable to "cross compile" to some degree.

Update #959
2019-11-15 18:51:59 -08:00
Nick Lewycky
ebe8da7bd3 When accessing memory, use byte aligned accesses.
LLVM's instcombine will attempt to bump the alignment when it can prove that it's safe to do so.

Fixes #969.
2019-11-15 14:47:53 -08:00
Nick Lewycky
ed6ce4b9b4 Don't create functions for imports, we still call those indirectly. 2019-11-08 14:44:59 -08:00
Nick Lewycky
2957b6abd8 Emit direct calls for local functions, but not for imports. 2019-11-08 14:44:50 -08:00
Nick Lewycky
674a70fa05 Create function declarations before starting the body of the first function. 2019-11-08 13:13:58 -08:00
Nick Lewycky
c0c7661c65 Merge branch 'master' of github.com:wasmerio/wasmer into feature/llvm-tbaa 2019-11-01 17:53:52 -07:00
bors[bot]
d8888c9459
Merge #911
911: Don't emit bounds checks when the offset is known at compile time to be less than the minimum memory size. r=nlewycky a=nlewycky



Co-authored-by: Nick Lewycky <nick@wasmer.io>
2019-11-01 19:53:17 +00:00
Nick Lewycky
20270411d9 When the const memory access is not larger than the minimum, use a runtime check.
The memory may have grown.
2019-11-01 12:49:54 -07:00
Nick Lewycky
ef4b3c3428 Improve some TBAA label names, particular for memory.
Memory can't change between static and dynamic, so use that in the TBAA label
name.

Distinguish between local and imported memory, table and globals.
2019-10-31 12:40:32 -07:00
nlewycky
0e665c4001
Merge branch 'master' into feature/llvm-tbaa 2019-10-31 11:55:31 -07:00
Nick Lewycky
d10d54a416 Add TBAA to atomic ops. 2019-10-30 16:39:39 -07:00
Nick Lewycky
15ce8bfda7 Label the loads in intrinsics.rs, most of which are the initial accesses off the context.
Move tbaa_label to intrinsics.rs. Move TBAA pass to first in the list, it doesn't get invalidated. Add TBAA labels for internal fields.
2019-10-30 16:18:36 -07:00
Nick Lewycky
74eaec968e Remove all *_tbaa fields from LLVMModuleCodeGenerator and LLVMFunctionCodeGenerator. 2019-10-30 14:05:11 -07:00
Nick Lewycky
e7d1742c63 Update module to be held by Rc<RefCell<>> so that we can pass it to LLVMFunctionCodeGenerator.
Use that to generate distinct TBAA labels for distinct local variables.
2019-10-30 13:11:29 -07:00
Nick Lewycky
f77d9bfe32 Initial implementation of TBAA for the LLVM backend. 2019-10-30 10:29:51 -07:00
Ivan Enderlin
edb6cbefca fix(runtime-core) Share the definition of Trampoline across all the backends.
This patch updates all the backends to use the definition of
`Trampoline` as defined in the `wasmer_runtime_core::typed_func`
module. That way, there is no copy of that type, and as such, it is
easier to avoid regression (a simple `cargo check` does the job).

This patch also formats the `use` statements in the updated files.
2019-10-30 13:10:34 +01:00
Nick Lewycky
7fd20e3355 NFC: Fold variable into initializer. 2019-10-29 22:23:46 -07:00
Nick Lewycky
9224db6d1e Don't emit bounds checks when the offset is less than the minimum memory size. 2019-10-28 15:57:16 -07:00
Syrus Akbary
1a91f0e9ca
Merge branch 'master' into feature/llvm-nan-but-fast 2019-10-25 12:52:47 -07:00
bors[bot]
03a5b1fbf4
Merge #901
901: Set target triple and datalayout when creating the LLVM module. r=nlewycky a=nlewycky

We were giving LLVM a triple and datalayout only when producing native code from the LLVM IR. With this change, we tell LLVM as early as possible so that the entire optimization stack knows that it's safe to use target-specific constructs (including target intrinsics `@llvm.x86.sse2.ucomieq.sd`) as well as cost models (for autovectorization) and knowing the bitwidth of the registers so that we can know it's profitable to eliminate redundant extend/truncate casts.

Co-authored-by: Nick Lewycky <nick@wasmer.io>
2019-10-25 17:57:11 +00:00
bors[bot]
83c63d0b27
Merge #904
904: Use getelementptr instruction instead of int_to_ptr and ptr_to_int. r=nlewycky a=nlewycky

The main part of this change is that we no longer turn pointers into integers to do arithmetic on them, then turn them back into pointers. Doing so is a signal to LLVM that it should not attempt to analyze the provenance of the pointers, disabling some optimizations. Using getelementptr allows us to perform arithmetic on pointers while keeping them in pointer types, which LLVM can then analyze.

Most of the textual change is a refactoring to reorder the operations. Previously the bounds checking and determining of the base and bounds were combined because you could put both into the same match, since both actions are performed differently depending on whether the memory is static or dynamic. In this case, we simply check the type twice and do two different things, with comments labelling the steps.

Co-authored-by: Nick Lewycky <nick@wasmer.io>
2019-10-25 17:22:25 +00:00
Nick Lewycky
9c71561927 Rewrite resolve_memory_ptr to use GEPs as much as possible.
ptr_to_int and int_to_ptr are not treated the same as type-safe pointer operations. LLVM intentionally performs fewer optimizations to code using the former as compared with the latter. We don't need that in our code, standard pointer optimizations are safe for us.
2019-10-24 18:15:32 -07:00
Nick Lewycky
894c5084f3 Insert allocas as a contiguous block at the top of the entry block.
This minimizes the chance we accidentally get categorized as having a dynamic alloca.
2019-10-23 19:21:12 -07:00
Nick Lewycky
bc64b4ce6c Set target triple and datalayout when creating the LLVM module. 2019-10-23 16:04:29 -07:00
Nick Lewycky
92f0b1b2e3 Thread whether state tracking is enabled into the LLVM backend. 2019-10-22 23:15:05 -07:00
Nick Lewycky
3d3aef6df3 Merge branch 'master' of github.com:wasmerio/wasmer into feature/llvm-nan-but-fast 2019-10-21 12:33:35 -07:00
Nick Lewycky
10dddf9904 Fix repeated typo in comment. 2019-10-18 16:34:45 -07:00
Nick Lewycky
2c5c1b1c2c For floating point operations, allow inputs to be arbitrary, including SNaNs.
Instead of ensuring outputs are arithmetic NaNs on every function, we tag them as pending such a check, so that a sequence of computation can have a single canonicalization step at the end.

There's an extra wriggle for SIMD. The Wasm type system only indicates them as V128, so it's possible that we might do computations as F32x4Add, I8x16Add, F64x2Add in a row with no other computations in between. Thus, most SIMD functions apply pending canonicalizations to their inputs, even integer SIMD operations.
2019-10-17 11:55:01 -07:00
bors[bot]
2695093a03
Merge #863
863: Rewrite Min/Max to handle all cases correctly. Fixes 545 spectest failures. r=nlewycky a=nlewycky

# Description
The llvm backend was not quite following the Wasm spec for {F32,F64,F32x4xF64x2}{Min,Max}. We used the `@llvm.minnum` and `@llvm.maxnum` intrinsics which don't handle the corner cases the same. When we tried to use `@llvm.minimum` and `@llvm.maximum` which do, we get an internal error from the x86 backend. I was hoping that crash would go away with the upgrade to LLVM 9, but it does not.

Reimplement these operations using plain LLVM instructions.

# Review

- [x] Add a short description of the the change to the CHANGELOG.md file


Co-authored-by: Nick Lewycky <nick@wasmer.io>
2019-10-09 22:24:07 +00:00
bors[bot]
88f126a00b
Merge #870
870: Fix unused value warning due to inkwell API change. NFC. r=nlewycky a=nlewycky

# Description
Fix unused value warning due to inkwell API change. No functionality change.

Co-authored-by: Nick Lewycky <nick@wasmer.io>
2019-10-08 23:56:10 +00:00
Nick Lewycky
c61cbf6c0b Add a comment. 2019-10-08 11:25:10 -07:00
Nick Lewycky
afddbb2b2a Remove unused value warning due to inkwell API change. NFC. 2019-10-07 17:16:52 -07:00
Nick Lewycky
9cdfb48d0c The i1 argument is actually named "is_zero_undef" which we want to be false.
Fixes the test failures that showed up on mac.
2019-10-07 17:11:59 -07:00
Nick Lewycky
749691ca2a Add a comment explaining why we don't use the intrinsics for these. 2019-10-04 11:50:11 -07:00
Nick Lewycky
1a7f00f0af Rewrite Min/Max to handle all cases correctly.
Fixes 545 spectest failures.
2019-10-03 18:19:12 -07:00
Patrick Ventuzelo
4190f01195 remove panic and unimplemented in llvm-backend and runtime-core 2019-09-17 12:03:03 +02:00
Nick Lewycky
8dd82c05e6 Implement atomic load and store instructions with actual atomics in the LLVM backend.
Includes a run of `cargo update` to pick up the newer inkwell required.
2019-09-13 12:05:55 -07:00