[clang] [CIR][NFC] Simplify BoolAttr builders (PR #136366)
Henrich Lauko via cfe-commits
cfe-commits at lists.llvm.org
Sat Apr 19 04:13:07 PDT 2025
https://github.com/xlauko updated https://github.com/llvm/llvm-project/pull/136366
>From 9b3342119c49a5ff6f4d16b720de8331f867a15e Mon Sep 17 00:00:00 2001
From: xlauko <xlauko at mail.muni.cz>
Date: Fri, 18 Apr 2025 22:34:24 +0200
Subject: [PATCH] [CIR][NFC] Simplify BoolAttr builders
---
.../clang/CIR/Dialect/Builder/CIRBaseBuilder.h | 10 +++++++---
clang/include/clang/CIR/Dialect/IR/CIRAttrs.td | 6 ++++++
clang/include/clang/CIR/Dialect/IR/CIROps.td | 8 +++++++-
clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp | 13 +++----------
clang/lib/CIR/CodeGen/CIRGenStmt.cpp | 4 +---
clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp | 4 +---
6 files changed, 25 insertions(+), 20 deletions(-)
diff --git a/clang/include/clang/CIR/Dialect/Builder/CIRBaseBuilder.h b/clang/include/clang/CIR/Dialect/Builder/CIRBaseBuilder.h
index d2a241964f34f..ee8af62ede0da 100644
--- a/clang/include/clang/CIR/Dialect/Builder/CIRBaseBuilder.h
+++ b/clang/include/clang/CIR/Dialect/Builder/CIRBaseBuilder.h
@@ -57,6 +57,7 @@ class CIRBaseBuilderTy : public mlir::OpBuilder {
public:
CIRBaseBuilderTy(mlir::MLIRContext &mlirContext)
: mlir::OpBuilder(&mlirContext) {}
+ CIRBaseBuilderTy(mlir::OpBuilder &builder) : mlir::OpBuilder(builder) {}
mlir::Value getConstAPInt(mlir::Location loc, mlir::Type typ,
const llvm::APInt &val) {
@@ -98,13 +99,13 @@ class CIRBaseBuilderTy : public mlir::OpBuilder {
if (auto recordTy = mlir::dyn_cast<cir::RecordType>(ty))
return getZeroAttr(recordTy);
if (mlir::isa<cir::BoolType>(ty)) {
- return getCIRBoolAttr(false);
+ return getFalseAttr();
}
llvm_unreachable("Zero initializer for given type is NYI");
}
cir::ConstantOp getBool(bool state, mlir::Location loc) {
- return create<cir::ConstantOp>(loc, getBoolTy(), getCIRBoolAttr(state));
+ return create<cir::ConstantOp>(loc, getCIRBoolAttr(state));
}
cir::ConstantOp getFalse(mlir::Location loc) { return getBool(false, loc); }
cir::ConstantOp getTrue(mlir::Location loc) { return getBool(true, loc); }
@@ -120,9 +121,12 @@ class CIRBaseBuilderTy : public mlir::OpBuilder {
}
cir::BoolAttr getCIRBoolAttr(bool state) {
- return cir::BoolAttr::get(getContext(), getBoolTy(), state);
+ return cir::BoolAttr::get(getContext(), state);
}
+ cir::BoolAttr getTrueAttr() { return getCIRBoolAttr(true); }
+ cir::BoolAttr getFalseAttr() { return getCIRBoolAttr(false); }
+
mlir::Value createNot(mlir::Value value) {
return create<cir::UnaryOp>(value.getLoc(), value.getType(),
cir::UnaryOpKind::Not, value);
diff --git a/clang/include/clang/CIR/Dialect/IR/CIRAttrs.td b/clang/include/clang/CIR/Dialect/IR/CIRAttrs.td
index 3680ded4afafe..25ceded7e8a5b 100644
--- a/clang/include/clang/CIR/Dialect/IR/CIRAttrs.td
+++ b/clang/include/clang/CIR/Dialect/IR/CIRAttrs.td
@@ -49,6 +49,12 @@ def CIR_BoolAttr : CIR_Attr<"Bool", "bool", [TypedAttrInterface]> {
"", "cir::BoolType">:$type,
"bool":$value);
+ let builders = [
+ AttrBuilder<(ins "bool":$value), [{
+ return $_get($_ctxt, cir::BoolType::get($_ctxt), value);
+ }]>,
+ ];
+
let assemblyFormat = [{
`<` $value `>`
}];
diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td
index 5ba4b33dc1a12..b526d077a910c 100644
--- a/clang/include/clang/CIR/Dialect/IR/CIROps.td
+++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td
@@ -294,6 +294,12 @@ def ConstantOp : CIR_Op<"const",
// The constant operation returns a single value of CIR_AnyType.
let results = (outs CIR_AnyType:$res);
+ let builders = [
+ OpBuilder<(ins "cir::BoolAttr":$value), [{
+ build($_builder, $_state, value.getType(), value);
+ }]>
+ ];
+
let assemblyFormat = "attr-dict $value";
let hasVerifier = 1;
@@ -844,7 +850,7 @@ def UnaryOp : CIR_Op<"unary", [Pure, SameOperandsAndResultType]> {
let assemblyFormat = [{
`(` $kind `,` $input `)`
(`nsw` $no_signed_wrap^)?
- `:` type($input) `,` type($result) attr-dict
+ `:` type($input) `,` type($result) attr-dict
}];
let hasVerifier = 1;
diff --git a/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp b/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp
index 1bef1b976a4b5..f1561d1b26fc0 100644
--- a/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp
@@ -152,10 +152,7 @@ class ScalarExprEmitter : public StmtVisitor<ScalarExprEmitter, mlir::Value> {
}
mlir::Value VisitCXXBoolLiteralExpr(const CXXBoolLiteralExpr *e) {
- mlir::Type type = cgf.convertType(e->getType());
- return builder.create<cir::ConstantOp>(
- cgf.getLoc(e->getExprLoc()), type,
- builder.getCIRBoolAttr(e->getValue()));
+ return builder.getBool(e->getValue(), cgf.getLoc(e->getExprLoc()));
}
mlir::Value VisitCastExpr(CastExpr *e);
@@ -215,9 +212,7 @@ class ScalarExprEmitter : public StmtVisitor<ScalarExprEmitter, mlir::Value> {
if (llvm::isa<MemberPointerType>(srcType)) {
cgf.getCIRGenModule().errorNYI(loc, "member pointer to bool conversion");
- mlir::Type boolType = builder.getBoolTy();
- return builder.create<cir::ConstantOp>(loc, boolType,
- builder.getCIRBoolAttr(false));
+ return builder.getFalse(loc);
}
if (srcType->isIntegerType())
@@ -354,9 +349,7 @@ class ScalarExprEmitter : public StmtVisitor<ScalarExprEmitter, mlir::Value> {
// An interesting aspect of this is that increment is always true.
// Decrement does not have this property.
if (isInc && type->isBooleanType()) {
- value = builder.create<cir::ConstantOp>(cgf.getLoc(e->getExprLoc()),
- cgf.convertType(type),
- builder.getCIRBoolAttr(true));
+ value = builder.getTrue(cgf.getLoc(e->getExprLoc()));
} else if (type->isIntegerType()) {
QualType promotedType;
bool canPerformLossyDemotionCheck = false;
diff --git a/clang/lib/CIR/CodeGen/CIRGenStmt.cpp b/clang/lib/CIR/CodeGen/CIRGenStmt.cpp
index f503e2344f952..82ac53706b7f9 100644
--- a/clang/lib/CIR/CodeGen/CIRGenStmt.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenStmt.cpp
@@ -456,9 +456,7 @@ mlir::LogicalResult CIRGenFunction::emitForStmt(const ForStmt &s) {
// scalar type.
condVal = evaluateExprAsBool(s.getCond());
} else {
- cir::BoolType boolTy = cir::BoolType::get(b.getContext());
- condVal = b.create<cir::ConstantOp>(
- loc, boolTy, cir::BoolAttr::get(b.getContext(), boolTy, true));
+ condVal = b.create<cir::ConstantOp>(loc, builder.getTrueAttr());
}
builder.createCondition(condVal);
},
diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
index 8c4a67258df3f..945e415d0dada 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
@@ -692,9 +692,7 @@ mlir::LogicalResult CIRToLLVMConstantOpLowering::matchAndRewrite(
// during a pass as long as they don't live past the end of the pass.
attr = op.getValue();
} else if (mlir::isa<cir::BoolType>(op.getType())) {
- int value = (op.getValue() ==
- cir::BoolAttr::get(getContext(),
- cir::BoolType::get(getContext()), true));
+ int value = mlir::cast<cir::BoolAttr>(op.getValue()).getValue();
attr = rewriter.getIntegerAttr(typeConverter->convertType(op.getType()),
value);
} else if (mlir::isa<cir::IntType>(op.getType())) {
More information about the cfe-commits
mailing list