rust/src/test/run-pass/issue-41696.rs
Ariel Ben-Yehuda 0b93798959 mark calls in the unwind path as !noinline
The unwind path is always cold, so that should not have bad performance
implications.  This avoids catastrophic exponential inlining, and also
decreases the size of librustc.so by 1.5% (OTOH, the size of `libstd.so`
increased by 0.5% for some reason).

Fixes #41696.
2017-06-20 22:02:49 +03:00

60 lines
2.1 KiB
Rust

// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
// this used to cause exponential code-size blowup during LLVM passes.
#![feature(test)]
extern crate test;
struct MayUnwind;
impl Drop for MayUnwind {
fn drop(&mut self) {
if test::black_box(false) {
panic!()
}
}
}
struct DS<U> {
may_unwind: MayUnwind,
name: String,
next: U,
}
fn add<U>(ds: DS<U>, name: String) -> DS<DS<U>> {
DS {
may_unwind: MayUnwind,
name: "?".to_owned(),
next: ds,
}
}
fn main() {
let deserializers = DS { may_unwind: MayUnwind, name: "?".to_owned(), next: () };
let deserializers = add(deserializers, "?".to_owned());
let deserializers = add(deserializers, "?".to_owned());
let deserializers = add(deserializers, "?".to_owned());
let deserializers = add(deserializers, "?".to_owned());
let deserializers = add(deserializers, "?".to_owned());
let deserializers = add(deserializers, "?".to_owned());
let deserializers = add(deserializers, "?".to_owned()); // 0.7s
let deserializers = add(deserializers, "?".to_owned()); // 1.3s
let deserializers = add(deserializers, "?".to_owned()); // 2.4s
let deserializers = add(deserializers, "?".to_owned()); // 6.7s
let deserializers = add(deserializers, "?".to_owned()); // 26.0s
let deserializers = add(deserializers, "?".to_owned()); // 114.0s
let deserializers = add(deserializers, "?".to_owned()); // 228.0s
let deserializers = add(deserializers, "?".to_owned()); // 400.0s
let deserializers = add(deserializers, "?".to_owned()); // 800.0s
let deserializers = add(deserializers, "?".to_owned()); // 1600.0s
let deserializers = add(deserializers, "?".to_owned()); // 3200.0s
}