522 Commits

Author SHA1 Message Date
Ariel Ben-Yehuda
485476c25a add a pass to remove no-op landing pads 2017-12-03 02:47:44 +02:00
Eduard-Mihai Burtescu
473f044225 MIR: s/lv(al(ue)?)?/place in function/variable/module names. 2017-12-01 18:48:57 +02:00
Eduard-Mihai Burtescu
511743c438 MIR: s/Lvalue/Place in type names. 2017-12-01 18:47:36 +02:00
bors
4fa202d23b Auto merge of #46299 - michaelwoerister:incr-comp-krimskrams, r=nikomatsakis
incr.comp.: Some preparatory work for caching more query results.

This PR
* adds and updates some encoding/decoding routines for various query result types so they can be cached later, and
* adds missing `[input]` annotations for a few `DepNode` variants.

The situation around having to explicitly mark dep-nodes/queries as inputs is not really satisfactory. I hope we can find a way of making this more fool-proof in the future.

r? @nikomatsakis
2017-11-30 10:57:21 +00:00
bors
d6b010f98b Auto merge of #46226 - arielb1:special-region-obligation, r=nikomatsakis
avoid type-live-for-region obligations on dummy nodes

Type-live-for-region obligations on DUMMY_NODE_ID cause an ICE, and it
turns out that in the few cases they are needed, these obligations are not
needed anyway because they are verified elsewhere.

Fixes #46069.

Beta-nominating because this is a regression for our new beta.
r? @nikomatsakis
2017-11-30 08:00:27 +00:00
Michael Woerister
687e099b44 incr.comp.: Make a bunch of query results encodable. 2017-11-28 13:03:39 +01:00
Michael Woerister
8fbc91cfe1 incr.comp.: Make MIR encoding fit for incr.comp. caching. 2017-11-28 12:44:45 +01:00
Eduard-Mihai Burtescu
170b88dc79 rustc_mir: require that Copy(L) satisfies typeof L: Copy. 2017-11-28 04:18:32 +02:00
Eduard-Mihai Burtescu
c42a118188 MIR: split Operand::Consume into Copy and Move. 2017-11-28 04:18:32 +02:00
Eduard-Mihai Burtescu
73f5bab33f rustc_mir: enforce that arguments are replaced with Local's only. 2017-11-28 04:11:09 +02:00
Ariel Ben-Yehuda
f3b2d7f3a7 improve error messages 2017-11-26 19:01:19 +02:00
Ariel Ben-Yehuda
617b413e18 limit packed copy-out to non-generic Copy structs 2017-11-26 16:12:43 +02:00
Ariel Ben-Yehuda
1a2d443f55 make accessing packed fields a future-compat warning 2017-11-26 16:12:42 +02:00
Ariel Ben-Yehuda
06eb5a6645 fix codegen of drops of fields of packed structs 2017-11-26 16:12:42 +02:00
Ariel Ben-Yehuda
bdb72edb5c make accesses to fields of packed structs unsafe
To handle packed structs with destructors (which you'll think are a rare
case, but the `#[repr(packed)] struct Packed<T>(T);` pattern is
ever-popular, which requires handling packed structs with destructors to
avoid monomorphization-time errors), drops of subfields of packed
structs should drop a local move of the field instead of the original
one.

cc #27060 - this should deal with that issue after codegen of drop glue
is updated.

The new errors need to be changed to future-compatibility warnings, but
I'll rather do a crater run first with them as errors to assess the
impact.
2017-11-26 16:12:42 +02:00
Ariel Ben-Yehuda
d049e5d19e avoid type-live-for-region obligations on dummy nodes
Type-live-for-region obligations on DUMMY_NODE_ID cause an ICE, and it
turns out that in the few cases they are needed, these obligations are not
needed anyway because they are verified elsewhere.

Fixes #46069.
2017-11-25 22:57:59 +02:00
Scott McMurray
62391c8c86 InstCombine Len([_; N]) => const N in MIR 2017-11-25 11:59:16 -08:00
bors
5f44c653cf Auto merge of #46093 - scottmcm:lower-128-mir, r=nagisa
Add a MIR pass to lower 128-bit operators to lang item calls

Runs only with `-Z lower_128bit_ops` since it's not hooked into targets yet.

This isn't really useful on its own, but the declarations for the lang items need to be in the compiler before compiler-builtins can be updated to define them, so this is part 1 of at least 3.

cc https://github.com/rust-lang/rust/issues/45676 @est31 @nagisa
2017-11-24 15:11:11 +00:00
Niko Matsakis
c52e51dfb7 normalize types in ADT constructor
Fixes #45940
2017-11-22 03:51:56 -05:00
Niko Matsakis
10b8faccd0 handle the active field index in unions 2017-11-22 03:51:55 -05:00
Niko Matsakis
b3a10db03e avoid early return 2017-11-22 03:51:55 -05:00
Niko Matsakis
b588edc413 only normalize operand types when in an ADT constructor 2017-11-22 03:51:55 -05:00
Paul Daniel Faria
527a5dd251 Normalize LvalueTy for ops and format code to satisfy tidy check 2017-11-22 03:51:55 -05:00
Paul Daniel Faria
47c6db09ee Remove attributes and test comments accidentally left behind, add in span_mirbugs 2017-11-22 03:51:54 -05:00
Paul Daniel Faria
19c17360d9 Check rvalue aggregates during check_stmt in tycheck, add initial, (not passing) test 2017-11-22 03:51:54 -05:00
bors
d6d09e0b4d Auto merge of #45879 - nikomatsakis:nll-kill-cyclic-closures, r=arielb1
move closure kind, signature into `ClosureSubsts`

Instead of using side-tables, store the closure-kind and signature in the substitutions themselves. This has two key effects:

- It means that the closure's type changes as inference finds out more things, which is very nice.
    - As a result, it avoids the need for the `freshen_closure_like` code (though we still use it for generators).
- It avoids cyclic closures calls.
    - These were never meant to be supported, precisely because they make a lot of the fancy inference that we do much more complicated. However, due to an oversight, it was previously possible -- if challenging -- to create a setup where a closure *directly* called itself (see e.g. #21410).

We have to see what the effect of this change is, though. Needs a crater run. Marking as [WIP] until that has been assessed.

r? @arielb1
2017-11-21 22:52:19 +00:00
Scott McMurray
42208c1227 Handle shifts properly
* The overflow-checking shift items need to take a full 128-bit type, since they need to be able to detect idiocy like `1i128 << (1u128 << 127)`
* The unchecked ones just take u32, like the `*_sh?` methods in core
* Because shift-by-anything is allowed, cast into a new local for every shift
2017-11-20 01:54:43 -08:00
Scott McMurray
6a5a086fd6 Add type checking for the lang item
As part of doing so, add more lang items instead of passing u128 to the i128 ones where it doesn't matter in twos-complement.
2017-11-20 00:04:54 -08:00
bors
f50fd075c2 Auto merge of #45225 - eddyb:trans-abi, r=arielb1
Refactor type memory layouts and ABIs, to be more general and easier to optimize.

To combat combinatorial explosion, type layouts are now described through 3 orthogonal properties:
* `Variants` describes the plurality of sum types (where applicable)
  * `Single` is for one inhabited/active variant, including all C `struct`s and `union`s
  * `Tagged` has its variants discriminated by an integer tag, including C `enum`s
  * `NicheFilling` uses otherwise-invalid values ("niches") for all but one of its inhabited variants
* `FieldPlacement` describes the number and memory offsets of fields (if any)
  * `Union` has all its fields at offset `0`
  * `Array` has offsets that are a multiple of its `stride`; guarantees all fields have one type
  * `Arbitrary` records all the field offsets, which can be out-of-order
* `Abi` describes how values of the type should be passed around, including for FFI
  * `Uninhabited` corresponds to no values, associated with unreachable control-flow
  * `Scalar` is ABI-identical to its only integer/floating-point/pointer "scalar component"
  * `ScalarPair` has two "scalar components", but only applies to the Rust ABI
  * `Vector` is for SIMD vectors, typically `#[repr(simd)]` `struct`s in Rust
  * `Aggregate` has arbitrary contents, including all non-transparent C `struct`s and `union`s

Size optimizations implemented so far:
* ignoring uninhabited variants (i.e. containing uninhabited fields), e.g.:
  * `Option<!>` is 0 bytes
  * `Result<T, !>` has the same size as `T`
* using arbitrary niches, not just `0`, to represent a data-less variant, e.g.:
  * `Option<bool>`, `Option<Option<bool>>`, `Option<Ordering>` are all 1 byte
  * `Option<char>` is 4 bytes
* using a range of niches to represent *multiple* data-less variants, e.g.:
  * `enum E { A(bool), B, C, D }` is 1 byte

Code generation now takes advantage of `Scalar` and `ScalarPair` to, in more cases, pass around scalar components as immediates instead of indirectly, through pointers into temporary memory, while avoiding LLVM's "first-class aggregates", and there's more untapped potential here.

Closes #44426, fixes #5977, fixes #14540, fixes #43278.
2017-11-19 22:12:22 +00:00
Niko Matsakis
df6fdbc9ae fix closure inlining by spilling arguments to a temporary 2017-11-19 05:36:56 -05:00
Scott McMurray
57c0801e33 Add a MIR pass to lower 128-bit operators to lang item calls
Runs only with `-Z lower_128bit_ops` since it's not hooked into targets yet.
2017-11-18 21:51:14 -08:00
Eduard-Mihai Burtescu
b28f668e26 rustc: move size, align & primitive_align from Abi::Aggregate to layout. 2017-11-19 02:14:32 +02:00
Eduard-Mihai Burtescu
8c4d5af52b rustc: remove Ty::layout and move everything to layout_of. 2017-11-19 02:14:29 +02:00
Eduard-Mihai Burtescu
9deea47c96 rustc_mir: always downcast enums, even if univariant. 2017-11-18 20:52:38 +02:00
Niko Matsakis
22c0cbfa86 remove generator_interiors map 2017-11-18 11:26:46 -05:00
loomaclin
0b508846ec Remove return_ty from Mir
https://github.com/rust-lang/rust/issues/46001
2017-11-18 10:27:24 +03:00
bors
d0f8e2913a Auto merge of #45825 - nikomatsakis:nll-factor-region-inference, r=arielb1
integrate MIR type-checker with NLL inference

This branch refactors NLL type inference so that it uses the MIR type-checker to gather constraints. Along the way, it also refactors how region constraints are gathered in the normal inference context mildly. The new setup is like this:

- What used to be `region_inference` is split into two parts:
    - `region_constraints`, which just collects up sets of constraints
    - `lexical_region_resolve`, which does the iterative, lexical region resolution
- When `resolve_regions_and_report_errors` is invoked, the inference engine converts the constraints into final values.
- In the MIR type checker, however, we do not invoke this method, but instead periodically take the region constraints and package them up for the NLL solver to use later.
    - This allows us to track when and where those constraints were incurred.
    - We also remove the central fulfillment context from the MIR type checker, instead instantiating new fulfillment contexts at each point. This allows us to capture the set of obligations that occurred at a particular point, and also to ensure that if the same obligation arises at two points, we will enforce the region constraints at both locations.
- The MIR type checker is also enhanced to instantiate late-bound-regions with fresh variables and handle a few other corner cases that arose.
- I also extracted some of the 'outlives' logic from the regionck, which will be needed later (see future work) to handle the type-outlives relationships.

One concern I have with this branch: since the MIR type checker is used even without the `-Znll` switch, I'm not sure if it will impact performance. One simple fix here would be to only enable the MIR type-checker if debug-assertions are enabled, since it just serves to validate the MIR. Longer term I hope to address this by improving the interface to the trait solver to be more query-based (ongoing work).

There is plenty of future work left. Here are two things that leap to mind:

- **Type-region outlives.** Currently, the NLL solver will ICE if it is required to handle a constraint like `T: 'a`. Fixing this will require a small amount of refactoring to extract the implied bounds code. I plan to follow a file-up bug on this (hopefully with mentoring instructions).
- **Testing.** It's a good idea to enumerate some of the tricky scenarios that need testing, but I think it'd be nice to try and parallelize some of the actual test writing (and resulting bug fixing):
    - Same obligation occurring at two points.
    - Well-formedness and trait obligations of various kinds (which are not all processed by the current MIR type-checker).
    - More tests for how subtyping and region inferencing interact.
    - More suggestions welcome!

r? @arielb1
2017-11-16 20:56:26 +00:00
Niko Matsakis
a94d2a6b88 Nit: fix typo 2017-11-16 05:58:13 -05:00
Niko Matsakis
4b743da596 integrate NLL with MIR type-checker 2017-11-16 05:57:47 -05:00
Niko Matsakis
d9e841e756 region_infer: improved debug logging 2017-11-16 05:57:47 -05:00
Niko Matsakis
32f964cc98 renumber: debug logs, use visit_region rather than visit_rvalue 2017-11-16 05:57:47 -05:00
Niko Matsakis
12534e9159 renumber: handle ReturnTy better 2017-11-16 05:57:47 -05:00
Niko Matsakis
51ce1f9493 formalize giving ownership of region vars to region inf. context 2017-11-16 05:57:46 -05:00
Niko Matsakis
109c9a79ed infer: extract total number of region variables from infcx
We are heading towards deeper integration with the region inference
system in infcx; in particular, prior to the creation of the
`RegionInferenceContext`, it will be the "owner" of the set of region
variables.
2017-11-16 05:57:46 -05:00
Niko Matsakis
72675d82d7 replace RegionIndex with RegionVid (which now impls Idx) 2017-11-16 05:57:45 -05:00
Niko Matsakis
89c1b6009b replace usize with RegionIndex in indices map 2017-11-16 05:57:45 -05:00
Niko Matsakis
ad93b695d1 MIR typeck: refactor to track region constraints 2017-11-16 05:57:45 -05:00
Niko Matsakis
37945fe3e8 MIR typeck: rustfmt 2017-11-16 05:57:44 -05:00
Niko Matsakis
ef5de07fc5 fix rename to block_data in type_check.rs 2017-11-16 05:57:34 -05:00
bors
edd9dbcdbb Auto merge of #45985 - arielb1:unsafe-dedup, r=eddyb
check_unsafety: fix unused unsafe block duplication

The duplicate error message is later removed by error message
deduplication, but it still appears on beta and is still a bug.

r? @eddyb
2017-11-16 08:31:59 +00:00