rust/compiler/rustc_data_structures/src
bors 6d3acf5129 Auto merge of #76928 - lcnr:opaque-types-cache, r=tmandry
cache types during normalization

partially fixes #75992

reduces the following test from 14 to 3 seconds locally.

cc `@Mark-Simulacrum` would it make sense to add that test to `perf`?
```rust
#![recursion_limit="2048"]
#![type_length_limit="112457564"]

pub async fn h0(v: &String, x: &u64) { println!("{} {}", v, x) }
pub async fn h1(v: &String, x: &u64) { h0(v, x).await }
pub async fn h2(v: &String, x: &u64) { h1(v, x).await }
pub async fn h3(v: &String, x: &u64) { h2(v, x).await }
pub async fn h4(v: &String, x: &u64) { h3(v, x).await }
pub async fn h5(v: &String, x: &u64) { h4(v, x).await }
pub async fn h6(v: &String, x: &u64) { h5(v, x).await }
pub async fn h7(v: &String, x: &u64) { h6(v, x).await }
pub async fn h8(v: &String, x: &u64) { h7(v, x).await }
pub async fn h9(v: &String, x: &u64) { h8(v, x).await }

pub async fn h10(v: &String, x: &u64) { h9(v, x).await }
pub async fn h11(v: &String, x: &u64) { h10(v, x).await }
pub async fn h12(v: &String, x: &u64) { h11(v, x).await }
pub async fn h13(v: &String, x: &u64) { h12(v, x).await }
pub async fn h14(v: &String, x: &u64) { h13(v, x).await }
pub async fn h15(v: &String, x: &u64) { h14(v, x).await }
pub async fn h16(v: &String, x: &u64) { h15(v, x).await }
pub async fn h17(v: &String, x: &u64) { h16(v, x).await }
pub async fn h18(v: &String, x: &u64) { h17(v, x).await }
pub async fn h19(v: &String, x: &u64) { h18(v, x).await }

macro_rules! async_recursive {
    (29, $inner:expr) => { async { async_recursive!(28, $inner) }.await };
    (28, $inner:expr) => { async { async_recursive!(27, $inner) }.await };
    (27, $inner:expr) => { async { async_recursive!(26, $inner) }.await };
    (26, $inner:expr) => { async { async_recursive!(25, $inner) }.await };
    (25, $inner:expr) => { async { async_recursive!(24, $inner) }.await };
    (24, $inner:expr) => { async { async_recursive!(23, $inner) }.await };
    (23, $inner:expr) => { async { async_recursive!(22, $inner) }.await };
    (22, $inner:expr) => { async { async_recursive!(21, $inner) }.await };
    (21, $inner:expr) => { async { async_recursive!(20, $inner) }.await };
    (20, $inner:expr) => { async { async_recursive!(19, $inner) }.await };

    (19, $inner:expr) => { async { async_recursive!(18, $inner) }.await };
    (18, $inner:expr) => { async { async_recursive!(17, $inner) }.await };
    (17, $inner:expr) => { async { async_recursive!(16, $inner) }.await };
    (16, $inner:expr) => { async { async_recursive!(15, $inner) }.await };
    (15, $inner:expr) => { async { async_recursive!(14, $inner) }.await };
    (14, $inner:expr) => { async { async_recursive!(13, $inner) }.await };
    (13, $inner:expr) => { async { async_recursive!(12, $inner) }.await };
    (12, $inner:expr) => { async { async_recursive!(11, $inner) }.await };
    (11, $inner:expr) => { async { async_recursive!(10, $inner) }.await };
    (10, $inner:expr) => { async { async_recursive!(9, $inner) }.await };

    (9, $inner:expr) => { async { async_recursive!(8, $inner) }.await };
    (8, $inner:expr) => { async { async_recursive!(7, $inner) }.await };
    (7, $inner:expr) => { async { async_recursive!(6, $inner) }.await };
    (6, $inner:expr) => { async { async_recursive!(5, $inner) }.await };
    (5, $inner:expr) => { async { async_recursive!(4, $inner) }.await };
    (4, $inner:expr) => { async { async_recursive!(3, $inner) }.await };
    (3, $inner:expr) => { async { async_recursive!(2, $inner) }.await };
    (2, $inner:expr) => { async { async_recursive!(1, $inner) }.await };
    (1, $inner:expr) => { async { async_recursive!(0, $inner) }.await };
    (0, $inner:expr) => { async { h19(&String::from("owo"), &0).await; $inner }.await };
}

async fn f() {
    async_recursive!(14, println!("hello"));
}

fn main() {
    let _ = f();
}
```
r? `@eddyb` requires a perf run.
2020-09-22 22:52:07 +00:00
..
base_n mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
binary_search_util mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
graph Add BREAK too, and improve the comments 2020-09-04 16:28:23 -07:00
obligation_forest mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
owning_ref mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
sip128 mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
small_c_str mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
snapshot_map mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
sorted_map mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
tagged_ptr Use T::BITS instead of size_of::<T> * 8. 2020-09-19 06:54:42 +02:00
tiny_list mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
transitive_relation mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
atomic_ref.rs mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
base_n.rs mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
box_region.rs mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
captures.rs mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
const_cstr.rs mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
fingerprint.rs Avoid rehashing Fingerprint as a map key 2020-09-01 18:27:02 -07:00
flock.rs mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
frozen.rs mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
fx.rs mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
jobserver.rs datastructures: replace lazy_static by SyncLazy from std 2020-09-01 22:06:47 +01:00
lib.rs Auto merge of #76928 - lcnr:opaque-types-cache, r=tmandry 2020-09-22 22:52:07 +00:00
macros.rs Remove unused static_assert macro 2020-09-20 11:40:51 +02:00
map_in_place.rs mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
mini_map.rs cache types during normalization 2020-09-19 17:27:13 +02:00
profiling.rs Use as_secs_f64 in profiling.rs 2020-09-20 10:27:14 +02:00
ptr_key.rs mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
sharded.rs mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
sip128.rs mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
small_c_str.rs mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
sorted_map.rs use array_windows instead of windows in the compiler 2020-09-20 08:11:05 +02:00
stable_hasher.rs mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
stable_map.rs mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
stable_set.rs mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
stack.rs mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
svh.rs mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
sync.rs datastructures: replace once_cell crate with an impl from std 2020-08-30 20:06:14 +01:00
tagged_ptr.rs mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
temp_dir.rs Capitalize safety comments 2020-09-08 22:37:18 -04:00
thin_vec.rs mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
tiny_list.rs mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
transitive_relation.rs mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
unhash.rs Avoid rehashing Fingerprint as a map key 2020-09-01 18:27:02 -07:00
vec_linked_list.rs mv compiler to compiler/ 2020-08-30 18:45:07 +03:00
work_queue.rs mv compiler to compiler/ 2020-08-30 18:45:07 +03:00