Skip to content

Commit

Permalink
[mlir][Math] Add constant folder for ExpOp.
Browse files Browse the repository at this point in the history
This patch adds constant folder for ExpOp which only supports single and double precision floating-point.

Differential Revision: https://reviews.llvm.org/D130318
  • Loading branch information
jacquesguan authored and jacquesguan committed Jul 25, 2022
1 parent b894071 commit 9e241c7
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 3 deletions.
1 change: 1 addition & 0 deletions mlir/include/mlir/Dialect/Math/IR/MathOps.td
Expand Up @@ -363,6 +363,7 @@ def Math_ExpOp : Math_FloatUnaryOp<"exp"> {
%a = math.exp %b : f64
```
}];
let hasFolder = 1;
}

//===----------------------------------------------------------------------===//
Expand Down
18 changes: 18 additions & 0 deletions mlir/lib/Dialect/Math/IR/MathOps.cpp
Expand Up @@ -210,6 +210,24 @@ OpFoldResult math::SqrtOp::fold(ArrayRef<Attribute> operands) {
});
}

//===----------------------------------------------------------------------===//
// ExpOp folder
//===----------------------------------------------------------------------===//

OpFoldResult math::ExpOp::fold(ArrayRef<Attribute> operands) {
return constFoldUnaryOpConditional<FloatAttr>(
operands, [](const APFloat &a) -> Optional<APFloat> {
switch (a.getSizeInBits(a.getSemantics())) {
case 64:
return APFloat(exp(a.convertToDouble()));
case 32:
return APFloat(expf(a.convertToFloat()));
default:
return {};
}
});
}

/// Materialize an integer or floating point constant.
Operation *math::MathDialect::materializeConstant(OpBuilder &builder,
Attribute value, Type type,
Expand Down
18 changes: 18 additions & 0 deletions mlir/test/Dialect/Math/canonicalize.mlir
Expand Up @@ -228,3 +228,21 @@ func.func @log_fold_vec() -> (vector<4xf32>) {
%0 = math.log %v1 : vector<4xf32>
return %0 : vector<4xf32>
}

// CHECK-LABEL: @exp_fold
// CHECK-NEXT: %[[cst:.+]] = arith.constant 7.3890562 : f32
// CHECK-NEXT: return %[[cst]]
func.func @exp_fold() -> f32 {
%c = arith.constant 2.0 : f32
%r = math.exp %c : f32
return %r : f32
}

// CHECK-LABEL: @exp_fold_vec
// CHECK-NEXT: %[[cst:.+]] = arith.constant dense<[2.71828175, 7.3890562, 20.085537, 54.5981483]> : vector<4xf32>
// CHECK-NEXT: return %[[cst]]
func.func @exp_fold_vec() -> (vector<4xf32>) {
%v1 = arith.constant dense<[1.0, 2.0, 3.0, 4.0]> : vector<4xf32>
%0 = math.exp %v1 : vector<4xf32>
return %0 : vector<4xf32>
}
6 changes: 3 additions & 3 deletions mlir/test/mlir-cpu-runner/math-polynomial-approx.mlir
Expand Up @@ -233,7 +233,7 @@ func.func @exp() {
%1 = math.exp %0 : f32
vector.print %1 : f32

// CHECK: 0.778802, 2.117, 2.71828, 3.85742
// CHECK: 0.778801, 2.117, 2.71828, 3.85743
%2 = arith.constant dense<[-0.25, 0.75, 1.0, 1.35]> : vector<4xf32>
%3 = math.exp %2 : vector<4xf32>
vector.print %3 : vector<4xf32>
Expand All @@ -243,7 +243,7 @@ func.func @exp() {
%exp_zero = math.exp %zero : f32
vector.print %exp_zero : f32

// CHECK: 1.17549e-38, 1.38879e-11, 7.20049e+10, inf
// CHECK: 2.22736e-39, 1.38879e-11, 7.20049e+10, inf
%special_vec = arith.constant dense<[-89.0, -25.0, 25.0, 89.0]> : vector<4xf32>
%exp_special_vec = math.exp %special_vec : vector<4xf32>
vector.print %exp_special_vec : vector<4xf32>
Expand Down Expand Up @@ -272,7 +272,7 @@ func.func @expm1() {
%1 = math.expm1 %0 : f32
vector.print %1 : f32

// CHECK: -0.00995016, 0.0100502, 0.648721, 6.38905
// CHECK: -0.00995017, 0.0100502, 0.648721, 6.38906
%2 = arith.constant dense<[-0.01, 0.01, 0.5, 2.0]> : vector<4xf32>
%3 = math.expm1 %2 : vector<4xf32>
vector.print %3 : vector<4xf32>
Expand Down

0 comments on commit 9e241c7

Please sign in to comment.