[Mlir-commits] [mlir] [mlir][Arith] arith.select doesn't need to be emulated for small floats (PR #161707)

Krzysztof Drewniak llvmlistbot at llvm.org
Thu Oct 2 10:37:09 PDT 2025


https://github.com/krzysz00 created https://github.com/llvm/llvm-project/pull/161707

arith.select isn't an arithmetic operation in the sense of things like addf or mulf, which the emulate-unsupported-floats rewrites using extf and truncf.

This patch adds select as a legal operation to prevent a pointless conversion aronud conditional moves.

Fixes https://github.com/iree-org/iree/issues/22181

>From 2a8ca32402fc3734d049f1281f3bb45eed09c4f6 Mon Sep 17 00:00:00 2001
From: Krzysztof Drewniak <Krzysztof.Drewniak at amd.com>
Date: Thu, 2 Oct 2025 17:34:05 +0000
Subject: [PATCH] [mlir][Arith] arith.select doesn't need to be emulated for
 small floats

arith.select isn't an arithmetic operation in the sense of things like
addf or mulf, which the emulate-unsupported-floats rewrites using extf
and truncf.

This patch adds select as a legal operation to prevent a pointless
conversion aronud conditional moves.

Fixes https://github.com/iree-org/iree/issues/22181
---
 .../Arith/Transforms/EmulateUnsupportedFloats.cpp     |  3 ++-
 .../Dialect/Arith/emulate-unsupported-floats.mlir     | 11 +++++++++++
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/mlir/lib/Dialect/Arith/Transforms/EmulateUnsupportedFloats.cpp b/mlir/lib/Dialect/Arith/Transforms/EmulateUnsupportedFloats.cpp
index 7626d356a37f2..c64e10f534f8e 100644
--- a/mlir/lib/Dialect/Arith/Transforms/EmulateUnsupportedFloats.cpp
+++ b/mlir/lib/Dialect/Arith/Transforms/EmulateUnsupportedFloats.cpp
@@ -123,7 +123,8 @@ void mlir::arith::populateEmulateUnsupportedFloatsLegality(
                                vector::OuterProductOp, vector::ScanOp>(
       [&](Operation *op) { return converter.isLegal(op); });
   target.addLegalOp<arith::BitcastOp, arith::ExtFOp, arith::TruncFOp,
-                    arith::ConstantOp, vector::SplatOp, vector::BroadcastOp>();
+                    arith::ConstantOp, arith::SelectOp, vector::SplatOp,
+                    vector::BroadcastOp>();
 }
 
 void EmulateUnsupportedFloatsPass::runOnOperation() {
diff --git a/mlir/test/Dialect/Arith/emulate-unsupported-floats.mlir b/mlir/test/Dialect/Arith/emulate-unsupported-floats.mlir
index 99790cc45d490..fcd004ac554aa 100644
--- a/mlir/test/Dialect/Arith/emulate-unsupported-floats.mlir
+++ b/mlir/test/Dialect/Arith/emulate-unsupported-floats.mlir
@@ -85,3 +85,14 @@ func.func @no_expansion(%x: f32) -> f32 {
   %y = arith.addf %x, %c : f32
   func.return %y : f32
 }
+
+// -----
+
+func.func @no_promote_select(%c: i1, %x: bf16, %y: bf16) -> bf16 {
+// CHECK-LABEL: @no_promote_select
+// CHECK-SAME: (%[[C:.+]]: i1, %[[X:.+]]: bf16, %[[Y:.+]]: bf16)
+// CHECK: %[[Z:.+]] = arith.select %[[C]], %[[X]], %[[Y]] : bf16
+// CHECK: return %[[Z]]
+  %z = arith.select %c, %x, %y : bf16
+  func.return %z : bf16
+}



More information about the Mlir-commits mailing list