vicis-core 0.2.1

Manipulate LLVM-IR in Pure Rust
Documentation
use vicis_core::{
    ir::module,
    pass::{transform::mem2reg::Mem2RegPass, PassManager},
};

#[test]
fn mem2reg_1() {
    let ir = r#"
define dso_local i32 @main() {
  %1 = alloca i32, align 4
  %2 = alloca i32, align 4
  store i32 0, i32* %1, align 4
  store i32 234, i32* %2, align 4
  %3 = load i32, i32* %2, align 4
  %4 = add nsw i32 %3, 123
  ret i32 %4
}"#;
    let mut module = module::parse_assembly(ir).expect("failed to parse ir");
    let mut pm = PassManager::new();
    pm.add_transform(Mem2RegPass);
    pm.run_on_module(&mut module);
    insta::assert_debug_snapshot!(module);
}

#[test]
fn mem2reg_2() {
    let ir = r#"
define dso_local i32 @main() {
  %1 = alloca i32, align 4
  %2 = alloca i32, align 4
  %3 = alloca i32, align 4
  %4 = alloca i32, align 4
  %5 = alloca i32, align 4
  store i32 0, i32* %1, align 4
  store i32 1, i32* %2, align 4
  %6 = load i32, i32* %2, align 4
  %7 = add nsw i32 %6, 1
  store i32 %7, i32* %3, align 4
  %8 = load i32, i32* %2, align 4
  %9 = load i32, i32* %3, align 4
  %10 = sub nsw i32 %8, %9
  store i32 %10, i32* %4, align 4
  store i32 3, i32* %2, align 4
  %11 = load i32, i32* %2, align 4
  store i32 %11, i32* %5, align 4
  %12 = load i32, i32* %3, align 4
  %13 = load i32, i32* %5, align 4
  %14 = add nsw i32 %12, %13
  ret i32 %14
}"#;
    let mut module = module::parse_assembly(ir).expect("failed to parse ir");
    let mut pm = PassManager::new();
    pm.add_transform(Mem2RegPass);
    pm.run_on_module(&mut module);
    insta::assert_debug_snapshot!(module);
}

#[test]
fn mem2reg_3() {
    let ir = r#"
define dso_local i32 @main() {
  %1 = alloca i32, align 4
  %2 = alloca i32, align 4
  %3 = alloca i32, align 4
  store i32 0, i32* %1, align 4
  store i32 0, i32* %2, align 4
  store i32 1, i32* %3, align 4
  br label %4

4:                                                ; preds = %11, %0
  %5 = load i32, i32* %3, align 4
  %6 = icmp sle i32 %5, 10
  br i1 %6, label %7, label %14

7:                                                ; preds = %4
  %8 = load i32, i32* %3, align 4
  %9 = load i32, i32* %2, align 4
  %10 = add nsw i32 %9, %8
  store i32 %10, i32* %2, align 4
  br label %11

11:                                               ; preds = %7
  %12 = load i32, i32* %3, align 4
  %13 = add nsw i32 %12, 1
  store i32 %13, i32* %3, align 4
  br label %4

14:                                               ; preds = %4
  %15 = load i32, i32* %2, align 4
  ret i32 %15
}"#;
    let mut module = module::parse_assembly(ir).expect("failed to parse ir");
    let mut pm = PassManager::new();
    pm.add_transform(Mem2RegPass);
    pm.run_on_module(&mut module);
    insta::assert_debug_snapshot!(module);
}

#[test]
fn mem2reg_4() {
    let ir = r#"
define dso_local i32 @main() {
  %1 = alloca i32, align 4
  %2 = alloca i32, align 4
  %3 = alloca i32, align 4
  %4 = alloca i32, align 4
  %5 = alloca i32, align 4
  store i32 0, i32* %1, align 4
  store i32 1, i32* %2, align 4
  store i32 1, i32* %3, align 4
  store i32 0, i32* %4, align 4
  br label %6

6:                                                ; preds = %15, %0
  %7 = load i32, i32* %4, align 4
  %8 = icmp slt i32 %7, 9
  br i1 %8, label %9, label %18

9:                                                ; preds = %6
  %10 = load i32, i32* %2, align 4
  store i32 %10, i32* %5, align 4
  %11 = load i32, i32* %3, align 4
  store i32 %11, i32* %2, align 4
  %12 = load i32, i32* %5, align 4
  %13 = load i32, i32* %3, align 4
  %14 = add nsw i32 %12, %13
  store i32 %14, i32* %3, align 4
  br label %15

15:                                               ; preds = %9
  %16 = load i32, i32* %4, align 4
  %17 = add nsw i32 %16, 1
  store i32 %17, i32* %4, align 4
  br label %6

18:                                               ; preds = %6
  %19 = load i32, i32* %3, align 4
  ret i32 %19
}
"#;
    let mut module = module::parse_assembly(ir).expect("failed to parse ir");
    let mut pm = PassManager::new();
    pm.add_transform(Mem2RegPass);
    pm.run_on_module(&mut module);
    insta::assert_debug_snapshot!(module);
}

#[test]
fn mem2reg_5() {
    let ir = r#"
define dso_local i32 @main() {
  %1 = alloca i32, align 4
  %2 = alloca i32, align 4
  store i32 0, i32* %1, align 4
  store i32 1, i32* %2, align 4
  %3 = load i32, i32* %2, align 4
  %4 = icmp eq i32 %3, 1
  br i1 %4, label %5, label %6

5:                                                ; preds = %0
  store i32 2, i32* %1, align 4
  br label %7

6:                                                ; preds = %0
  store i32 3, i32* %1, align 4
  br label %7

7:                                                ; preds = %6, %5
  %8 = load i32, i32* %1, align 4
  ret i32 %8
}
"#;
    let mut module = module::parse_assembly(ir).expect("failed to parse ir");
    let mut pm = PassManager::new();
    pm.add_transform(Mem2RegPass);
    pm.run_on_module(&mut module);
    insta::assert_debug_snapshot!(module);
}