Commit graph

309 commits

Author SHA1 Message Date
Mazdak Farrokhzad
075e381b91 Bless mir-opt/while-storage.rs. 2019-07-06 06:43:58 +02:00
Matthew Jasper
b86e6755b9 Add StorageDead statements for while conditions 2019-06-25 22:41:22 +01:00
Matthew Jasper
101a2f59b4 Use as_temp to evaluate statement expressions 2019-06-25 22:41:22 +01:00
Matthew Jasper
89ea69ab23 Add a test for simple matches 2019-06-13 21:05:21 +01:00
Matthew Jasper
da22793a35 Create fewer basic blocks in match MIR lowering 2019-06-13 21:05:21 +01:00
Mazdak Farrokhzad
de6bc12868
Rollup merge of #61532 - wesleywiser:const_prop_more, r=oli-obk
[const-prop] Support Rvalue::{Ref,Len} and Deref

Also fixes an ICE I found in testing.

r? @oli-obk

~~The final commit is just for a perf run. I'll remove it after that is completed.~~
2019-06-07 16:48:03 +02:00
Matthew Jasper
6c9a018b60 Don't run MIR passes on constructor shims 2019-06-06 16:10:37 +01:00
Wesley Wiser
dee05ab2cc [const-prop] Handle Rvalue::Len 2019-06-06 08:31:54 -04:00
Wesley Wiser
1e50e01bb7 [const-prop] Handle ProjectionElem::Deref 2019-06-06 08:31:54 -04:00
Wesley Wiser
529b94ea6a [const-prop] Fix ICE when casting function pointers
This fixes an ICE when building libcore with `-Z mir-opt-level=3`.
2019-06-06 08:31:28 -04:00
Tyler Mandry
7718b14301 Test StorageDead statements explicitly 2019-06-05 15:10:19 -07:00
Christian Poveda
31ab573052 Add const-eval support for indirects 2019-06-03 23:53:46 -05:00
Oliver Scherer
90bb861b2e Fix tidy 2019-05-25 10:07:01 +02:00
Oliver Scherer
fec79d3552 Print generic args in function calls in MIR 2019-05-25 10:07:01 +02:00
Oliver Scherer
669bc77886 u8 is printed as a number, not a character 2019-05-25 10:07:01 +02:00
Oliver Scherer
9b5896ade3 Render const byte slices in MIR 2019-05-25 10:07:01 +02:00
Oliver Scherer
264c149c89 Add test showing how byte slices are printed in MIR 2019-05-25 10:07:01 +02:00
bors
85334c5092 Auto merge of #60174 - matthewjasper:add-match-arm-scopes, r=pnkfelix
Add match arm scopes and other scope fixes

* Add drop and lint scopes for match arms.
* Lint attributes are now respected on match arms.
* Make sure we emit a StorageDead if we diverge when initializing a temporary.
* Adjust MIR pretty printing of scopes for locals.
* Don't generate duplicate lint scopes for `let statements`.
* Add some previously missing fake borrows for matches.

closes #46525

cc @rust-lang/compiler
2019-05-23 04:48:21 +00:00
bors
1cc822c261 Auto merge of #60840 - tmandry:preserve-scope-in-generator-mir, r=cramertj
Preserve local scopes in generator MIR

Part of #52924, depended upon by the generator layout optimization #60187.

This PR adds `StorageDead` statements in more places in generators, so we can see when non-`Drop` locals have gone out of scope and recover their storage.

The reason this is only done for generators is compiler performance. See https://github.com/rust-lang/rust/pull/60187#issuecomment-485637811 for what happens when we do this for all functions.

For `Drop` locals, we modify the `MaybeStorageLive` analysis to use `drop` to indicate that storage is no longer live for the local. Once `drop` returns or unwinds to our function, we implicitly assume that the local is `StorageDead`.

Instead of using `drop`, it is possible to emit more `StorageDead` statements in the MIR for `Drop` locals so we can handle all locals the same. I am fine with doing it that way, but this was the simplest approach for my purposes. It is also likely to be more performant.

r? @Zoxc (feel free to reassign)
cc @cramertj @eddyb @RalfJung @rust-lang/wg-async-await
2019-05-22 04:42:20 +00:00
Matthew Jasper
2420d82a7c Add a test for match scopes 2019-05-21 19:37:38 +01:00
Matthew Jasper
abab9efbdb Schedule storage-dead of temporaries sooner
This ensures that we will correctly generate a storage-dead if the
initializing expression diverges.
2019-05-21 19:37:38 +01:00
Matthew Jasper
f506aea1fa Give match arms a drop/region scope
Also give arms the correct lint scope in MIR.
2019-05-21 19:37:38 +01:00
Matthew Jasper
af6a9a2c62 Handle the visibility/lint scope distinction better
* Don't generate an extra lint scope for each `let` statement.
* Place match guards inside the visiblility scope of the bindings for
  their arm.
2019-05-21 19:37:38 +01:00
Wesley Wiser
3f5c743b53 [const-prop] Support propagating into SwitchInt's discr Operand 2019-05-19 16:46:51 -04:00
Wesley Wiser
8e99c76089 [const-prop] Support propagating into Assert's cond Operand 2019-05-19 16:13:08 -04:00
bors
b982867a73 Auto merge of #60171 - matthewjasper:full-nll-compare-mode, r=pnkfelix
Use -Zborrowck=mir for NLL compare mode

closes #56993

r? @pnkfelix
2019-05-17 13:01:23 +00:00
Manish Goregaokar
e7f27947cf
Rollup merge of #60597 - wesleywiser:const_prop, r=oli-obk
Do some simple constant propagation in the ConstProp pass

r? @oli-obk

I added a few test cases. Let me know if you think there should be more.
2019-05-16 12:31:46 -07:00
Wesley Wiser
b17066dd5e Add test to ensure const-prop fails gracefully 2019-05-15 06:07:06 -04:00
Wesley Wiser
b1c4fb2c07 Add some tests for constant propagation
The results aren't ideal but they represent the current state.
2019-05-15 06:07:06 -04:00
Tyler Mandry
b789017403 Emit StorageDead for all locals in generators 2019-05-14 18:04:57 -07:00
Matthew Jasper
be5fe051a8 Remove feature(nll) when compare mode is sufficient 2019-05-12 18:46:43 +01:00
Mazdak Farrokhzad
99039689f0 Adjust mir-opt tests for new HIR without If 2019-05-10 19:41:10 +02:00
Mazdak Farrokhzad
62ab971bb7
Rollup merge of #59348 - matthewjasper:cleanup-drop-shims, r=arielb1
Clean up and add tests for slice drop shims

Adds a test for the MIR generated by `real_drop_in_place::<[T]>`. Also slightly reduces the number of statements and locals used in the shim.

r? @RalfJung
2019-05-09 23:56:08 +02:00
Vadim Petrochenkov
ee6d315200 cleanup: Remove DefIndexAddressSpace 2019-05-09 00:46:38 +03:00
Mazdak Farrokhzad
3cfd39bb2e
Rollup merge of #60516 - JohnTitor:remove-typeck, r=matthewjasper
Remove TypeckMir

Fixes #60422

r? @matthewjasper
2019-05-04 09:21:27 +02:00
bors
e232636693 Auto merge of #59897 - tmandry:variantful-generators, r=eddyb
Multi-variant layouts for generators

This allows generators to overlap fields using variants, but doesn't do any such overlapping yet. It creates one variant for every state of the generator (unresumed, returned, panicked, plus one for every yield), and puts every stored local in each of the yield-point variants.

Required for optimizing generator layouts (#52924).

There was quite a lot of refactoring needed for this change. I've done my best in later commits to eliminate assumptions in the code that only certain kinds of types are multi-variant, and to centralize knowledge of the inner mechanics of generators in as few places as possible.

This change also emits debuginfo about the fields contained in each variant, as well as preserving debuginfo about stored locals while running in the generator.

Also, fixes #59972.

Future work:
- Use this change for an optimization pass that actually overlaps locals within the generator struct (#52924)
- In the type layout fields, don't include locals that are uninitialized for a particular variant, so miri and UB sanitizers can check our memory (see https://github.com/rust-lang/rust/issues/59972#issuecomment-483058172)
- Preserve debuginfo scopes across generator yield points
2019-05-04 03:18:14 +00:00
Yuki Okushi
f734057c3c Fix test 2019-05-04 04:24:32 +09:00
Matthew Jasper
6fff547828 Slightly simplify the MIR for slice drop shims 2019-05-01 19:01:57 +01:00
Matthew Jasper
145add7ccf Add test for slice drop shims 2019-05-01 19:01:28 +01:00
Tyler Mandry
5a7af5480c Support variantful generators
This allows generators to overlap fields using variants.
2019-04-25 10:28:09 -07:00
Matthew Jasper
e9c687b04a Evaluate hair::ExprKind::Use in into
This avoids some unnecessary moves
2019-04-24 19:38:02 +01:00
Mazdak Farrokhzad
5f82b5b882
Rollup merge of #56278 - eddyb:mir-debuginfo-proof, r=nikomatsakis
Future-proof MIR for dedicated debuginfo.

This is #56231 without the last commit (the one that actually moves to `VarDebuginfo`).
Nothing should be broken, but it should no longer depend on debuginfo for anything else.

r? @nikomatsakis
2019-04-24 05:16:17 +02:00
Eduard-Mihai Burtescu
c3ca9a35be rustc_mir: create the let and "remainder" scopes in source order. 2019-04-23 23:35:21 +03:00
Eduard-Mihai Burtescu
9260305c9e rustc_mir: pretty-print all locals into their respective scopes. 2019-04-23 23:35:21 +03:00
Mazdak Farrokhzad
d1b2d6d64d
Rollup merge of #60169 - varkor:tidy-unnecessary-ignore-newline, r=kennytm
Warn when ignore-tidy-linelength is present, but no lines are too long

It's easy for a `// ignore-tidy-linelength` to be added when there is a genuine need to ignore a file's line length, but then after refactoring the need is gone, but the tidy directive is not removed. This means that in the future, further editing may accidentally add unnecessarily long lines. This change forces `// ignore-tidy-linelength` to be used exactly when necessary, to make sure such changes are intentional.
2019-04-23 21:50:57 +02:00
Mazdak Farrokhzad
62d1574876
Rollup merge of #59823 - davidtwco:issue-54716, r=cramertj
[wg-async-await] Drop `async fn` arguments in async block

Fixes #54716.

This PR modifies the HIR lowering (and some other places to make this work) so that unused arguments to a async function are always dropped inside the async move block and not at the end of the function body.

```
async fn foo(<pattern>: <type>) {
  async move {
  }
} // <-- dropped as you "exit" the fn

// ...becomes...
fn foo(__arg0: <ty>) {
  async move {
    let <pattern>: <ty> = __arg0;
  } // <-- dropped as you "exit" the async block
}
```

However, the exact ordering of drops is not the same as a regular function, [as visible in this playground example](https://play.rust-lang.org/?version=stable&mode=debug&edition=2015&gist=be39af1a58e5d430be1eb3c722cb1ec3) - I believe this to be an unrelated issue. There is a [Zulip topic](https://rust-lang.zulipchat.com/#narrow/stream/187312-t-compiler.2Fwg-async-await/topic/.2354716.20drop.20order) for this.

r? @cramertj
cc @nikomatsakis
2019-04-23 21:50:52 +02:00
varkor
62838975d0 Remove unnecessary ignore-tidy-linelength 2019-04-23 11:42:14 +01:00
Matthew Jasper
8eef102270 update tests for migrate mode by default 2019-04-22 08:40:08 +01:00
David Wood
7c6dc7a254
Move async fn arguments into closure.
This commit takes advantage of `AsyncArgument` type that was added in a
previous commit to replace the arguments of the `async fn` in the HIR
and add statements to move the bindings from the new arguments to the
pattern from the old argument.

For example, the async function `foo` below:

    async fn foo((x, _y): (T, V)) {
        async move {
        }
    }

becomes:

    async fn foo(__arg0: (T, V)) {
        async move {
            let (x, _y) = __arg0;
        }
    }
2019-04-21 16:46:32 +01:00
bors
72bc62047f Auto merge of #59987 - saleemjaffer:refactor_adjust_castkinds, r=oli-obk
Refactor Adjust and CastKind

fixes rust-lang#59588
2019-04-20 15:06:15 +00:00