[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