[Mlir-commits] [mlir] [mlir][spirv] Add pattern matching for arith.index_cast index to i1 for ArithToSPIRV (PR #156031)
Md Abdullah Shahneous Bari
llvmlistbot at llvm.org
Fri Aug 29 08:27:38 PDT 2025
================
@@ -607,6 +607,38 @@ struct UIToFPI1Pattern final : public OpConversionPattern<arith::UIToFPOp> {
}
};
+//===----------------------------------------------------------------------===//
+// IndexCastOp
+//===----------------------------------------------------------------------===//
+
+/// Converts arith.index_cast to spirv.Select if the type of source is index.
+struct IndexCastIndexI1Pattern final
+ : public OpConversionPattern<arith::IndexCastOp> {
+ using OpConversionPattern::OpConversionPattern;
+
+ LogicalResult
+ matchAndRewrite(arith::IndexCastOp op, OpAdaptor adaptor,
+ ConversionPatternRewriter &rewriter) const override {
+ Type srcType = adaptor.getOperands().front().getType();
+ // Indexes have already been converted to its respective spirv type:
+ Type indexType = getTypeConverter<SPIRVTypeConverter>()->getIndexType();
+ if (srcType != indexType || !op.getType().isInteger(1))
+ return failure();
+
+ Type dstType = rewriter.getI1Type();
+ Location loc = op.getLoc();
+ Value zero = spirv::ConstantOp::getZero(dstType, loc, rewriter);
+ Value one = spirv::ConstantOp::getOne(dstType, loc, rewriter);
+ Value zeroIdx = spirv::ConstantOp::getZero(srcType, loc, rewriter);
+ auto isZero = spirv::IEqualOp::create(rewriter, loc, dstType, zeroIdx,
+ adaptor.getOperands().front());
+ // spriv.IEqual outputs i32, spirv.Select is used to truncate to i1:
----------------
mshahneo wrote:
Hi @ianayl ,
spirv.IEqual itself actually returns a i1, spirv.Select is used here to select which i1 value to convert to.
I think you can remove this comment.
https://github.com/llvm/llvm-project/pull/156031
More information about the Mlir-commits
mailing list