@@ -1730,7 +1730,8 @@ void ConvertCIRToLLVMPass::runOnOperation() {
17301730 CIRToLLVMVecExtractOpLowering,
17311731 CIRToLLVMVecInsertOpLowering,
17321732 CIRToLLVMVecCmpOpLowering,
1733- CIRToLLVMVecShuffleDynamicOpLowering
1733+ CIRToLLVMVecShuffleDynamicOpLowering,
1734+ CIRToLLVMVecTernaryOpLowering
17341735 // clang-format on
17351736 >(converter, patterns.getContext ());
17361737
@@ -1934,6 +1935,20 @@ mlir::LogicalResult CIRToLLVMVecShuffleDynamicOpLowering::matchAndRewrite(
19341935 return mlir::success ();
19351936}
19361937
1938+ mlir::LogicalResult CIRToLLVMVecTernaryOpLowering::matchAndRewrite (
1939+ cir::VecTernaryOp op, OpAdaptor adaptor,
1940+ mlir::ConversionPatternRewriter &rewriter) const {
1941+ // Convert `cond` into a vector of i1, then use that in a `select` op.
1942+ mlir::Value bitVec = rewriter.create <mlir::LLVM::ICmpOp>(
1943+ op.getLoc (), mlir::LLVM::ICmpPredicate::ne, adaptor.getCond (),
1944+ rewriter.create <mlir::LLVM::ZeroOp>(
1945+ op.getCond ().getLoc (),
1946+ typeConverter->convertType (op.getCond ().getType ())));
1947+ rewriter.replaceOpWithNewOp <mlir::LLVM::SelectOp>(
1948+ op, bitVec, adaptor.getVec1 (), adaptor.getVec2 ());
1949+ return mlir::success ();
1950+ }
1951+
19371952std::unique_ptr<mlir::Pass> createConvertCIRToLLVMPass () {
19381953 return std::make_unique<ConvertCIRToLLVMPass>();
19391954}
0 commit comments