3228 Commits

Author SHA1 Message Date
bors
a9c24fd579 Auto merge of #43488 - Florob:repeat-opt, r=arielb1
Optimize initialization of arrays using repeat expressions

This PR was inspired by [this thread](https://www.reddit.com/r/rust/comments/6o8ok9/understanding_rust_performances_a_newbie_question/) on Reddit.
It tries to bring array initialization in the same ballpark as `Vec::from_elem()` for unoptimized builds.
For optimized builds this should relieve LLVM of having to figure out the construct we generate is in fact a `memset()`.

To that end this emits `llvm.memset()` when:
* the array is of integer type and all elements are zero (`Vec::from_elem()` also explicitly optimizes for this case)
* the array elements are byte sized

If the array is zero-sized initialization is omitted entirely.
2017-08-06 08:09:59 +00:00
bors
2b82b7e50a Auto merge of #43554 - eddyb:apfloat, r=nikomatsakis
APFloat: Rewrite It In Rust and use it for deterministic floating-point CTFE.

As part of the CTFE initiative, we're forced to find a solution for floating-point operations.
By design, IEEE-754 does not explicitly define everything in a deterministic manner, and there is some variability between platforms, at the very least (e.g. NaN payloads).

If types are to evaluate constant expressions involving type (or in the future, const) generics, that evaluation needs to be *fully deterministic*, even across `rustc` host platforms.
That is, if `[T; T::X]` was used in a cross-compiled library, and the evaluation of `T::X` executed a floating-point operation, that operation has to be reproducible on *any other host*, only knowing `T` and the definition of the `X` associated const (as either AST or HIR).

Failure to uphold those rules allows an associated type (e.g. `<Foo as Iterator>::Item`) to be seen as two (or more) different types, depending on the current host, and such type safety violations typically allow writing of a `transmute` in safe code, given enough generics.

The options considered by @rust-lang/compiler were:
1. Ban floating-point operations in generic const-evaluation contexts
2. Emulate floating-point operations in an uniformly deterministic fashion

The former option may seem appealing at first, but floating-point operations *are allowed today*, so they can't be banned wholesale, a distinction has to be made between the code that already works, and future generic contexts. *Moreover*, every computation that succeeded *has to be cached*, otherwise the generic case can be reproduced without any generics. IMO there are too many ways it can go wrong, and a single violation can be enough for an unsoundness hole.
Not to mention we may end up really wanting floating-point operations *anyway*, in CTFE.

I went with the latter option, and seeing how LLVM *already* has a library for this exact purpose (as it needs to perform optimizations independently of host floating-point capabilities), i.e. `APFloat`, that was what I ended up basing this PR on.
But having been burned by the low reusability of bindings that link to LLVM, and because I would *rather* the floating-point operations to be wrong than not deterministic or not memory-safe (`APFloat` does far more pointer juggling than I'm comfortable with), I decided to RIIR.

This way, we have a guarantee of *no* `unsafe` code, a bit more control over the where native floating-point might accidentally be involved, and non-LLVM backends can share it.
I've also ported all the testcases over, *before* any functionality, to catch any mistakes.

Currently the PR replaces all CTFE operations to go through `apfloat::ieee::{Single,Double}`, keeping only the bits of the `f32` / `f64` memory representation in between operations.
Converting from a string also double-checks that `core::num` and `apfloat` agree on the interpretation of a floating-point number literal, in case either of them has any bugs left around.

r? @nikomatsakis
f? @nagisa @est31

<hr/>

Huge thanks to @edef1c for first demoing usable `APFloat` bindings and to @chandlerc for fielding my questions on IRC about `APFloat` peculiarities (also upstreaming some bugfixes).
2017-08-05 13:12:56 +00:00
bors
9b6c2382a7 Auto merge of #43615 - dhduvall:lto-unaligned-read, r=nagisa
Fix some unaligned reads on SPARC in LTO

This fixes #43593 by eliminating some undefined behavior.
2017-08-04 22:35:22 +00:00
bors
c523b3f954 Auto merge of #43403 - RalfJung:mir-validate, r=nikomatsakis
Add MIR Validate statement

This adds statements to MIR that express when types are to be validated (following [Types as Contracts](https://internals.rust-lang.org/t/types-as-contracts/5562)). Obviously nothing is stabilized, and in fact a `-Z` flag has to be passed for behavior to even change at all.

This is meant to make experimentation with Types as Contracts in miri possible. The design is definitely not final.

Cc @nikomatsakis @aturon
2017-08-04 07:48:07 +00:00
Florian Zeitz
67044501bc trans: Reuse immediate value in call to call_memset() 2017-08-04 02:27:30 +02:00
Danek Duvall
e412cb30dc Fix some unaligned reads on SPARC in LTO
This fixes #43593 by eliminating some undefined behavior.
2017-08-02 09:58:16 -07:00
Eduard-Mihai Burtescu
c457b26e33 rustc_trans: do not pass floating-point values to LLVM through FFI. 2017-08-02 17:28:11 +03:00
Eduard-Mihai Burtescu
9861df4760 rustc_const_math: use apfloat::ieee::{Single,Double} in ConstFloat. 2017-08-02 17:28:11 +03:00
Michael Woerister
b2c3a413b9 incr.comp.: Properly incorporate symbol linkage and visibility into CGU hash. 2017-08-02 11:56:23 +02:00
Corey Farwell
ab3fb956f3 Rollup merge of #43389 - alexcrichton:thread-error, r=michaelwoerister
Thread through the original error when opening archives

This updates the management of opening archives to thread through the original
piece of error information from LLVM over to the end consumer, trans.
2017-08-02 01:22:26 +00:00
Florian Zeitz
c3603f3ec6 trans: Check LLVM type instead of Layout 2017-08-02 00:32:14 +02:00
bors
e772c28d2e Auto merge of #43506 - michaelwoerister:async-llvm, r=alexcrichton
Run translation and LLVM in parallel when compiling with multiple CGUs

This is still a work in progress but the bulk of the implementation is done, so I thought it would be good to get it in front of more eyes.

This PR makes the compiler start running LLVM while translation is still in progress, effectively allowing for more parallelism towards the end of the compilation pipeline. It also allows the main thread to switch between either translation or running LLVM, which allows to reduce peak memory usage since not all LLVM module have to be kept in memory until linking. This is especially good for incr. comp. but it works just as well when running with `-Ccodegen-units=N`.

In order to help tuning and debugging the work scheduler, the PR adds the `-Ztrans-time-graph` flag which spits out html files that show how work packages where scheduled:
![Building regex](https://user-images.githubusercontent.com/1825894/28679272-f6752bd8-72f2-11e7-8a6c-56207855ce95.png)
(red is translation, green is llvm)

One side effect here is that `-Ztime-passes` might show something not quite correct because trans and LLVM are not strictly separated anymore. I plan to have some special handling there that will try to produce useful output.

One open question is how to determine whether the trans-thread should switch to intermediate LLVM processing.

TODO:
- [x] Restore `-Z time-passes` output for LLVM.
- [x] Update documentation, esp. for work package scheduling.
- [x] Tune the scheduling algorithm.

cc @alexcrichton @rust-lang/compiler
2017-08-01 17:21:24 +00:00
Michael Woerister
b8d441350b async-llvm(28): Make some error messages more informative. 2017-08-01 14:43:55 +02:00
Michael Woerister
b1e043e9e9 async-llvm(27): Move #[rustc_error] check to an earlier point in order to restore some test expections. 2017-07-31 18:51:39 +02:00
Ariel Ben-Yehuda
93db1f9923 trans::mir::constant - fix assignment error recovery
We used to not store anything when the RHS of an assignment returned an
error, which caused ICEs downstream.

Fixes #43197.
2017-07-31 18:09:02 +03:00
Michael Woerister
cacc31f8a3 async-llvm(26): Print error when failing to acquire Jobserver token. 2017-07-31 15:41:41 +02:00
Michael Woerister
a9a0ea921b async-llvm(25): Restore -Ztime-passes output for trans and LLVM. 2017-07-31 15:15:44 +02:00
Michael Woerister
bd36df84a5 async-llvm(24): Improve scheduling and documentation. 2017-07-31 15:15:44 +02:00
Michael Woerister
f5acc392e0 async-llvm(23): Let the main thread also do LLVM work in order to reduce memory pressure. 2017-07-31 15:15:44 +02:00
Michael Woerister
8819278523 async-llvm(22): mw invokes mad html skillz to produce graphical LLVM timing reports. 2017-07-31 15:15:44 +02:00
Michael Woerister
1480be3779 async-llvm(21): Re-use worker-ids in order to simulate persistent worker threads. 2017-07-31 15:15:09 +02:00
Michael Woerister
ab3bc584c0 async-llvm(20): Do some cleanup. 2017-07-31 15:15:09 +02:00
Michael Woerister
81b789fd87 async-llvm(19): Already start LLVM while still translating. 2017-07-31 15:15:09 +02:00
Michael Woerister
7e09d1e170 async-llvm(18): Instantiate OngoingCrateTranslation before starting translation. 2017-07-31 15:15:09 +02:00
Michael Woerister
e7d0fa340f async-llvm(17): Create MSVC __imp_ symbols immediately for each module. 2017-07-31 15:15:09 +02:00
Michael Woerister
0ad9eaa998 async-llvm(16): Inject allocator shim into LLVM module immediately if necessary. 2017-07-31 15:15:09 +02:00
Michael Woerister
943a5bdf35 async-llvm(15): Don't require number of codegen units upfront. 2017-07-31 15:15:09 +02:00
Michael Woerister
a1be65845c async-llvm(14): Move LTO/codegen-unit conflict check to beginning of compilation process. 2017-07-31 15:15:09 +02:00
Michael Woerister
b924ec1484 async-llvm(13): Submit LLVM work packages from base::trans_crate(). 2017-07-31 15:15:09 +02:00
Michael Woerister
397b2a800f async-llvm(12): Hide no_integrated_as logic in write::run_passes. 2017-07-31 15:15:09 +02:00
Michael Woerister
f3ce50558f async-llvm(11): Delay joining ongoing translation until right before linking. 2017-07-31 15:15:09 +02:00
Michael Woerister
28589ec3e4 async-llvm(10): Factor compile output files cleanup into separate functions. 2017-07-31 15:15:09 +02:00
Michael Woerister
ccb970be4c async-llvm(9): Move OngoingCrateTranslation into back::write. 2017-07-31 15:15:09 +02:00
Michael Woerister
645841ea44 async-llvm(8): Clean up resource management and drop LLVM modules ASAP. 2017-07-31 15:15:09 +02:00
Michael Woerister
4282dd87ea async-llvm(7): Clean up error handling a bit. 2017-07-31 15:15:09 +02:00
Michael Woerister
8f6894e177 async-llvm(6): Make the LLVM work coordinator get its work package through a channel instead of upfront. 2017-07-31 15:15:09 +02:00
Michael Woerister
b18a61a15b async-llvm(5): Do continuous error handling on main thread. 2017-07-31 15:15:09 +02:00
Michael Woerister
df6be33d84 async-llvm(4): Move work coordination to separate thread in order to free up the main thread for translation. 2017-07-31 15:15:09 +02:00
Michael Woerister
bac57cf654 async-llvm(3): Make write::CodegenContext Clone and Send. 2017-07-31 15:13:10 +02:00
Michael Woerister
29d4725b31 async-llvm(2): Decouple diagnostics emission from LLVM worker coordination. 2017-07-31 14:55:13 +02:00
Michael Woerister
c4adeceb37 async-llvm(1): Run LLVM already in trans_crate(). 2017-07-31 14:55:13 +02:00
Ralf Jung
5264103de4 add new instructions for asserting when values are valid, and to describe when we can rely on them being locked in memory 2017-07-30 01:11:59 -07:00
bors
6dd8744a11 Auto merge of #43492 - lu-zero:master, r=alexcrichton
More Altivec Intrinsics
2017-07-29 03:58:18 +00:00
bors
42a09c01f0 Auto merge of #43518 - cuviper:aapcs_vfp, r=eddyb
Support homogeneous aggregates for hard-float ARM

Hard-float ARM targets use the AAPCS-VFP ABI, which passes and returns
homogeneous float/vector aggregates in the VFP registers.

Fixes #43329.

r? @eddyb
2017-07-29 01:43:03 +00:00
bors
6f815ca771 Auto merge of #43221 - MaulingMonkey:natvis-improvements, r=michaelwoerister
Embed MSVC .natvis files into .pdbs and mangle debuginfo for &str, *T, and [T].

No idea if these changes are reasonable - please feel free to suggest changes/rewrites.  And these are some of my first real commits to any rust codebase - *don't* be gentle, and nitpick away, I need to learn! ;)

### Overview
Embedding `.natvis` files into `.pdb`s allows MSVC (and potentially other debuggers) to automatically pick up the visualizers without having to do any additional configuration (other than to perhaps add the relevant .pdb paths to symbol search paths.)

The native debug engine for MSVC parses the type names, making various C++ish assumptions about what they mean and adding various limitations to valid type names.  `&str` cannot be matched against a visualizer, but if we emit `str&` instead, it'll be recognized as a reference to a `str`, solving the problem.  `[T]` is similarly problematic, but emitting `slice<T>` instead works fine as it looks like a template.  I've been unable to get e.g. `slice<u32>&` to match visualizers in VS2015u3, so I've gone with `str*` and `slice<u32>*` instead.

### Possible Issues
* I'm not sure if `slice<T>` is a great mangling for `[T]` or if I should worry about name collisions.
* I'm not sure if `linker.rs` is the right place to be enumerating natvis files.
* I'm not sure if these type name mangling changes should actually be MSVC specific.  I recall seeing gdb visualizer tests that might be broken if made more general?  I'm hesitant to mess with them without a gdb install.  But perhaps I'm just wracking up technical debt.
  Should I try `pacman -S mingw-w64-x86_64-gdb` and to make things consistent?
* I haven't touched `const` / `mut` yet, and I'm worried MSVC might trip up on `mut` or their placement.
* I may like terse oneliners too much.
* I don't know if there's broader implications for messing with debug type names here.
* I may have been mistaken about bellow test failures being ignorable / unrelated to this changelist.

### Test Failures on `x86_64-pc-windows-gnu`

```
---- [debuginfo-gdb] debuginfo-gdb\associated-types.rs stdout ----
        thread '[debuginfo-gdb] debuginfo-gdb\associated-types.rs' panicked at 'gdb not available but debuginfo gdb debuginfo test requested', src\tools\compiletest\src\runtest.rs:48:16
note: Run with `RUST_BACKTRACE=1` for a backtrace.

[...identical panic causes omitted...]

---- [debuginfo-gdb] debuginfo-gdb\vec.rs stdout ----
        thread '[debuginfo-gdb] debuginfo-gdb\vec.rs' panicked at 'gdb not available but debuginfo gdb debuginfo test requested', src\tools\compiletest\src\runtest.rs:48:16
```

### Relevant Issues
* https://github.com/rust-lang/rust/issues/40460 Metaissue for Visual Studio debugging Rust
* https://github.com/rust-lang/rust/issues/36503 Investigate natvis for improved msvc debugging
* https://github.com/PistonDevelopers/VisualRust/issues/160 Debug visualization of Rust data structures

### Pretty Pictures
![Collapsed Watch Window](https://user-images.githubusercontent.com/75894/28180998-e44c7516-67bb-11e7-8b48-d4f9605973ae.png)
![Expanded Watch Window](https://user-images.githubusercontent.com/75894/28181000-e8da252e-67bb-11e7-96b8-d613310c04dc.png)
2017-07-28 10:25:58 +00:00
Josh Stone
efc67646fa Support homogeneous aggregates for hard-float ARM
Hard-float ARM targets use the AACPS-VFP ABI, which passes and returns
homogeneous float/vector aggregates in the VFP registers.

Fixes #43329.
2017-07-27 20:40:24 -07:00
Luca Barbato
ade5ead38e Add support for the Power8 and Power9 features on PowerPC 2017-07-27 13:30:51 +00:00
Florian Zeitz
ac43d58d3a trans: Optimize initialization using repeat expressions
This elides initialization for zero-sized arrays:
* for zero-sized elements we previously emitted an empty loop
* for arrays with a length of zero we previously emitted a loop with zero
  iterations

This emits llvm.memset() instead of a loop over each element when:
* all elements are zero integers
* elements are byte sized
2017-07-26 16:27:25 +02:00
Florian Zeitz
d721c1f9e3 trans: Reorder basic blocks in slice_for_each
This is mainly for readability of the generated LLVM IR and subsequently
assembly. There is a slight positive performance impact, likely due to
I-cache effects.
2017-07-26 16:23:07 +02:00
bors
c417ee9ae8 Auto merge of #43320 - alexcrichton:new-bootstrap, r=Mark-Simulacrum
Bump master to 1.21.0

This commit bumps the master branch's version to 1.21.0 and also updates the
bootstrap compiler from the freshly minted beta release.
2017-07-25 16:13:16 +00:00