Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

benchmarks #13

Merged
merged 4 commits into from
May 30, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions benches/fibonacci.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
#![feature(custom_attribute, test)]
#![feature(rustc_private)]
#![allow(unused_attributes)]

extern crate test;
use test::Bencher;

mod fibonacci_helper;

#[bench]
fn fib(bencher: &mut Bencher) {
bencher.iter(|| {
fibonacci_helper::main();
})
}

mod miri_helper;

#[bench]
fn fib_miri(bencher: &mut Bencher) {
miri_helper::run("fibonacci_helper", bencher);
}

mod fibonacci_helper_iterative;

#[bench]
fn fib_iter(bencher: &mut Bencher) {
bencher.iter(|| {
fibonacci_helper_iterative::main();
})
}

#[bench]
fn fib_iter_miri(bencher: &mut Bencher) {
miri_helper::run("fibonacci_helper_iterative", bencher);
}
16 changes: 16 additions & 0 deletions benches/fibonacci_helper.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
#![feature(custom_attribute)]
#![allow(unused_attributes)]

#[miri_run]
#[inline(never)]
pub fn main() {
assert_eq!(fib(10), 55);
}

fn fib(n: usize) -> usize {
if n <= 2 {
1
} else {
fib(n - 1) + fib(n - 2)
}
}
19 changes: 19 additions & 0 deletions benches/fibonacci_helper_iterative.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#![feature(custom_attribute)]
#![allow(unused_attributes)]

#[miri_run]
#[inline(never)]
pub fn main() {
assert_eq!(fib(10), 55);
}

fn fib(n: usize) -> usize {
let mut a = 0;
let mut b = 1;
for _ in 0..n {
let c = a;
a = b;
b = c + b;
}
a
}
47 changes: 47 additions & 0 deletions benches/miri_helper.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
#![feature(custom_attribute, test)]
#![feature(rustc_private)]
#![allow(unused_attributes)]

extern crate getopts;
extern crate miri;
extern crate rustc;
extern crate rustc_driver;
extern crate test;

use self::miri::interpreter;
use self::rustc::session::Session;
use self::rustc_driver::{driver, CompilerCalls};
use std::cell::RefCell;
use std::rc::Rc;
use std::env::var;
use test::Bencher;

pub struct MiriCompilerCalls<'a>(Rc<RefCell<&'a mut Bencher>>);

pub fn run(filename: &str, bencher: &mut Bencher) {
let path = var("RUST_SYSROOT").expect("env variable `RUST_SYSROOT` not set");
rustc_driver::run_compiler(&[
"miri".to_string(), format!("benches/{}.rs", filename), "--sysroot".to_string(), path.to_string(),
], &mut MiriCompilerCalls(Rc::new(RefCell::new(bencher))));
}

impl<'a> CompilerCalls<'a> for MiriCompilerCalls<'a> {
fn build_controller(
&mut self,
_: &Session,
_: &getopts::Matches
) -> driver::CompileController<'a> {
let mut control: driver::CompileController<'a> = driver::CompileController::basic();

let bencher = self.0.clone();

control.after_analysis.callback = Box::new(move |state| {
state.session.abort_if_errors();
bencher.borrow_mut().iter(|| {
interpreter::interpret_start_points(state.tcx.unwrap(), state.mir_map.unwrap());
})
});

control
}
}
41 changes: 41 additions & 0 deletions benches/smoke.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
#![feature(custom_attribute, test)]
#![feature(rustc_private)]
#![allow(unused_attributes)]

extern crate test;
use test::Bencher;

mod smoke_helper;

#[bench]
fn noop(bencher: &mut Bencher) {
bencher.iter(|| {
smoke_helper::main();
})
}

/*
// really slow
#[bench]
fn noop_miri_full(bencher: &mut Bencher) {
let path = std::env::var("RUST_SYSROOT").expect("env variable `RUST_SYSROOT` not set");
bencher.iter(|| {
let mut process = std::process::Command::new("target/release/miri");
process.arg("benches/smoke_helper.rs")
.arg("--sysroot").arg(&path);
let output = process.output().unwrap();
if !output.status.success() {
println!("{}", String::from_utf8(output.stdout).unwrap());
println!("{}", String::from_utf8(output.stderr).unwrap());
panic!("failed to run miri");
}
})
}
*/

mod miri_helper;

#[bench]
fn noop_miri_interpreter(bencher: &mut Bencher) {
miri_helper::run("smoke_helper", bencher);
}
7 changes: 7 additions & 0 deletions benches/smoke_helper.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#![feature(custom_attribute)]
#![allow(unused_attributes)]

#[miri_run]
#[inline(never)]
pub fn main() {
}
14 changes: 10 additions & 4 deletions src/interpreter.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1365,7 +1365,7 @@ impl<'mir, 'tcx: 'mir> Deref for CachedMir<'mir, 'tcx> {
fn deref(&self) -> &mir::Mir<'tcx> {
match *self {
CachedMir::Ref(r) => r,
CachedMir::Owned(ref rc) => &rc,
CachedMir::Owned(ref rc) => rc,
}
}
}
Expand Down Expand Up @@ -1422,20 +1422,26 @@ pub fn interpret_start_points<'a, 'tcx>(
if attr.check_name("miri_run") {
let item = tcx.map.expect_item(id);

println!("Interpreting: {}", item.name);
if TRACE_EXECUTION {
println!("Interpreting: {}", item.name);
}

let mut gecx = GlobalEvalContext::new(tcx, mir_map);
let mut fecx = FnEvalContext::new(&mut gecx);
match fecx.call_nested(mir) {
Ok(Some(return_ptr)) => fecx.memory.dump(return_ptr.alloc_id),
Ok(Some(return_ptr)) => if TRACE_EXECUTION {
fecx.memory.dump(return_ptr.alloc_id);
},
Ok(None) => println!("(diverging function returned)"),
Err(_e) => {
// TODO(solson): Detect whether the error was already reported or not.
// tcx.sess.err(&e.to_string());
}
}

println!("");
if TRACE_EXECUTION {
println!("");
}
}
}
}
Expand Down