Rollup merge of #34307 - nagisa:more-cache, r=arielb1
[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 |
Showing
想要评论请 注册 或 登录