[clang] [CIR] Add binary operators (PR #132420)
Morris Hafner via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 24 06:09:39 PDT 2025
================
@@ -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
More information about the cfe-commits
mailing list