Commit Graph

59349 Commits

Author SHA1 Message Date
Esteban Küber
08aa825eb8 remove O(n^2) to O(n) behavior 2016-12-19 13:30:42 -08:00
Esteban Küber
2841bf3bc7 Rustdoc: disambiguate Implementors when the type name is not unique 2016-12-15 23:13:00 -08:00
bors
6483bdd860 Auto merge of #38243 - michaelwoerister:fix-debuginfo-namespace-edge, r=nikomatsakis
incr.comp.: Avoid creating an edge to DepNode::Krate when generating debuginfo namespaces.

r? @nikomatsakis

Fixes #38222
2016-12-12 17:31:48 +00:00
Michael Woerister
271fb22924 incr.comp.: Avoid creating an edge to DepNode::Krate when generating debuginfo namespaces. 2016-12-12 12:18:04 -05:00
bors
b4b1e5ece2 Auto merge of #38049 - frewsxcv:libunicode, r=alexcrichton
Rename 'librustc_unicode' crate to 'libstd_unicode'.

Fixes https://github.com/rust-lang/rust/issues/26554.
2016-12-12 13:19:33 +00:00
bors
0eae43e4d0 Auto merge of #38307 - bluss:mir-opt-level, r=eddyb
Simplify use of mir_opt_level

Remove the unused top level option by the same name, and retain the
debug option.

Use -Zmir-opt-level=1 as default.

One pass is enabled by default but wants to be optional:

- Instcombine requires mir_opt_level > 0

Copy propagation is not used by default, but used to be activated by
explicit -Zmir-opt-level=1. It must move one higher to be off by
default:

- CopyPropagation requires mir_opt_level > 1

Deaggregate is not used by default, and used to be on a different level
than CopyPropagation:

- Deaggreate requires mir_opt_level > 2
2016-12-12 10:19:14 +00:00
bors
8d66181b5e Auto merge of #38296 - dylanmckay:llvm-4.0-errortype, r=alexcrichton
[LLVM 4.0] Explicitly call constructor of 'llvm::Error'

The implicit constructor has been deleted. We should use
Error::success() instead.

The constructor in the LLVM headers mentions that "success" should be
used instead of the deleted constructor for clarity.
2016-12-12 07:19:35 +00:00
bors
81fb6509c8 Auto merge of #38291 - brson:licenseck, r=alexcrichton
Check the license of vendored deps

r? @alexcrichton
2016-12-12 03:40:15 +00:00
bors
5e2f37fca9 Auto merge of #38057 - KiChjang:display-formal-type-param, r=nikomatsakis
Display better error messages for E0282

Fixes #36554.
2016-12-12 00:22:30 +00:00
bors
3db197aa9d Auto merge of #38265 - bluss:mir-deaggregator-loop, r=nagisa
Reinstate while loop in deaggregator pass

A previous commit must have removed the `while let` loop here by
mistake; for each basic block, it should find and deaggregate multiple
statements in their index order, and the `curr` index tracks the
progress through the block.

This fixes both the case of deaggregating statements in separate
basic blocks (preserving `curr` could prevent that) as well
as multiple times in the same block (missing loop prevented that).

The loop was lost in commit bda46c21fe.
2016-12-11 21:19:34 +00:00
Ulrik Sverdrup
6d46a21cb3 Simplify use of mir_opt_level
Remove the unused top level option by the same name, and retain the
debug option.

Use -Zmir-opt-level=1 as default.

One pass is enabled by default but wants to be optional:

- Instcombine requires mir_opt_level > 0

Copy propagation is not used by default, but used to be activated by
explicit -Zmir-opt-level=1. It must move one higher to be off by
default:

- CopyPropagation requires mir_opt_level > 1

Deaggregate is not used by default, and used to be on a different level
than CopyPropagation:

- Deaggreate requires mir_opt_level > 2
2016-12-11 21:23:59 +01:00
bors
6d5ec58912 Auto merge of #38272 - michaelwoerister:incr-symbol-visibility, r=nikomatsakis
incr.comp.: Take symbol visibility into account for CGU hashes

r? @nikomatsakis
2016-12-11 18:20:52 +00:00
bors
fd5dc05793 Auto merge of #38252 - pnkfelix:mildly-robustify-configure-msg, r=alexcrichton
Make configure message re x.py not assume build dir == src dir

Fix #38251 but perhaps not BEST fix for it.

As driveby, fix copyright year in `Makefile.in`
2016-12-11 12:33:12 +00:00
Dylan McKay
6222de3ce4 [LLVM 4.0] Explicitly call constructor of 'llvm::Error'
The implicit constructor has been deleted. We should use
Error::success() instead.

The constructor in the LLVM headers mentions that "success" should be
used instead of the deleted constructor for clarity.
2016-12-11 22:44:19 +13:00
bors
e0158e02f9 Auto merge of #38249 - arielb1:special-substs, r=nikomatsakis
erase lifetimes when translating specialized substs

Projections can generate lifetime variables with equality constraints,
that will not be resolved by `resolve_type_vars_if_possible`, so substs
need to be lifetime-erased after that.

Fixes #36848.
2016-12-11 09:33:05 +00:00
bors
368e092c26 Auto merge of #38250 - michaelwoerister:trait-methods-in-reachable, r=alexcrichton
Consider provided trait methods in middle::reachable

Fixes https://github.com/rust-lang/rust/issues/38226 by also considering trait methods with default implementation instead of just methods provided in an impl.

r? @alexcrichton
cc @panicbit
2016-12-11 06:37:19 +00:00
bors
ea798527e4 Auto merge of #38240 - pftbest:update_llvm, r=japaric
LLVM: Update submodule to include patches for MSP430.

Fixes #37829
2016-12-11 01:06:20 +00:00
Brian Anderson
5e3be09b58 Check the license of vendored deps 2016-12-10 23:27:42 +00:00
bors
f82b7cbc10 Auto merge of #38231 - vadimcn:errormode, r=alexcrichton
Prevent Windows from displaying UI on errors.

Otherwise tests like run-pass/out-of-stack get wedged on Windows error reporting dialog (unless error reporting has been disabled, of course).
2016-12-10 22:08:20 +00:00
bors
c79d0b40a0 Auto merge of #38239 - jseyfried:fix_doc_tests_on_macros, r=eddyb
Fix doc-tests on exported `macro_rules!`

Fixes #38219.
r? @eddyb
2016-12-10 19:12:54 +00:00
bors
576a361cd0 Auto merge of #37780 - GuillaumeGomez:E0571, r=nikomatsakis
Add checkup for return statement outside of a function

Fixes #37778.

r? @eddyb (don't know who is in charge. Don't hesitate to set another one)

cc @jonathandturner
2016-12-10 16:18:07 +00:00
bors
39c9f184a2 Auto merge of #38233 - alexcrichton:more-errors, r=japaric
rustbuild: Print out failing commands

Just ensure that we always print out the command line which should aid in
debugging.

Closes #38228
2016-12-10 13:00:25 +00:00
bors
d53f39e1e5 Auto merge of #38217 - oli-obk:mir-for-all-and-all-for-mir, r=eddyb
add a -Z flag to guarantee that MIR is generated for all functions

r? @eddyb

cc @solson
2016-12-10 03:49:38 +00:00
Keith Yeung
d24028b5a8 Add UI test for missing type parameter 2016-12-09 18:23:05 -08:00
bors
ebf2e7da5b Auto merge of #38223 - rkruppe:llvm-stringref-fixes, r=alexcrichton
printf type correctness

The `%.*s` format specifier requires an int for the maximum size, but StringRef::size is a size_t

cc @shepmaster
2016-12-10 00:34:13 +00:00
Michael Woerister
90f0de8244 incr.comp.: Add test case for symbol visibility changes 2016-12-09 17:47:56 -05:00
Michael Woerister
4a494ed8df incr.comp.: Take symbol visibility into account for CGU hashes. 2016-12-09 17:47:56 -05:00
bors
fa45d0be82 Auto merge of #38102 - nrc:save-bots, r=brson
Create tar balls of save-analysis-api metadata for the standard libra…

…ries as part of `make dist`.

r? @alexcrichton
2016-12-09 21:37:21 +00:00
bors
e9aa73d2bf Auto merge of #38203 - nrc:save-wr, r=eddyb
save-analysis: fix a few generated code errors
2016-12-09 18:43:33 +00:00
Nick Cameron
c49ba058a0 Create tar balls of save-analysis-api metadata for the standard libraries as part of make dist. 2016-12-09 08:37:42 -10:00
Ulrik Sverdrup
fbc3f11fc1 mir: Reinstate while loop in deaggregator pass
A previous commit must have removed the `while let` loop here by
mistake; for each basic block, it should find and deaggregate multiple
statements in their index order, and the `curr` index tracks the
progress through the block.

This fixes both the case of deaggregating statements in separate
basic blocks (preserving `curr` could prevent that) as well
as multiple times in the same block (missing loop prevented that).
2016-12-09 18:16:38 +01:00
Oliver Schneider
d74d15345c
move the check for instantiation from metadata encoding to the actual decision site
before it was assumed that anything that had a MIR was fair game for local instatiation
2016-12-09 17:29:01 +01:00
bors
51d29343c0 Auto merge of #38197 - mneumann:dragonfly-fixes-2016-12-06, r=alexcrichton
Fix current_exe() on DragonFly (again)

This is a follow up on [this pull request][1].

Since DragonFly 4.6.1 ([this commit][2]), the ```kern.proc.pathname```
sysctl works correctly, i.e. it does not return paths including a ```:```
(see [here][3]). Use it and don't try to fix old versions of DragonFly!
There are not many DragonFly installations out there that we can't
control and no one is compiling Rust from source. If someone wants to
run Rust on a pre-4.6.1 DragonFly system, the ports system should
provide a patch.

[1]: https://github.com/rust-lang/rust/pull/35494
[2]: https://gitweb.dragonflybsd.org/dragonfly.git/commit/726f7ca07e193db73635e9c4e24e40c96087d6d9
[3]: https://gist.github.com/mneumann/a2f6b6a0a03935b561d6185872a4b222
2016-12-09 15:45:41 +00:00
Oliver Schneider
910c369c92
enable checking for const fn without needing to go through entry 2016-12-09 16:31:53 +01:00
bors
bd148d220e Auto merge of #38196 - rkruppe:llvm-archivewrapper-fwdcompat, r=alexcrichton
[LLVM 4.0] rustllvm archive support

Error handling is being transitioned from ErrorOr<T> to Expected<T> which has a different API and requires explicitly handling all errors

cc #37609
2016-12-09 12:52:42 +00:00
Oliver Schneider
acfb06fd59
remove double negation in comment 2016-12-09 11:27:45 +01:00
bors
dedd985084 Auto merge of #38192 - stjepang:faster-sort-algorithm, r=bluss
Implement a faster sort algorithm

Hi everyone, this is my first PR.

I've made some changes to the standard sort algorithm, starting out with a few tweaks here and there, but in the end this endeavour became a complete rewrite of it.

#### Summary

Changes:

* Improved performance, especially on partially sorted inputs.
* Performs less comparisons on both random and partially sorted inputs.
* Decreased the size of temporary memory: the new sort allocates 4x less.

Benchmark:

```
 name                                        out1 ns/iter          out2 ns/iter          diff ns/iter   diff %
 slice::bench::sort_large_ascending          85,323 (937 MB/s)     8,970 (8918 MB/s)          -76,353  -89.49%
 slice::bench::sort_large_big_ascending      2,135,297 (599 MB/s)  355,955 (3595 MB/s)     -1,779,342  -83.33%
 slice::bench::sort_large_big_descending     2,266,402 (564 MB/s)  416,479 (3073 MB/s)     -1,849,923  -81.62%
 slice::bench::sort_large_big_random         3,053,031 (419 MB/s)  1,921,389 (666 MB/s)    -1,131,642  -37.07%
 slice::bench::sort_large_descending         313,181 (255 MB/s)    14,725 (5432 MB/s)        -298,456  -95.30%
 slice::bench::sort_large_mostly_ascending   287,706 (278 MB/s)    243,204 (328 MB/s)         -44,502  -15.47%
 slice::bench::sort_large_mostly_descending  415,078 (192 MB/s)    271,028 (295 MB/s)        -144,050  -34.70%
 slice::bench::sort_large_random             545,872 (146 MB/s)    521,559 (153 MB/s)         -24,313   -4.45%
 slice::bench::sort_large_random_expensive   30,321,770 (2 MB/s)   23,533,735 (3 MB/s)     -6,788,035  -22.39%
 slice::bench::sort_medium_ascending         616 (1298 MB/s)       155 (5161 MB/s)               -461  -74.84%
 slice::bench::sort_medium_descending        1,952 (409 MB/s)      202 (3960 MB/s)             -1,750  -89.65%
 slice::bench::sort_medium_random            3,646 (219 MB/s)      3,421 (233 MB/s)              -225   -6.17%
 slice::bench::sort_small_ascending          39 (2051 MB/s)        34 (2352 MB/s)                  -5  -12.82%
 slice::bench::sort_small_big_ascending      96 (13333 MB/s)       96 (13333 MB/s)                  0    0.00%
 slice::bench::sort_small_big_descending     248 (5161 MB/s)       243 (5267 MB/s)                 -5   -2.02%
 slice::bench::sort_small_big_random         501 (2554 MB/s)       490 (2612 MB/s)                -11   -2.20%
 slice::bench::sort_small_descending         95 (842 MB/s)         63 (1269 MB/s)                 -32  -33.68%
 slice::bench::sort_small_random             372 (215 MB/s)        354 (225 MB/s)                 -18   -4.84%
```

#### Background

First, let me just do a quick brain dump to discuss what I learned along the way.

The official documentation says that the standard sort in Rust is a stable sort. This constraint is thus set in stone and immediately rules out many popular sorting algorithms. Essentially, the only algorithms we might even take into consideration are:

1. [Merge sort](https://en.wikipedia.org/wiki/Merge_sort)
2. [Block sort](https://en.wikipedia.org/wiki/Block_sort) (famous implementations are [WikiSort](https://github.com/BonzaiThePenguin/WikiSort) and [GrailSort](https://github.com/Mrrl/GrailSort))
3. [TimSort](https://en.wikipedia.org/wiki/Timsort)

Actually, all of those are just merge sort flavors. :) The current standard sort in Rust is a simple iterative merge sort. It has three problems. First, it's slow on partially sorted inputs (even though #29675 helped quite a bit). Second, it always makes around `log(n)` iterations copying the entire array between buffers, no matter what. Third, it allocates huge amounts of temporary memory (a buffer of size `2*n`, where `n` is the size of input).

The problem of auxilliary memory allocation is a tough one. Ideally, it would be best for our sort to allocate `O(1)` additional memory. This is what block sort (and it's variants) does. However, it's often very complicated (look at [this](https://github.com/BonzaiThePenguin/WikiSort/blob/master/WikiSort.cpp)) and even then performs rather poorly. The author of WikiSort claims good performance, but that must be taken with a grain of salt. It performs well in comparison to `std::stable_sort` in C++. It can even beat `std::sort` on partially sorted inputs, but on random inputs it's always far worse. My rule of thumb is: high performance, low memory overhead, stability - choose two.

TimSort is another option. It allocates a buffer of size `n/2`, which is not great, but acceptable. Performs extremelly well on partially sorted inputs. However, it seems pretty much all implementations suck on random inputs. I benchmarked implementations in [Rust](https://github.com/notriddle/rust-timsort), [C++](https://github.com/gfx/cpp-TimSort), and [D](fd518eb310/std/algorithm/sorting.d (L2062)). The results were a bit disappointing. It seems bad performance is due to complex galloping procedures in hot loops. Galloping noticeably improves performance on partially sorted inputs, but worsens it on random ones.

#### The new algorithm

Choosing the best algorithm is not easy. Plain merge sort is bad on partially sorted inputs. TimSort is bad on random inputs and block sort is even worse. However, if we take the main ideas from TimSort (intelligent merging strategy of sorted runs) and drop galloping, then we'll have great performance on random inputs and it won't be bad on partially sorted inputs either.

That is exactly what this new algorithm does. I can't call it TimSort, since it steals just a few of it's ideas. Complete TimSort would be a much more complex and elaborate implementation. In case we in the future figure out how to incorporate more of it's ideas into this implementation without crippling performance on random inputs, it's going to be very easy to extend. I also did several other minor improvements, like reworked insertion sort to make it faster.

There are also new, more thorough benchmarks and panic safety tests.

The final code is not terribly complex and has less unsafe code than I anticipated, but there's still plenty of it that should be carefully reviewed. I did my best at documenting non-obvious code.

I'd like to notify several people of this PR, since they might be interested and have useful insights:

1. @huonw because he wrote the [original merge sort](https://github.com/rust-lang/rust/pull/11064).
2. @alexcrichton because he was involved in multiple discussions of it.
3. @veddan because he wrote [introsort](https://github.com/veddan/rust-introsort) in Rust.
4. @notriddle because he wrote [TimSort](https://github.com/notriddle/rust-timsort) in Rust.
5. @bluss because he had an attempt at writing WikiSort in Rust.
6. @gnzlbg, @rkruppe, and @mark-i-m because they were involved in discussion #36318.

**P.S.** [quickersort](https://github.com/notriddle/quickersort) describes itself as being universally [faster](https://github.com/notriddle/quickersort/blob/master/perf.txt) than the standard sort, which is true. However, if this PR gets merged, things might [change](https://gist.github.com/stjepang/b9f0c3eaa0e1f1280b61b963dae19a30) a bit. ;)
2016-12-09 10:00:25 +00:00
bors
adb4279e54 Auto merge of #38256 - alexcrichton:distcheck, r=brson
rustbuild: Implement distcheck

This commit implements the `distcheck` target for rustbuild which is only ever
run on our nightly bots. This essentially just creates a tarball, un-tars it,
and then runs a full build, validating that the release tarballs do indeed have
everything they need to build Rust.
2016-12-09 07:08:29 +00:00
Guillaume Gomez
ed3c483aa8 Change error to E0572 2016-12-08 21:03:46 -08:00
Guillaume Gomez
b1dd793acd Update to last master 2016-12-08 20:49:33 -08:00
Guillaume Gomez
64de44e0a1 Set back Ty parameter to FnCntxt 2016-12-08 20:49:33 -08:00
Guillaume Gomez
8dee5ab805 Add E0571 test 2016-12-08 20:49:33 -08:00
Guillaume Gomez
5a065641fd Add checkup for return statement outside of a function 2016-12-08 20:49:33 -08:00
bors
6a495f71ff Auto merge of #37492 - japaric:no-atomics-alloc, r=brson
make `alloc` and `collections` compilable for thumbv6m-none-eabi

by cfging away `alloc::Arc` and changing OOM to abort for this target

r? @alexcrichton
cc @thejpster
2016-12-09 04:02:51 +00:00
Alex Crichton
d38db82b29 rustbuild: Implement distcheck
This commit implements the `distcheck` target for rustbuild which is only ever
run on our nightly bots. This essentially just creates a tarball, un-tars it,
and then runs a full build, validating that the release tarballs do indeed have
everything they need to build Rust.
2016-12-08 17:14:44 -08:00
Felix S. Klock II
25adc4e82e Fix #38251 but perhaps not BEST fix for it. 2016-12-08 13:09:20 -10:00
Michael Woerister
5d35dfb01e Improve debug output in trans:🔙:symbol_export. 2016-12-08 17:06:56 -05:00
Michael Woerister
d602d7b97e Extend middle::reachable to also consider provided trait methods. 2016-12-08 17:06:56 -05:00
Stjepan Glavina
c0e150a2a6 Inline nested fn collapse
Since merge_sort is generic and collapse isn't, that means calls to
collapse won't be inlined.  inlined. Therefore, we must stick an
`#[inline]` above `fn collapse`.
2016-12-08 22:37:36 +01:00
bors
97bfeadfd8 Auto merge of #38195 - rkruppe:llvm-pass-name-fwdcompat, r=alexcrichton
[LLVM 4.0] test/run-make/llvm-pass/

cc #37609
2016-12-08 21:13:52 +00:00