mathic 0.2.0

A compiler with builtin support of symbolic operations, built with LLVM/MLIR
// RUN: dialect-driver --symbolic-extract-eval %s | FileCheck %s

module {
  // CHECK:      func private @__eval_op_
  // CHECK-SAME: (%arg0: i32) -> !symbolic.expr<i32, isSigned = true> {
  // CHECK-NEXT:   %0 = symbolic.sym "x" : !symbolic.expr<i32, isSigned = true>
  // CHECK-NEXT:   %1 = symbolic.mul %0, %0 : (!symbolic.expr<i32, isSigned = true>, !symbolic.expr<i32, isSigned = true>) -> !symbolic.expr<i32, isSigned = true>
  // CHECK-NEXT:   %2 = symbolic.mul %1, %0 : (!symbolic.expr<i32, isSigned = true>, !symbolic.expr<i32, isSigned = true>) -> !symbolic.expr<i32, isSigned = true>
  // CHECK-NEXT:   return %2 : !symbolic.expr<i32, isSigned = true>
  // CHECK-NEXT: }

  // CHECK-LABEL: func @test_basic_extract
  func.func @test_basic_extract(%x_val: i32) -> i32 {
    %x = symbolic.sym "x" : !symbolic.expr<i32, isSigned = true>
    %xx = symbolic.mul %x, %x : (!symbolic.expr<i32, isSigned = true>, !symbolic.expr<i32, isSigned = true>) -> !symbolic.expr<i32, isSigned = true>
    %r = symbolic.mul %xx, %x : (!symbolic.expr<i32, isSigned = true>, !symbolic.expr<i32, isSigned = true>) -> !symbolic.expr<i32, isSigned = true>
    // CHECK: call @__eval_op_
    %res = symbolic.eval %r, "x", %x_val : (!symbolic.expr<i32, isSigned = true>, i32) -> i32
    return %res : i32
  }

  // CHECK-LABEL: func @test_dedup
  func.func @test_dedup(%a: i32, %b: i32, %c: i32) -> i32 {
    %x = symbolic.sym "x" : !symbolic.expr<i32, isSigned = true>
    %xx = symbolic.mul %x, %x : (!symbolic.expr<i32, isSigned = true>, !symbolic.expr<i32, isSigned = true>) -> !symbolic.expr<i32, isSigned = true>
    // CHECK: call @__eval_op_
    %r1 = symbolic.eval %xx, "x", %a : (!symbolic.expr<i32, isSigned = true>, i32) -> i32
    // CHECK: call @__eval_op_
    %r2 = symbolic.eval %xx, "x", %b : (!symbolic.expr<i32, isSigned = true>, i32) -> i32
    // CHECK: call @__eval_op_
    %r3 = symbolic.eval %xx, "x", %c : (!symbolic.expr<i32, isSigned = true>, i32) -> i32
    return %r3 : i32
  }
}