[flang-commits] [flang] [mlir] [MLIR] Add cpow support in ComplexToROCDLLibraryCalls (PR #153183)
Slava Zakharin via flang-commits
flang-commits at lists.llvm.org
Mon Aug 18 20:21:39 PDT 2025
================
@@ -345,6 +346,94 @@ OpFoldResult ConjOp::fold(FoldAdaptor adaptor) {
return {};
}
+//===----------------------------------------------------------------------===//
+// PowOp
+//===----------------------------------------------------------------------===//
+
+namespace {
+struct PowIntegerExponent : OpRewritePattern<PowOp> {
+ using OpRewritePattern<PowOp>::OpRewritePattern;
+
+ LogicalResult matchAndRewrite(PowOp op,
+ PatternRewriter &rewriter) const override {
+ Value rhs = op.getRhs();
+ FloatAttr realAttr;
+
+ auto castIntToFloat = [](auto v) -> std::optional<FloatAttr> {
+ if (auto cst =
+ v->getOperand(0).template getDefiningOp<arith::ConstantOp>())
+ if (auto intAttr = dyn_cast<IntegerAttr>(cst.getValue())) {
+ APFloat fl(mlir::cast<FloatType>(v->getResult(0).getType())
+ .getFloatSemantics());
+ fl.convertFromAPInt(intAttr.getValue(), /*isSigned=*/true,
+ APFloat::rmNearestTiesToEven);
+ return FloatAttr::get(v->getResult(0).getType(), fl);
+ }
+ return std::nullopt;
+ };
+
+ auto getFloatAttr = [castIntToFloat](Value v) -> std::optional<FloatAttr> {
+ if (auto cst = v.getDefiningOp<arith::ConstantOp>()) {
+ if (auto attr = dyn_cast<FloatAttr>(cst.getValue()))
+ return attr;
+ }
+ if (auto cast = v.getDefiningOp<arith::SIToFPOp>())
+ return castIntToFloat(cast);
+ if (auto cast = v.getDefiningOp<arith::UIToFPOp>())
+ return castIntToFloat(cast);
+ if (v.getDefiningOp()->getName().getStringRef() == "fir.convert")
----------------
vzakhari wrote:
We should not be relying on `fir.convert` here.
https://github.com/llvm/llvm-project/pull/153183
More information about the flang-commits
mailing list