2344 Commits

Author SHA1 Message Date
bors
81d5c3e783 Auto merge of #51428 - alexreg:uninitialized-statics-simplification, r=oli-obk
Removed `uninitialized_statics` field from `Memory` struct in miri

based on #51110

r? @oli-obk

CC @eddyb
2018-07-03 02:01:49 +00:00
bors
9363342be9 Auto merge of #51896 - nikomatsakis:nll-liveness-dirty-list, r=Zoxc
introduce dirty list to liveness, eliminate `ins` vector

At least in my measurements, this seems to knock much of the liveness computation off the profile.

r? @Zoxc
cc @nnethercote
2018-07-02 18:09:20 +00:00
Niko Matsakis
78ea95258d improve comments 2018-07-02 11:40:49 -04:00
Alexander Regueiro
ea806e7815 Removed uninitialized_statics field from Memory struct in miri.
Refactored code accordingly.
2018-07-02 15:18:36 +01:00
bors
c697a56d01 Auto merge of #51110 - alexreg:new-static-eval-rules, r=eddyb
Loosened rules involving statics mentioning other statics

Before this PR, trying to mention a static in any way other than taking a reference to it caused a compile-time error. So, while

```rust
static A: u32 = 42;
static B: &u32 = &A;
```

compiles successfully,

```rust
static A: u32 = 42;
static B: u32 = A; // error
```

and

```rust
static A: u32 = 42;
static B: u32 = *&A; // error
```

are not possible to express in Rust. On the other hand, introducing an intermediate `const fn` can presently allow one to do just that:

```rust
static A: u32 = 42;
static B: u32 = foo(&A); // success!

const fn foo(a: &u32) -> u32 {
    *a
}
```

Preventing `const fn` from allowing to work around the ban on reading from statics would cripple `const fn` almost into uselessness.
Additionally, the limitation for reading from statics comes from the old const evaluator(s) and is not shared by `miri`.

This PR loosens the rules around use of statics to allow statics to evaluate other statics by value, allowing all of the above examples to compile and run successfully.
Reads from extern (foreign) statics are however still disallowed by miri, because there is no compile-time value to be read.

```rust
extern static A: u32;

static B: u32 = A; // error
```

This opens up a new avenue of potential issues, as a static can now not just refer to other statics or read from other statics, but even contain references that point into itself.
While it might seem like this could cause subtle bugs like allowing a static to be initialized by its own value, this is inherently impossible in miri.
Reading from a static causes the `const_eval` query for that static to be invoked. Calling the `const_eval` query for a static while already inside the `const_eval` query of said static will cause cycle errors.
It is not possible to accidentally create a bug in miri that would enable initializing a static with itself, because the memory of the static *does not exist* while being initialized.
The memory is not uninitialized, it is not there. Thus any change that would accidentally allow reading from a not yet initialized static would cause ICEs.

Tests have been modified according to the new rules, and new tests have been added for writing to `static mut`s within definitions of statics (which needs to fail), and incremental compilation with complex/interlinking static definitions.
Note that incremental compilation did not need to be adjusted, because all of this was already possible before with workarounds (like intermediate `const fn`s) and the encoding/decoding already supports all the possible cases.

r? @eddyb
2018-07-01 23:00:27 +00:00
bors
a2be769fd5 Auto merge of #51833 - wesleywiser:faster_large_constant_arrays, r=oli-obk
Speed up compilation of large constant arrays

This is a different approach to #51672 as suggested by @oli-obk. Rather
than write each repeated value one-by-one, we write the first one and
then copy its value directly into the remaining memory.

With this change, the [toy program](c2f4744d2d/src/test/run-pass/mir_heavy_promoted.rs) goes from 63 seconds to 19 seconds on my machine.

Edit: Inlining `Size::bytes()` saves an additional 6 seconds dropping the total time to 13 seconds on my machine.

Edit2: Now down to 2.8 seconds.

r? @oli-obk

cc @nnethercote @eddyb
2018-07-01 18:43:41 +00:00
David Wood
15aad83560
Fix infinite loops when regions are self-referential. 2018-07-01 16:14:26 +01:00
Niko Matsakis
f334a9e8dd
WIP boring() long line 2018-07-01 16:14:26 +01:00
David Wood
a11245f80e
Ensure that changed errors are lower case. 2018-07-01 16:14:25 +01:00
David Wood
e01e883e4f
Introduce new categories and show a reasonable error message. 2018-07-01 16:14:25 +01:00
David Wood
27ce0cca8e
Moved region inference error reporting into own module. 2018-07-01 16:14:21 +01:00
David Wood
58a723209d
Switched to while let in DFS and deriving Ord on ConstraintCategory. 2018-07-01 15:34:47 +01:00
David Wood
fd0806618c
Constraints are now being categorized, sorted and the error labelled. Categorization needs a bit of work. 2018-07-01 15:33:05 +01:00
David Wood
56274be4b5
Added bfs for constraint paths from regions. 2018-07-01 15:30:43 +01:00
Niko Matsakis
9e2157fdca
don't consider assignments to temporaries "interesting" 2018-07-01 15:30:43 +01:00
Niko Matsakis
0b620186fd
propagate boring vs interesting causal info for constraints/tests 2018-07-01 15:30:42 +01:00
Niko Matsakis
609bb27514
categorize Locations as interesting or boring 2018-07-01 15:27:15 +01:00
Niko Matsakis
dbeda5ee29
remove the at_location from Locations
We are not currently using it for anything; even polonius just uses
the `from_location`.
2018-07-01 15:27:10 +01:00
Niko Matsakis
73f8333e78 update mir-opt tests 2018-07-01 10:13:05 -04:00
Niko Matsakis
865320f6a4 remove the ins set altogether 2018-07-01 10:13:05 -04:00
Niko Matsakis
5ddda3f195
rename ToLocations to NormalizeLocation 2018-07-01 15:00:34 +01:00
bors
e100ce4f92 Auto merge of #51855 - Eh2406:i51821, r=nikomatsakis
A fix for 51821

This dedupe the vec of `OutlivesConstraint` using a `FxHashSet<(RegionVid, RegionVid)>` it alsow adds a `struct ConstraintSet` to encapsulate/ensure this behavere.
2018-07-01 10:41:51 +00:00
Niko Matsakis
ac5bd5dd2b remove the FxHashSet since it's not helping us in practice
It turns out that we don't have duplicates, just self-cycles.
2018-07-01 05:53:35 -04:00
Niko Matsakis
be0e77837a use WorkQueue to track dirty bits in liveness 2018-07-01 05:24:16 -04:00
bors
d94b804863 Auto merge of #51882 - varkor:check-type_dependent_defs, r=estebank
Always check type_dependent_defs

Directly indexing into `type_dependent_defs` has caused multiple ICEs in the past (https://github.com/rust-lang/rust/issues/46771, https://github.com/rust-lang/rust/issues/49241, etc.) and is almost certainly responsible for #51798 too. This PR ensures we always check `type_dependent_defs` first, which should prevent any more of these (or at least make them easier to track down).
2018-07-01 08:41:50 +00:00
bors
e953e4621e Auto merge of #51869 - nnethercote:rm-clone_from, r=nikomatsakis
Avoid needless allocations in `liveness_of_locals`.

We don't need to replace the heap-allocated bitset, we can just
overwrite its contents.

This speeds up most NLL benchmarks, the best by 1.5%.

r? @nikomatsakis
2018-07-01 04:23:29 +00:00
Alexander Regueiro
13b82ecf80 Minor refactoring. 2018-06-30 23:53:52 +01:00
Alexander Regueiro
a2cd95fd9e Fixed bug with miri const evaluation where allocation is recursively borrowed. 2018-06-30 23:52:33 +01:00
Alexander Regueiro
349d53c2a9 Added miri error for evaluating foreign statics.
Updated tests accordingly.
2018-06-30 23:52:33 +01:00
Alexander Regueiro
13931762e9 Loosened rules involving statics mentioning other statics.
Updated tests accordingly.
2018-06-30 23:52:33 +01:00
Wesley Wiser
faef6a30e6 Copy undef_masks correctly for repeated bytes 2018-06-30 15:20:10 -04:00
bors
74c89b0230 Auto merge of #51849 - nikomatsakis:issue-51820-places-conflict, r=eddyb
optimize `places_conflict` to avoid complex vectors etc

Fixes #51820
2018-06-30 18:55:09 +00:00
Wesley Wiser
84fe0c40a1 Fix relocations to include repeated values 2018-06-30 00:44:58 -04:00
Wesley Wiser
8f969ed376 Optimize copy_undef_mask() to use one pass
This saves 0.5 seconds on the test compilation.
2018-06-29 22:26:15 -04:00
Wesley Wiser
1ffa99d218 Optimize copy_undef_mask() by lifting some loop invariant operations
This saves 4.5 seconds and takes the compile time down to 5.5 seconds.
2018-06-29 20:22:35 -04:00
Vadim Petrochenkov
9f92fce77c Fortify dummy span checking 2018-06-30 01:53:32 +03:00
bors
ab8a67c12a Auto merge of #51729 - matthewjasper:move-errors, r=nikomatsakis
[NLL] Better move errors

Make a number of changes to improve the quality of NLL cannot move errors.

* Group errors that occur in the same `match` with the same cause.
* Suggest `ref`, `&` or removing `*` to avoid the move.
* Show the place being matched on.

Differences from AST borrowck:

* `&` is suggested over `ref` when matching on a place that can't be moved from.
* Removing `*` is suggested instead of adding `&` when applicable.
* Sub-pattern spans aren't used, this would probably need Spans on Places.

Closes #45699
Closes #46627
Closes #51187
Closes #51189

r? @pnkfelix
2018-06-29 12:40:12 +00:00
Nicholas Nethercote
08683f003c Rename IdxSet::clone_from.
The current situation is something of a mess.

- `IdxSetBuf` derefs to `IdxSet`.
- `IdxSetBuf` implements `Clone`, and therefore has a provided `clone_from`
  method, which does allocation and so is expensive.
- `IdxSet` has a `clone_from` method that is non-allocating and therefore
  cheap, but this method is not from the `Clone` trait.

As a result, if you have an `IdxSetBuf` called `b`, if you call
`b.clone_from(b2)` you'll get the expensive `IdxSetBuf` method, but if you call
`(*b).clone_from(b2)` you'll get the cheap `IdxSetBuf` method.
`liveness_of_locals()` does the former, presumably unintentionally, and
therefore does lots of unnecessary allocations.

Having a `clone_from` method that isn't from the `Clone` trait is a bad idea in
general, so this patch renames it as `overwrite`. This avoids the unnecessary
allocations in `liveness_of_locals()`, speeding up most NLL benchmarks, the
best by 1.5%. It also means that calls of the form `(*b).clone_from(b2)` can be
rewritten as `b.overwrite(b2)`.
2018-06-29 09:57:19 +10:00
Mark Rousskov
7b8fc87733
Rollup merge of #51839 - oli-obk:const_shift_overflow, r=nikomatsakis
Detect overflows of non u32 shifts
2018-06-28 16:07:14 -06:00
Mark Rousskov
57aceeecc0
Rollup merge of #51636 - oli-obk:const_diagnostics, r=eddyb
Refactor error reporting of constants

cc @eddyb

This PR should not change any behaviour. It solely simplifies the internal handling of the errors
2018-06-28 16:07:10 -06:00
varkor
4071adfcb5 Always check type_dependent_defs 2018-06-28 22:52:44 +01:00
bors
e3bf634e06 Auto merge of #51687 - japaric:gh51671, r=alexcrichton
translate / export weak lang items

see #51671 for details

fixes #51671
fixes #51342

r? @michaelwoerister or @alexcrichton
2018-06-28 15:34:17 +00:00
Eh2406
6e0cefe3db add comments 2018-06-28 10:18:35 -04:00
Eh2406
ad71cbfe66 use deref instead of inner 2018-06-28 10:18:33 -04:00
Eh2406
4b44db126e each_affected_by_dirty 2018-06-28 10:18:32 -04:00
Eh2406
9bd2a63f29 remove inner_mut as it can mess up invariants 2018-06-28 10:18:31 -04:00
Eh2406
497a3b4fd5 fix typo and tidy 2018-06-28 10:18:30 -04:00
Eh2406
e2c0378a63 move related types into the new module 2018-06-28 10:18:29 -04:00
Eh2406
e4f03682df use the type system to ensure we dedup from the start 2018-06-28 10:18:25 -04:00
Eh2406
0119669711 use retain to avoid the allocation 2018-06-28 10:15:37 -04:00