diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp index e910a809ca71..f34bd7f957e1 100644 --- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp +++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp @@ -2004,8 +2004,15 @@ mlir::LogicalResult CIRToLLVMVecCmpOpLowering::matchAndRewrite( } else { return op.emitError() << "unsupported type for VecCmpOp: " << elementType; } - rewriter.replaceOpWithNewOp( - op, typeConverter->convertType(op.getType()), bitResult); + + // Check if the types are the same before generating SExtOp + auto targetType = typeConverter->convertType(op.getType()); + if (bitResult.getType() == targetType) { + rewriter.replaceOp(op, bitResult); + } else { + rewriter.replaceOpWithNewOp(op, targetType, bitResult); + } + return mlir::success(); } diff --git a/clang/test/CIR/Lowering/vec-cmp.cir b/clang/test/CIR/Lowering/vec-cmp.cir new file mode 100644 index 000000000000..3bc6570444a7 --- /dev/null +++ b/clang/test/CIR/Lowering/vec-cmp.cir @@ -0,0 +1,16 @@ +// RUN: cir-opt %s -cir-to-llvm -o %t.cir +// RUN: FileCheck --input-file=%t.cir %s -check-prefix=MLIR + +!s16i = !cir.int +!u16i = !cir.int + +cir.func @vec_cmp(%0: !cir.vector, %1: !cir.vector) -> () { + %2 = cir.vec.cmp(lt, %0, %1) : !cir.vector, !cir.vector x 16> + %3 = cir.cast(bitcast, %2 : !cir.vector x 16>), !u16i + cir.return +} + +// MLIR: llvm.func @vec_cmp +// MLIR-NEXT: %{{[0-9]+}} = llvm.icmp "slt" %arg0, %arg1 : vector<16xi16> +// MLIR-NEXT: %{{[0-9]+}} = llvm.bitcast %{{[0-9]+}} : vector<16xi1> to i16 +// MLIR-NEXT: llvm.return