================ @@ -143,6 +147,114 @@ class CIRBaseBuilderTy : public mlir::OpBuilder { return createCast(loc, cir::CastKind::bitcast, src, newTy); } + mlir::Value createBinop(mlir::Value lhs, cir::BinOpKind kind, + const llvm::APInt &rhs) { + return create<cir::BinOp>(lhs.getLoc(), lhs.getType(), kind, lhs, + getConstAPInt(lhs.getLoc(), lhs.getType(), rhs)); + } + + mlir::Value createBinop(mlir::Value lhs, cir::BinOpKind kind, + mlir::Value rhs) { + return create<cir::BinOp>(lhs.getLoc(), lhs.getType(), kind, lhs, rhs); + } + + mlir::Value createBinop(mlir::Location loc, mlir::Value lhs, + cir::BinOpKind kind, mlir::Value rhs) { + return create<cir::BinOp>(loc, lhs.getType(), kind, lhs, rhs); + } + + mlir::Value createLowBitsSet(mlir::Location loc, unsigned size, + unsigned bits) { + llvm::APInt val = llvm::APInt::getLowBitsSet(size, bits); + auto type = cir::IntType::get(getContext(), size, false); + return getConstAPInt(loc, type, val); + } + + mlir::Value createAnd(mlir::Value lhs, const llvm::APInt &rhs) { + mlir::Value val = getConstAPInt(lhs.getLoc(), lhs.getType(), rhs); + return createBinop(lhs, cir::BinOpKind::And, val); + } + + mlir::Value createAnd(mlir::Value lhs, mlir::Value rhs) { + return createBinop(lhs, cir::BinOpKind::And, rhs); + } + + mlir::Value createAnd(mlir::Location loc, mlir::Value lhs, mlir::Value rhs) { + return createBinop(loc, lhs, cir::BinOpKind::And, rhs); + } + + mlir::Value createOr(mlir::Value lhs, const llvm::APInt &rhs) { + mlir::Value val = getConstAPInt(lhs.getLoc(), lhs.getType(), rhs); + return createBinop(lhs, cir::BinOpKind::Or, val); + } + + mlir::Value createOr(mlir::Value lhs, mlir::Value rhs) { + return createBinop(lhs, cir::BinOpKind::Or, rhs); + } + + mlir::Value createMul(mlir::Value lhs, mlir::Value rhs, bool hasNUW = false, + bool hasNSW = false) { + auto op = create<cir::BinOp>(lhs.getLoc(), lhs.getType(), + cir::BinOpKind::Mul, lhs, rhs); + if (hasNUW) + op.setNoUnsignedWrap(true); + if (hasNSW) + op.setNoSignedWrap(true); + return op; + } + mlir::Value createNSWMul(mlir::Value lhs, mlir::Value rhs) { + return createMul(lhs, rhs, false, true); + } + mlir::Value createNUWAMul(mlir::Value lhs, mlir::Value rhs) { + return createMul(lhs, rhs, true, false); + } + + mlir::Value createMul(mlir::Value lhs, const llvm::APInt &rhs) { + mlir::Value val = getConstAPInt(lhs.getLoc(), lhs.getType(), rhs); + return createBinop(lhs, cir::BinOpKind::Mul, val); + } + + mlir::Value createSub(mlir::Value lhs, mlir::Value rhs, bool hasNUW = false, ---------------- mmha wrote:
I think I prefer Erich's suggestion here as seting these attributes in the `create*` functions would lead to more code duplication (if I understand you correctly). For creating that bitfield enum I'd like to reuse `CV_DEFINE_ENUM_CLASS_FLAGS_OPERATORS` from `llvm/include/llvm/DebugInfo/CodeView/CodeView.h`. What would be a good place to move this macro to? `clang::CodeGen::FnInfoOpts` could use that as well. https://github.com/llvm/llvm-project/pull/132420 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits