Powf functions are pushed directly to libm. This is problematic for situations where libm is not available. This patch will decompose the powf function into log of exponent multiplied by log of base and raise it to the exp. Reviewed By: rsuderman Differential Revision: https://reviews.llvm.org/D148164
56 lines
2.0 KiB
C++
56 lines
2.0 KiB
C++
//===- TestExpandMath.cpp - Test expand math op into exp form -------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file contains test passes for expanding math operations.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "mlir/Dialect/Arith/IR/Arith.h"
|
|
#include "mlir/Dialect/Math/Transforms/Passes.h"
|
|
#include "mlir/Dialect/SCF/IR/SCF.h"
|
|
#include "mlir/Dialect/Vector/IR/VectorOps.h"
|
|
#include "mlir/Pass/Pass.h"
|
|
#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
|
|
|
|
using namespace mlir;
|
|
|
|
namespace {
|
|
struct TestExpandMathPass
|
|
: public PassWrapper<TestExpandMathPass, OperationPass<>> {
|
|
MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(TestExpandMathPass)
|
|
|
|
void runOnOperation() override;
|
|
StringRef getArgument() const final { return "test-expand-math"; }
|
|
void getDependentDialects(DialectRegistry ®istry) const override {
|
|
registry
|
|
.insert<arith::ArithDialect, scf::SCFDialect, vector::VectorDialect>();
|
|
}
|
|
StringRef getDescription() const final { return "Test expanding math"; }
|
|
};
|
|
} // namespace
|
|
|
|
void TestExpandMathPass::runOnOperation() {
|
|
RewritePatternSet patterns(&getContext());
|
|
populateExpandCtlzPattern(patterns);
|
|
populateExpandExp2FPattern(patterns);
|
|
populateExpandTanPattern(patterns);
|
|
populateExpandTanhPattern(patterns);
|
|
populateExpandFmaFPattern(patterns);
|
|
populateExpandFloorFPattern(patterns);
|
|
populateExpandCeilFPattern(patterns);
|
|
populateExpandPowFPattern(patterns);
|
|
populateExpandRoundFPattern(patterns);
|
|
(void)applyPatternsAndFoldGreedily(getOperation(), std::move(patterns));
|
|
}
|
|
|
|
namespace mlir {
|
|
namespace test {
|
|
void registerTestExpandMathPass() { PassRegistration<TestExpandMathPass>(); }
|
|
} // namespace test
|
|
} // namespace mlir
|