Convert more tests to FuncCursor.

This commit is contained in:
Jakob Stoklund Olesen
2017-09-21 13:29:45 -07:00
parent 8e93aa7ce7
commit 218959ff65
2 changed files with 39 additions and 40 deletions

View File

@@ -214,53 +214,52 @@ impl<'f> InstBuilderBase<'f> for ReplaceBuilder<'f> {
#[cfg(test)]
mod tests {
use ir::{Function, Cursor, CursorBase, InstBuilder, ValueDef};
use cursor::{Cursor, FuncCursor};
use ir::{Function, InstBuilder, ValueDef};
use ir::types::*;
use ir::condcodes::*;
#[test]
fn types() {
let mut func = Function::new();
let dfg = &mut func.dfg;
let ebb0 = dfg.make_ebb();
let arg0 = dfg.append_ebb_arg(ebb0, I32);
let pos = &mut Cursor::new(&mut func.layout);
let ebb0 = func.dfg.make_ebb();
let arg0 = func.dfg.append_ebb_arg(ebb0, I32);
let mut pos = FuncCursor::new(&mut func);
pos.insert_ebb(ebb0);
// Explicit types.
let v0 = dfg.ins(pos).iconst(I32, 3);
assert_eq!(dfg.value_type(v0), I32);
let v0 = pos.ins().iconst(I32, 3);
assert_eq!(pos.func.dfg.value_type(v0), I32);
// Inferred from inputs.
let v1 = dfg.ins(pos).iadd(arg0, v0);
assert_eq!(dfg.value_type(v1), I32);
let v1 = pos.ins().iadd(arg0, v0);
assert_eq!(pos.func.dfg.value_type(v1), I32);
// Formula.
let cmp = dfg.ins(pos).icmp(IntCC::Equal, arg0, v0);
assert_eq!(dfg.value_type(cmp), B1);
let cmp = pos.ins().icmp(IntCC::Equal, arg0, v0);
assert_eq!(pos.func.dfg.value_type(cmp), B1);
}
#[test]
fn reuse_results() {
let mut func = Function::new();
let dfg = &mut func.dfg;
let ebb0 = dfg.make_ebb();
let arg0 = dfg.append_ebb_arg(ebb0, I32);
let pos = &mut Cursor::new(&mut func.layout);
let ebb0 = func.dfg.make_ebb();
let arg0 = func.dfg.append_ebb_arg(ebb0, I32);
let mut pos = FuncCursor::new(&mut func);
pos.insert_ebb(ebb0);
let v0 = dfg.ins(pos).iadd_imm(arg0, 17);
assert_eq!(dfg.value_type(v0), I32);
let v0 = pos.ins().iadd_imm(arg0, 17);
assert_eq!(pos.func.dfg.value_type(v0), I32);
let iadd = pos.prev_inst().unwrap();
assert_eq!(dfg.value_def(v0), ValueDef::Res(iadd, 0));
assert_eq!(pos.func.dfg.value_def(v0), ValueDef::Res(iadd, 0));
// Detach v0 and reuse it for a different instruction.
dfg.clear_results(iadd);
let v0b = dfg.ins(pos).with_result(v0).iconst(I32, 3);
pos.func.dfg.clear_results(iadd);
let v0b = pos.ins().with_result(v0).iconst(I32, 3);
assert_eq!(v0, v0b);
assert_eq!(pos.current_inst(), Some(iadd));
let iconst = pos.prev_inst().unwrap();
assert!(iadd != iconst);
assert_eq!(dfg.value_def(v0), ValueDef::Res(iconst, 0));
assert_eq!(pos.func.dfg.value_def(v0), ValueDef::Res(iconst, 0));
}
}

View File

@@ -897,8 +897,9 @@ impl<'a> fmt::Display for DisplayInst<'a> {
#[cfg(test)]
mod tests {
use super::*;
use cursor::{Cursor, FuncCursor};
use ir::types;
use ir::{Function, Cursor, CursorBase, Opcode, InstructionData, TrapCode};
use ir::{Function, Opcode, InstructionData, TrapCode};
#[test]
fn make_inst() {
@@ -1056,41 +1057,40 @@ mod tests {
use ir::condcodes::IntCC;
let mut func = Function::new();
let dfg = &mut func.dfg;
let ebb0 = dfg.make_ebb();
let pos = &mut Cursor::new(&mut func.layout);
let ebb0 = func.dfg.make_ebb();
let mut pos = FuncCursor::new(&mut func);
pos.insert_ebb(ebb0);
// Build a little test program.
let v1 = dfg.ins(pos).iconst(types::I32, 42);
let v1 = pos.ins().iconst(types::I32, 42);
// Make sure we can resolve value aliases even when values is empty.
assert_eq!(dfg.resolve_aliases(v1), v1);
assert_eq!(pos.func.dfg.resolve_aliases(v1), v1);
let arg0 = dfg.append_ebb_arg(ebb0, types::I32);
let (s, c) = dfg.ins(pos).iadd_cout(v1, arg0);
let iadd = match dfg.value_def(s) {
let arg0 = pos.func.dfg.append_ebb_arg(ebb0, types::I32);
let (s, c) = pos.ins().iadd_cout(v1, arg0);
let iadd = match pos.func.dfg.value_def(s) {
ValueDef::Res(i, 0) => i,
_ => panic!(),
};
// Remove `c` from the result list.
dfg.clear_results(iadd);
dfg.attach_result(iadd, s);
pos.func.dfg.clear_results(iadd);
pos.func.dfg.attach_result(iadd, s);
// Replace `iadd_cout` with a normal `iadd` and an `icmp`.
dfg.replace(iadd).iadd(v1, arg0);
let c2 = dfg.ins(pos).icmp(IntCC::UnsignedLessThan, s, v1);
dfg.change_to_alias(c, c2);
pos.func.dfg.replace(iadd).iadd(v1, arg0);
let c2 = pos.ins().icmp(IntCC::UnsignedLessThan, s, v1);
pos.func.dfg.change_to_alias(c, c2);
assert_eq!(dfg.resolve_aliases(c2), c2);
assert_eq!(dfg.resolve_aliases(c), c2);
assert_eq!(pos.func.dfg.resolve_aliases(c2), c2);
assert_eq!(pos.func.dfg.resolve_aliases(c), c2);
// Make a copy of the alias.
let c3 = dfg.ins(pos).copy(c);
let c3 = pos.ins().copy(c);
// This does not see through copies.
assert_eq!(dfg.resolve_aliases(c3), c3);
assert_eq!(pos.func.dfg.resolve_aliases(c3), c3);
// But this goes through both copies and aliases.
assert_eq!(dfg.resolve_copies(c3), c2);
assert_eq!(pos.func.dfg.resolve_copies(c3), c2);
}
}