[clang] [CIR] Streamline creation of mlir::IntegerAttrs using mlir::Builder (PR #141830)
via cfe-commits
cfe-commits at lists.llvm.org
Wed May 28 13:12:26 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Henrich Lauko (xlauko)
<details>
<summary>Changes</summary>
- Uses getI<bitwidth>IntegerAttr builder method instead of explicit attribute and its type creation.
- Adds few helper functions `getAlignmentAttr` to build alignment representing mlir::IntegerAttr.
- Removes duplicit type parameters, that are inferred from mlir::IntegerAttr.
This mirrors incubator changes from https://github.com/llvm/clangir/pull/1645#event-17840237927
---
Full diff: https://github.com/llvm/llvm-project/pull/141830.diff
6 Files Affected:
- (modified) clang/include/clang/CIR/Dialect/Builder/CIRBaseBuilder.h (+27-18)
- (modified) clang/lib/CIR/CodeGen/CIRGenBuilder.h (+4-11)
- (modified) clang/lib/CIR/CodeGen/CIRGenModule.h (+1-1)
- (modified) clang/lib/CIR/Dialect/IR/CIRAttrs.cpp (+1-2)
- (modified) clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp (+16-24)
- (modified) clang/unittests/CIR/PointerLikeTest.cpp (+3-5)
``````````diff
diff --git a/clang/include/clang/CIR/Dialect/Builder/CIRBaseBuilder.h b/clang/include/clang/CIR/Dialect/Builder/CIRBaseBuilder.h
index 9de3a66755778..ac65c66c01589 100644
--- a/clang/include/clang/CIR/Dialect/Builder/CIRBaseBuilder.h
+++ b/clang/include/clang/CIR/Dialect/Builder/CIRBaseBuilder.h
@@ -18,6 +18,7 @@
#include "llvm/Support/ErrorHandling.h"
#include "mlir/IR/Builders.h"
+#include "mlir/IR/BuiltinAttributes.h"
#include "mlir/IR/BuiltinTypes.h"
#include "mlir/IR/Location.h"
#include "mlir/IR/Types.h"
@@ -167,9 +168,7 @@ class CIRBaseBuilderTy : public mlir::OpBuilder {
}
mlir::TypedAttr getConstPtrAttr(mlir::Type type, int64_t value) {
- auto valueAttr = mlir::IntegerAttr::get(
- mlir::IntegerType::get(type.getContext(), 64), value);
- return cir::ConstPtrAttr::get(type, valueAttr);
+ return cir::ConstPtrAttr::get(type, getI64IntegerAttr(value));
}
mlir::Value createAlloca(mlir::Location loc, cir::PointerType addrType,
@@ -197,14 +196,9 @@ class CIRBaseBuilderTy : public mlir::OpBuilder {
mlir::Value createDummyValue(mlir::Location loc, mlir::Type type,
clang::CharUnits alignment) {
- auto addr = createAlloca(loc, getPointerTo(type), type, {},
- getSizeFromCharUnits(getContext(), alignment));
- mlir::IntegerAttr alignAttr;
- uint64_t align = alignment.getQuantity();
- if (align)
- alignAttr = getI64IntegerAttr(align);
-
- return create<cir::LoadOp>(loc, addr, /*isDeref=*/false, alignAttr);
+ mlir::IntegerAttr alignmentAttr = getAlignmentAttr(alignment);
+ auto addr = createAlloca(loc, getPointerTo(type), type, {}, alignmentAttr);
+ return create<cir::LoadOp>(loc, addr, /*isDeref=*/false, alignmentAttr);
}
cir::PtrStrideOp createPtrStride(mlir::Location loc, mlir::Value base,
@@ -428,13 +422,28 @@ class CIRBaseBuilderTy : public mlir::OpBuilder {
return OpBuilder::InsertPoint(block, block->begin());
};
- mlir::IntegerAttr getSizeFromCharUnits(mlir::MLIRContext *ctx,
- clang::CharUnits size) {
- // Note that mlir::IntegerType is used instead of cir::IntType here
- // because we don't need sign information for this to be useful, so keep
- // it simple.
- return mlir::IntegerAttr::get(mlir::IntegerType::get(ctx, 64),
- size.getQuantity());
+ //
+ // Alignement and size helpers
+ //
+
+ // Note that mlir::IntegerType is used instead of cir::IntType here because we
+ // don't need sign information for these to be useful, so keep it simple.
+
+ // Fot 0 alignment, return an empty attribute.
+ mlir::IntegerAttr getAlignmentAttr(clang::CharUnits alignment) {
+ return getAlignmentAttr(alignment.getQuantity());
+ }
+
+ mlir::IntegerAttr getAlignmentAttr(llvm::Align alignment) {
+ return getAlignmentAttr(alignment.value());
+ }
+
+ mlir::IntegerAttr getAlignmentAttr(int64_t alignment) {
+ return alignment ? getI64IntegerAttr(alignment) : mlir::IntegerAttr();
+ }
+
+ mlir::IntegerAttr getSizeFromCharUnits(clang::CharUnits size) {
+ return getI64IntegerAttr(size.getQuantity());
}
/// Create a loop condition.
diff --git a/clang/lib/CIR/CodeGen/CIRGenBuilder.h b/clang/lib/CIR/CodeGen/CIRGenBuilder.h
index e53f5e9202961..b8548487d5b31 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuilder.h
+++ b/clang/lib/CIR/CodeGen/CIRGenBuilder.h
@@ -282,22 +282,15 @@ class CIRGenBuilderTy : public cir::CIRBaseBuilderTy {
cir::LoadOp createLoad(mlir::Location loc, Address addr,
bool isVolatile = false) {
- mlir::IntegerAttr align;
- uint64_t alignment = addr.getAlignment().getQuantity();
- if (alignment)
- align = getI64IntegerAttr(alignment);
+ mlir::IntegerAttr align = getAlignmentAttr(addr.getAlignment());
return create<cir::LoadOp>(loc, addr.getPointer(), /*isDeref=*/false,
align);
}
cir::StoreOp createStore(mlir::Location loc, mlir::Value val, Address dst,
- ::mlir::IntegerAttr align = {}) {
- if (!align) {
- uint64_t alignment = dst.getAlignment().getQuantity();
- if (alignment)
- align = mlir::IntegerAttr::get(mlir::IntegerType::get(getContext(), 64),
- alignment);
- }
+ mlir::IntegerAttr align = {}) {
+ if (!align)
+ align = getAlignmentAttr(dst.getAlignment());
return CIRBaseBuilderTy::createStore(loc, val, dst.getPointer(), align);
}
diff --git a/clang/lib/CIR/CodeGen/CIRGenModule.h b/clang/lib/CIR/CodeGen/CIRGenModule.h
index add1b40ab0aea..767b2f8e2a550 100644
--- a/clang/lib/CIR/CodeGen/CIRGenModule.h
+++ b/clang/lib/CIR/CodeGen/CIRGenModule.h
@@ -208,7 +208,7 @@ class CIRGenModule : public CIRGenTypeCache {
const clang::FunctionDecl *funcDecl);
mlir::IntegerAttr getSize(CharUnits size) {
- return builder.getSizeFromCharUnits(&getMLIRContext(), size);
+ return builder.getSizeFromCharUnits(size);
}
const llvm::Triple &getTriple() const { return target.getTriple(); }
diff --git a/clang/lib/CIR/Dialect/IR/CIRAttrs.cpp b/clang/lib/CIR/Dialect/IR/CIRAttrs.cpp
index c4fb4942aec75..52f0b33afaba4 100644
--- a/clang/lib/CIR/Dialect/IR/CIRAttrs.cpp
+++ b/clang/lib/CIR/Dialect/IR/CIRAttrs.cpp
@@ -64,8 +64,7 @@ void CIRDialect::printAttribute(Attribute attr, DialectAsmPrinter &os) const {
static ParseResult parseConstPtr(AsmParser &parser, mlir::IntegerAttr &value) {
if (parser.parseOptionalKeyword("null").succeeded()) {
- value = mlir::IntegerAttr::get(
- mlir::IntegerType::get(parser.getContext(), 64), 0);
+ value = parser.getBuilder().getI64IntegerAttr(0);
return success();
}
diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
index 8e82af7e62bc0..d30c85d572fed 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
@@ -417,8 +417,7 @@ mlir::LogicalResult CIRToLLVMCastOpLowering::matchAndRewrite(
case cir::CastKind::int_to_bool: {
mlir::Value llvmSrcVal = adaptor.getOperands().front();
mlir::Value zeroInt = rewriter.create<mlir::LLVM::ConstantOp>(
- castOp.getLoc(), llvmSrcVal.getType(),
- mlir::IntegerAttr::get(llvmSrcVal.getType(), 0));
+ castOp.getLoc(), llvmSrcVal.getType(), 0);
rewriter.replaceOpWithNewOp<mlir::LLVM::ICmpOp>(
castOp, mlir::LLVM::ICmpPredicate::ne, llvmSrcVal, zeroInt);
break;
@@ -630,9 +629,8 @@ mlir::LogicalResult CIRToLLVMPtrStrideOpLowering::matchAndRewrite(
if (rewriteSub) {
index = rewriter.create<mlir::LLVM::SubOp>(
index.getLoc(), index.getType(),
- rewriter.create<mlir::LLVM::ConstantOp>(
- index.getLoc(), index.getType(),
- mlir::IntegerAttr::get(index.getType(), 0)),
+ rewriter.create<mlir::LLVM::ConstantOp>(index.getLoc(),
+ index.getType(), 0),
index);
rewriter.eraseOp(sub);
}
@@ -648,8 +646,7 @@ mlir::LogicalResult CIRToLLVMAllocaOpLowering::matchAndRewrite(
mlir::ConversionPatternRewriter &rewriter) const {
assert(!cir::MissingFeatures::opAllocaDynAllocSize());
mlir::Value size = rewriter.create<mlir::LLVM::ConstantOp>(
- op.getLoc(), typeConverter->convertType(rewriter.getIndexType()),
- rewriter.getIntegerAttr(rewriter.getIndexType(), 1));
+ op.getLoc(), typeConverter->convertType(rewriter.getIndexType()), 1);
mlir::Type elementTy =
convertTypeForMemory(*getTypeConverter(), dataLayout, op.getAllocaType());
mlir::Type resultTy = convertTypeForMemory(*getTypeConverter(), dataLayout,
@@ -1111,18 +1108,16 @@ mlir::LogicalResult CIRToLLVMUnaryOpLowering::matchAndRewrite(
switch (op.getKind()) {
case cir::UnaryOpKind::Inc: {
assert(!isVector && "++ not allowed on vector types");
- mlir::LLVM::ConstantOp one = rewriter.create<mlir::LLVM::ConstantOp>(
- loc, llvmType, mlir::IntegerAttr::get(llvmType, 1));
+ auto one = rewriter.create<mlir::LLVM::ConstantOp>(loc, llvmType, 1);
rewriter.replaceOpWithNewOp<mlir::LLVM::AddOp>(
op, llvmType, adaptor.getInput(), one, maybeNSW);
return mlir::success();
}
case cir::UnaryOpKind::Dec: {
assert(!isVector && "-- not allowed on vector types");
- mlir::LLVM::ConstantOp one = rewriter.create<mlir::LLVM::ConstantOp>(
- loc, llvmType, mlir::IntegerAttr::get(llvmType, 1));
- rewriter.replaceOpWithNewOp<mlir::LLVM::SubOp>(
- op, llvmType, adaptor.getInput(), one, maybeNSW);
+ auto one = rewriter.create<mlir::LLVM::ConstantOp>(loc, llvmType, 1);
+ rewriter.replaceOpWithNewOp<mlir::LLVM::SubOp>(op, adaptor.getInput(),
+ one, maybeNSW);
return mlir::success();
}
case cir::UnaryOpKind::Plus:
@@ -1133,10 +1128,9 @@ mlir::LogicalResult CIRToLLVMUnaryOpLowering::matchAndRewrite(
if (isVector)
zero = rewriter.create<mlir::LLVM::ZeroOp>(loc, llvmType);
else
- zero = rewriter.create<mlir::LLVM::ConstantOp>(
- loc, llvmType, mlir::IntegerAttr::get(llvmType, 0));
+ zero = rewriter.create<mlir::LLVM::ConstantOp>(loc, llvmType, 0);
rewriter.replaceOpWithNewOp<mlir::LLVM::SubOp>(
- op, llvmType, zero, adaptor.getInput(), maybeNSW);
+ op, zero, adaptor.getInput(), maybeNSW);
return mlir::success();
}
case cir::UnaryOpKind::Not: {
@@ -1150,11 +1144,10 @@ mlir::LogicalResult CIRToLLVMUnaryOpLowering::matchAndRewrite(
minusOne =
rewriter.create<mlir::LLVM::ConstantOp>(loc, llvmType, denseVec);
} else {
- minusOne = rewriter.create<mlir::LLVM::ConstantOp>(
- loc, llvmType, mlir::IntegerAttr::get(llvmType, -1));
+ minusOne = rewriter.create<mlir::LLVM::ConstantOp>(loc, llvmType, -1);
}
- rewriter.replaceOpWithNewOp<mlir::LLVM::XOrOp>(
- op, llvmType, adaptor.getInput(), minusOne);
+ rewriter.replaceOpWithNewOp<mlir::LLVM::XOrOp>(op, adaptor.getInput(),
+ minusOne);
return mlir::success();
}
}
@@ -1206,10 +1199,9 @@ mlir::LogicalResult CIRToLLVMUnaryOpLowering::matchAndRewrite(
return op.emitError() << "Unsupported unary operation on boolean type";
case cir::UnaryOpKind::Not: {
assert(!isVector && "NYI: op! on vector mask");
- mlir::LLVM::ConstantOp one = rewriter.create<mlir::LLVM::ConstantOp>(
- loc, llvmType, rewriter.getIntegerAttr(llvmType, 1));
- rewriter.replaceOpWithNewOp<mlir::LLVM::XOrOp>(op, llvmType,
- adaptor.getInput(), one);
+ auto one = rewriter.create<mlir::LLVM::ConstantOp>(loc, llvmType, 1);
+ rewriter.replaceOpWithNewOp<mlir::LLVM::XOrOp>(op, adaptor.getInput(),
+ one);
return mlir::success();
}
}
diff --git a/clang/unittests/CIR/PointerLikeTest.cpp b/clang/unittests/CIR/PointerLikeTest.cpp
index c0da271d56d4c..22690f2834cc4 100644
--- a/clang/unittests/CIR/PointerLikeTest.cpp
+++ b/clang/unittests/CIR/PointerLikeTest.cpp
@@ -47,12 +47,10 @@ class CIROpenACCPointerLikeTest : public ::testing::Test {
llvm::StringMap<unsigned> recordNames;
mlir::IntegerAttr getAlignOne(mlir::MLIRContext *ctx) {
- // Note that mlir::IntegerType is used instead of cir::IntType here
- // because we don't need sign information for this to be useful, so keep
- // it simple.
+ // Note that mlir::IntegerType is used instead of cir::IntType here because
+ // we don't need sign information for this to be useful, so keep it simple.
clang::CharUnits align = clang::CharUnits::One();
- return mlir::IntegerAttr::get(mlir::IntegerType::get(ctx, 64),
- align.getQuantity());
+ return b.getI64IntegerAttr(align.getQuantity());
}
mlir::StringAttr getUniqueRecordName(const std::string &baseName) {
``````````
</details>
https://github.com/llvm/llvm-project/pull/141830
More information about the cfe-commits
mailing list