4 个版本 (稳定)

2.1.0 2020 年 10 月 16 日
2.0.0 2020 年 10 月 15 日
1.0.0 2020 年 7 月 25 日
0.1.0 2020 年 7 月 17 日

解析器实现 中排名第 1760

Download history 4125/week @ 2024-04-20 3333/week @ 2024-04-27 3765/week @ 2024-05-04 8008/week @ 2024-05-11 7615/week @ 2024-05-18 8920/week @ 2024-05-25 7769/week @ 2024-06-01 10467/week @ 2024-06-08 11695/week @ 2024-06-15 11829/week @ 2024-06-22 8563/week @ 2024-06-29 10072/week @ 2024-07-06 10302/week @ 2024-07-13 14104/week @ 2024-07-20 14168/week @ 2024-07-27 11596/week @ 2024-08-03

每月下载量 51,681
2 crate 中使用

MIT/Apache

87KB
1.5K SLoC

souper-ir

Souper IR 的操作库。

CI

此 crate 提供解析或生成 Souper IR 的 AST 类型。它既适合编写自定义 LHS 提取器,也适合将学习到的优化转换为您的自定义窥视优化传递。

AST

AST 类型定义和构建器位于 souper_ir::ast 模块中。

解析 Souper IR

当启用 parse Cargo 功能时,souper_ir::parse 模块包含从文件或内存中的字符串解析 Souper IR 的函数。

use std::path::Path;

// We provide a filename to get better error messages.
let filename = Path::new("example.souper");

let replacements = souper_ir::parse::parse_replacements_str("
    ;; x + x --> 2 * x
    %0 = var
    %1 = add %0, %0
    %2 = mul %0, 2
    cand %1, %2

    ;; x & x --> x
    %0 = var
    %1 = and %0, %0
    cand %1, %0
", Some(filename))?;

输出 Souper IR 的文本格式

当启用 stringify Cargo 功能时,souper_ir::ast::Replacementsouper_ir::ast::LeftHandSidesouper_ir::ast::RightHandSide 类型都实现了 std::fmt::DisplayDisplay 实现将 AST 类型写入 Souper 的文本格式。

use souper_ir::ast;

// Build this Souper left-hand side:
//
//     %x:i32 = var
//     %y = mul %x, 2
//     infer %y
//
// We expect that Souper would be able to synthesize a right-hand side that
// does a left shift by one instead of a multiplication.

let mut lhs = ast::LeftHandSideBuilder::default();

let x = lhs.assignment(
    Some("x".into()),
    Some(ast::Type { width: 32 }),
    ast::AssignmentRhs::Var,
    vec![],
);

let y = lhs.assignment(
    Some("y".into()),
    None,
    ast::Instruction::Mul {
        a: x.into(),
        b: ast::Constant { value: 2, r#type: None }.into(),
    },
    vec![],
);

let lhs = lhs.finish(y, vec![]);

// Now we can stringify the LHS (and then, presumably, give it to Souper)
// with `std::fmt::Display`:

use std::io::Write;

let mut file = std::fs::File::create("my-lhs.souper")?;
write!(&mut file, "{}", lhs)?;

依赖关系

~30KB