about summary refs log tree commit diff
path: root/src
AgeCommit message (Collapse)AuthorLines
2016-06-17Auto merge of #33090 - bluss:special-zip-2, r=aturonbors-21/+263
Specialize .zip() for efficient slice and slice iteration The idea is to introduce a private trait TrustedRandomAccess and specialize .zip() for random access iterators into a counted loop. The implementation in the PR is internal and has no visible effect in the API Why a counted loop? To have each slice iterator compile to just a pointer, and both pointers are indexed with the same loop counter value in the generated code. When this succeeds, copying loops are readily recognized and replaced with memcpy and addition loops autovectorize well. The TrustedRandomAccess approach works very well on the surface. Microbenchmarks optimize well, following the ideas above, and that is a dramatic improvement of .zip()'s codegen. ```rust // old zip before this PR: bad, byte-for-byte loop // with specialized zip: memcpy pub fn copy_zip(xs: &[u8], ys: &mut [u8]) { for (a, b) in ys.iter_mut().zip(xs) { *a = *b; } } // old zip before this PR: single addition per iteration // with specialized zip: vectorized pub fn add_zip(xs: &[f32], ys: &mut [f32]) { for (a, b) in ys.iter_mut().zip(xs) { *a += *b; } } // old zip before this PR: single addition per iteration // with specialized zip: vectorized (!!) pub fn add_zip3(xs: &[f32], ys: &[f32], zs: &mut [f32]) { for ((a, b), c) in zs.iter_mut().zip(xs).zip(ys) { *a += *b * *c; } } ``` Yet in more complex situations, the .zip() loop can still fall back to its old behavior where phantom null checks throw in fake premature end of the loop conditionals. Remember that a NULL inside Option<(&T, &T)> makes it a `None` value and a premature (in this case) end of the loop. So even if we have 1) an explicit `Some` in the code and 2) the types of the pointers are `&T` or `&mut T` which are nonnull, we can still get a phantom null check at that point. One example that illustrates the difference is `copy_zip` with slice versus Vec arguments. The involved iterator types are exactly the same, but the Vec version doesn't compile down to memcpy. Investigating into this, the function argument metadata emitted to llvm plays the biggest role. As eddyb summarized, we need nonnull for the loop to autovectorize and noalias for it to replace with memcpy. There was an experiment to use `assume` to add a non-null assumption on each of the two elements in the specialized zip iterator, but this only helped in some of the test cases and regressed others. Instead I think the nonnull/noalias metadata issue is something we need to solve separately anyway. These have conditionally implemented TrustedRandomAccess - Enumerate - Zip These have not implemented it - Map is sideeffectful. The forward case would be workable, but the double ended case is complicated. - Chain, exact length semantics unclear - Filter, FilterMap, FlatMap and many others don't offer random access and/or exact length
2016-06-16Auto merge of #34306 - arielb1:mir-dump-fixes, r=eddybbors-18/+27
Fixes for `-Z dump-mir` Do not overwrite the parent MIR when dumping promoted MIR. r? @eddyb
2016-06-16Auto merge of #34315 - Manishearth:rollup, r=Manishearthbors-934/+1037
Rollup of 4 pull requests - Successful merges: #34298, #34302, #34307, #34312 - Failed merges:
2016-06-17Rollup merge of #34312 - erickt:add-try, r=nikomatsakisManish Goregaokar-859/+859
Revert using ? for try! in the libsyntax pretty printer The use of ...?instead of try!(...) in libsyntax makes extracting libsyntax into syntex quite painful since it's not stable yet. This makes backports take a much longer time and causes a lot of problems for the syntex dependencies. Even if it was, it'd take a few release cycles until syntex would be able to use it. Since it's not stable and that this feature is just syntax sugar, it would be most helpful if we could remove it. cc #34311
2016-06-17Rollup merge of #34307 - nagisa:more-cache, r=arielb1Manish Goregaokar-27/+30
[MIR] Cache drops for early scope exits Previously we would rebuild all drops on every early exit from a scope, which for code like: ```rust match x { A => return 1, B => return 2, ... C => return 27 } ``` would produce 27 exactly same chains of drops for each return, basically a `O(n*m)` explosion. [This](https://cloud.githubusercontent.com/assets/679122/16125192/3355e32c-33fb-11e6-8564-c37cab2477a0.png) is such a case for a match on 80-variant enum with 3 droppable variables in scope. For [`::core::iter::Iterator::partial_cmp`](https://github.com/rust-lang/rust/blob/6edea2cfda2818f0a76f4bac2d18a30feb54c137/src/libcore/iter/iterator.rs#L1909) the CFG looked like [this](https://cloud.githubusercontent.com/assets/679122/16122708/ce0024d8-33f0-11e6-93c2-e1c44b910db2.png) (after initial SimplifyCfg). With this patch the CFG looks like [this](https://cloud.githubusercontent.com/assets/679122/16122806/294fb16e-33f1-11e6-95f6-16c5438231af.png) instead. Some numbers (overall very small wins, however neither of the crates have many cases which abuse this corner case): | | old time | old rss | new time | new rss | |-------------------------|----------|---------|----------|----------| | core dump | 0.879 | 224MB | 0.871 | 223MB | | core MIR passes | 0.759 | 224MB | 0.718 | 223MB | | core MIR codegen passes | 1.762 | 230MB | 1.442 | 228MB | | core trans | 3.263 | 279MB | 3.116 | 278MB | | core llvm passes | 5.611 | 263MB | 5.565 | 263MB | | std dump | 0.487 | 190MB | 0.475 | 192MB | | std MIR passes | 0.311 | 190MB | 0.288 | 192MB | | std MIR codegen passes | 0.753 | 195MB | 0.720 | 197MB | | std trans | 2.589 | 287MB | 2.523 | 287MB | | std llvm passes | 7.268 | 245MB | 7.447 | 246MB |
2016-06-17Rollup merge of #34302 - retep998:🐇-sanity-is-overrated-🐇, r=alexcrichtonManish Goregaokar-13/+21
Fix issue where rustbuild expected msvc to have ar I made `cc2ar` return an `Option`. r? @alexcrichton
2016-06-17Rollup merge of #34298 - nrc:save-parent, r=eddybManish Goregaokar-35/+127
save-analysis: some tweaks
2016-06-16Auto merge of #34272 - jseyfried:simplify_gated_cfg_checking, r=nrcbors-218/+113
Simplify gated cfg checking r? @nrc
2016-06-17Cache drops for early scope exitsSimonas Kazlauskas-27/+30
Previously we would rebuild all drops on every early exit from a scope, which for code like: ```rust match x { a => return 1, b => return 2, ... z => return 27 } ``` would produce 27 exactly same chains of drops for each return, a O(n*m) explosion in drops.
2016-06-16Revert using ? for try! in the libsyntax pretty printerErick Tryzelaar-859/+859
The use of ...?instead of try!(...) in libsyntax makes extracting libsyntax into syntex quite painful since it's not stable yet. This makes backports take a much longer time and causes a lot of problems for the syntex dependencies. Even if it was, it'd take a few release cycles until syntex would be able to use it. Since it's not stable and that this feature is just syntax sugar, it would be most helpful if we could remove it. cc #34311
2016-06-16Simplify gated cfg checkingJeffrey Seyfried-218/+113
2016-06-16Auto merge of #34187 - luser:extern-crate-abspaths, r=michaelwoeristerbors-60/+100
Add an abs_path member to FileMap, use it when writing debug info. Fixes #34179. When items are inlined from extern crates, the filename in the debug info is taken from the FileMap that's serialized in the rlib metadata. Currently this is just FileMap.name, which is whatever path is passed to rustc. Since libcore and libstd are built by invoking rustc with relative paths, they wind up with relative paths in the rlib, and when linked into a binary the debug info uses relative paths for the names, but since the compilation directory for the final binary, tools trying to read source filenames will wind up with bad paths. We noticed this in Firefox with source filenames from libcore/libstd having bad paths. This change stores an absolute path in FileMap.abs_path, and uses that if available for writing debug info. This is not going to magically make debuggers able to find the source, but it will at least provide sensible paths.
2016-06-16Add an abs_path member to FileMap, use it when writing debug info.Ted Mielczarek-60/+100
When items are inlined from extern crates, the filename in the debug info is taken from the FileMap that's serialized in the rlib metadata. Currently this is just FileMap.name, which is whatever path is passed to rustc. Since libcore and libstd are built by invoking rustc with relative paths, they wind up with relative paths in the rlib, and when linked into a binary the debug info uses relative paths for the names, but since the compilation directory for the final binary, tools trying to read source filenames will wind up with bad paths. We noticed this in Firefox with source filenames from libcore/libstd having bad paths. This change stores an absolute path in FileMap.abs_path, and uses that if available for writing debug info. This is not going to magically make debuggers able to find the source, but it will at least provide sensible paths.
2016-06-16Auto merge of #34296 - dsprenkels:issue-23122-tests, r=alexcrichtonbors-0/+44
Add regression tests for #23122 This PR adds two regression tests for #23122. Closes #23122.
2016-06-16fix MirSource::Promoted handlingAriel Ben-Yehuda-17/+15
2016-06-16stop having `'static` in dump-mir namesAriel Ben-Yehuda-0/+6
2016-06-16use a different filename for original and promoted MIRsAriel Ben-Yehuda-2/+7
2016-06-16Auto merge of #34239 - jseyfried:fix_macro_use_scope_regression, r=nrcbors-26/+91
Revert a change in the scope of macros imported from crates to fix a regression Fixes #34212. The regression was caused by #34032, which changed the scope of macros imported from extern crates to match the scope of macros imported from modules. r? @nrc
2016-06-16Fix issue where rustbuild expected msvc to have arPeter Atashian-13/+21
Signed-off-by: Peter Atashian <retep998@gmail.com>
2016-06-16Auto merge of #34216 - jseyfried:nested_cfg_attr, r=nrcbors-1/+15
Support nested `cfg_attr` attributes Support arbitrarily deeply nested `cfg_attr` attributes (e.g. `#[cfg_attr(foo, cfg_attr(bar, baz))]`). This makes configuration idempotent. Currently, the nighties do not support any `cfg_attr` nesting. Stable and beta support just one level of `cfg_attr` nesting (expect for attributes on macro-expanded nodes, where no nesting is supported). This is a [breaking-change]. For example, the following would break: ```rust macro_rules! m { () => { #[cfg_attr(all(), cfg_attr(all(), cfg(foo)))] fn f() {} } } m!(); fn main() { f() } //~ ERROR unresolved name `f` ``` r? @nrc
2016-06-16save-analysis: add a decl_id for methodsNick Cameron-17/+50
This is non-null if the method is in a (non-inherent) impl and in that case will be the id for the method declaration in the implemented trait.
2016-06-16Auto merge of #34290 - arielb1:short-ladder, r=eddybbors-8/+15
don't generate drop ladder steps for fields that don't need dropping cc @eddyb This should help with #34166
2016-06-16Add regression tests for #23122Daan Sprenkels-0/+44
2016-06-16fix codegen-units falloutAriel Ben-Yehuda-2/+0
2016-06-15Auto merge of #34000 - estebank:missingargs, r=jseyfriedbors-33/+55
Show types of all args when missing args When there're missing arguments in a function call, present a list of all the expected types: ```rust fn main() { t(""); } fn t(a: &str, x: String) {} ``` ```bash % rustc file.rs file.rs:3:5: 2:8 error: this function takes 2 parameters but 0 parameters were supplied [E0061] file.rs:3 t(); ^~~ file.rs:3:5: 2:8 help: run `rustc --explain E0061` to see a detailed explanation file.rs:3:5: 2:8 note: the following parameter types were expected: &str, std::string::String error: aborting due to previous error ``` Fixes #33649
2016-06-15Show types of all args when missing argsEsteban Küber-33/+55
When there're missing arguments in a function call, present a list of all the expected types: ```rust fn main() { t(""); } fn t(a: &str, x: String) {} ``` ```bash % rustc file.rs file.rs:3:5: 2:8 error: this function takes 2 parameters but 0 parameters were supplied [E0061] file.rs:3 t(); ^~~ file.rs:3:5: 2:8 help: run `rustc --explain E0061` to see a detailed explanation file.rs:3:5: 2:8 note: the following parameter types were expected: &str, std::string::String error: aborting due to previous error ``` Fixes #33649
2016-06-16Rollup merge of #34270 - gkoz:error_file_exists, r=alexcrichtonManish Goregaokar-1/+12
Add ERROR_FILE_EXISTS to ErrorKind conversion on Windows Bug report: https://users.rust-lang.org/t/detecting-error-kind-for-opening-file/6215 Reference: https://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspx#error_file_exists
2016-06-16Rollup merge of #34268 - zackmdavis:if_let_over_none_unit_arm, r=jseyfriedManish Goregaokar-139/+101
prefer `if let` to match with `None => ()` arm in some places Casual grepping revealed some places in the codebase (some of which antedated `if let`'s December 2014 stabilization in c200ae5a) where we were using a match with a `None => ()` arm where (in the present author's opinion) an `if let` conditional would be more readable. (Other places where matching to the unit value did seem to better express the intent were left alone.) It's likely that we don't care about making such trivial, non-functional, sheerly æsthetic changes. But if we do, this is a patch.
2016-06-16Rollup merge of #34207 - petrochenkov:nohyg, r=jseyfriedManish Goregaokar-42/+13
Remove last traces of identifier hygiene from HIR https://github.com/rust-lang/rust/pull/34095/commits/e783a0a5e39d5ae2fa147508197d09a51530fae8 removed the [last](https://github.com/rust-lang/rust/pull/33654#discussion_r63415218) [use](https://github.com/rust-lang/rust/pull/33654#discussion_r63416284) of hygiene at post-resolve compilation stages, so we can avoid renaming during lowering to HIR and just keep original names. r? @nrc
2016-06-16don't generate drop ladder steps for fields that don't need droppingAriel Ben-Yehuda-6/+15
2016-06-15Auto merge of #34220 - srinivasreddy:rf_cargotest, r=brsonbors-38/+38
run rustfmt on cargotest folder in src/tools/cargotest
2016-06-15Auto merge of #34218 - srinivasreddy:rf_linkchecker, r=brsonbors-37/+30
run rustfmt on linkchecker folderin src/tools/linkchecker
2016-06-15prefer `if let` to match with `None => ()` arm in some placesZack M. Davis-139/+101
Casual grepping revealed some places in the codebase (some of which antedated `if let`'s December 2014 stabilization in c200ae5a) where we were using a match with a `None => ()` arm where (in the present author's opinion) an `if let` conditional would be more readable. (Other places where matching to the unit value did seem to better express the intent were left alone.) It's likely that we don't care about making such trivial, non-functional, sheerly æsthetic changes. But if we do, this is a patch.
2016-06-15Auto merge of #33300 - seanmonstar:map-entry-take, r=alexcrichtonbors-0/+25
Map::Entry methods to recover key and value together See https://github.com/rust-lang/rust/issues/32281#issuecomment-213066344
2016-06-15Map::Entry::take() method to recover key and value togetherSean McArthur-0/+25
2016-06-15Auto merge of #34180 - durka:patch-24, r=brsonbors-6/+212
derive Hash (and not Copy) for ranges Fixes #34170. Also, `RangeInclusive` was `Copy` by mistake -- fix that, which is a [breaking-change] to that unstable type.
2016-06-15Fix a docs typoGleb Kozyrev-1/+1
2016-06-15Test ErrorKind::AlreadyExists for filesGleb Kozyrev-0/+9
2016-06-14Auto merge of #34263 - ollie27:docs_ip, r=alexcrichtonbors-20/+35
Improve IP reserved address docs - Add links to all RFCs to make it clear these are not Rust RFCs. - Correct RFC numbers to match the numbers in [RFC 6890](https://tools.ietf.org/html/rfc6890) - Clean up formatting to show addresses and ranges in parentheses like (255.255.255.255) r? @steveklabnik
2016-06-14Auto merge of #34245 - ollie27:rustdoc_redirect_rename, r=alexcrichtonbors-12/+42
rustdoc: Fix redirect pages for renamed reexports We need to use the name of the target not the name of the current item when creating the link. An example in `std` is [`std::sys::ext`](https://doc.rust-lang.org/nightly/std/sys/ext/index.html).
2016-06-14Auto merge of #34221 - srinivasreddy:rm_redundant, r=alexcrichtonbors-15/+1
remove redundant test case in bitvector.rs `bitvec_iter_works_2` does exactly same as `bitvec_iter_works_1`, so i removed it.
2016-06-14Auto merge of #34234 - GuillaumeGomez:bad_inlining, r=steveklabnikbors-2/+6
Fix invalid inlining r? @steveklabnik So to put a context. @nox found an issue on the generated doc: ![screenshot from 2016-06-11 19-53-38](https://cloud.githubusercontent.com/assets/3050060/15987898/f7341de0-303b-11e6-9cd7-f2a6df423ee7.png) So as you can see, the two variants are on the same where they shouldn't. I found out that the issue is also on structs: ![screenshot from 2016-06-11 19-53-31](https://cloud.githubusercontent.com/assets/3050060/15987900/0f66c5de-303c-11e6-90fc-5e49d11b6903.png) And so such is the result of the PR: ![screenshot from 2016-06-12 01-15-21](https://cloud.githubusercontent.com/assets/3050060/15987904/19d9183c-303c-11e6-91c1-7c3f1163fbb0.png) ![screenshot from 2016-06-12 01-15-24](https://cloud.githubusercontent.com/assets/3050060/15987905/1b5d2db0-303c-11e6-8f43-9a8ad2371007.png)
2016-06-14rustdoc: Fix redirect pages for renamed reexportsOliver Middleton-12/+42
We need to use the name of the target not the name of the current item when creating the link.
2016-06-14specialize zip: Use associated type for specialized zip struct dataUlrik Sverdrup-13/+39
The associated type must be 'static to avoid dropck related errors.
2016-06-14specialize zip: Add benchmarksUlrik Sverdrup-0/+31
2016-06-14specialize zip: Add codegen testUlrik Sverdrup-0/+22
2016-06-14specialize zip: TrustedRandomAccess for EnumerateUlrik Sverdrup-0/+9
2016-06-14specialize zip: TrustedRandomAccess for ZipUlrik Sverdrup-0/+11
2016-06-14specialize zip: Specialize .zip() for TrustedRandomAccess iteratorsUlrik Sverdrup-21/+121
This allows common iterator compositions like a.zip(b) where a, b are slice::{Iter, IterMut} compile to *much* better code.
2016-06-14specialize zip: Implement TrustedRandomAccess for slice iteratorsUlrik Sverdrup-0/+15