Skip to content

Commit 7b8a99b

Browse files
authored
[CIR][Lowering] Lower CIR ptrmask to LLVM ptrmask (#1663)
LLVM dialect now has ptrmask intrinsic, use it instead of the manual computation Fix bitwidth of the generated mask in ABIInfoImpl
1 parent ca092dd commit 7b8a99b

File tree

4 files changed

+6
-32
lines changed

4 files changed

+6
-32
lines changed

clang/include/clang/CIR/Dialect/IR/CIROps.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4933,6 +4933,8 @@ def PtrMaskOp : CIR_Op<"ptr_mask", [AllTypesMatch<["ptr", "result"]>]> {
49334933
let assemblyFormat = [{
49344934
`(` $ptr `,` $mask `:` type($mask) `)` `:` qualified(type($result)) attr-dict
49354935
}];
4936+
4937+
let llvmOp = "PtrMaskOp";
49364938
}
49374939

49384940
//===----------------------------------------------------------------------===//

clang/lib/CIR/Dialect/Transforms/TargetLowering/ABIInfoImpl.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,11 @@ mlir::Value emitRoundPointerUpToAlignment(cir::CIRBaseBuilderTy &builder,
4343
mlir::Value roundUp = builder.createPtrStride(
4444
loc, builder.createPtrBitcast(ptr, builder.getUIntNTy(8)),
4545
builder.getUnsignedInt(loc, alignment - 1, /*width=*/32));
46+
auto dataLayout = mlir::DataLayout::closest(roundUp.getDefiningOp());
4647
return builder.create<cir::PtrMaskOp>(
4748
loc, roundUp.getType(), roundUp,
48-
builder.getSignedInt(loc, -(signed)alignment, /*width=*/32));
49+
builder.getSignedInt(loc, -(signed)alignment,
50+
dataLayout.getTypeSizeInBits(roundUp.getType())));
4951
}
5052

5153
mlir::Type useFirstFieldIfTransparentUnion(mlir::Type Ty) {

clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -4205,32 +4205,6 @@ mlir::LogicalResult CIRToLLVMAbsOpLowering::matchAndRewrite(
42054205
return mlir::success();
42064206
}
42074207

4208-
mlir::LogicalResult CIRToLLVMPtrMaskOpLowering::matchAndRewrite(
4209-
cir::PtrMaskOp op, OpAdaptor adaptor,
4210-
mlir::ConversionPatternRewriter &rewriter) const {
4211-
// FIXME: We'd better to lower to mlir::LLVM::PtrMaskOp if it exists.
4212-
// So we have to make it manually here by following:
4213-
// https://llvm.org/docs/LangRef.html#llvm-ptrmask-intrinsic
4214-
auto loc = op.getLoc();
4215-
auto mask = op.getMask();
4216-
4217-
auto moduleOp = op->getParentOfType<mlir::ModuleOp>();
4218-
mlir::DataLayout layout(moduleOp);
4219-
auto iPtrIdxValue = layout.getTypeSizeInBits(mask.getType());
4220-
auto iPtrIdx = mlir::IntegerType::get(moduleOp->getContext(), iPtrIdxValue);
4221-
4222-
auto intPtr = rewriter.create<mlir::LLVM::PtrToIntOp>(
4223-
loc, iPtrIdx, adaptor.getPtr()); // this may truncate
4224-
mlir::Value masked =
4225-
rewriter.create<mlir::LLVM::AndOp>(loc, intPtr, adaptor.getMask());
4226-
mlir::Value diff = rewriter.create<mlir::LLVM::SubOp>(loc, intPtr, masked);
4227-
rewriter.replaceOpWithNewOp<mlir::LLVM::GEPOp>(
4228-
op, getTypeConverter()->convertType(op.getType()),
4229-
mlir::IntegerType::get(moduleOp->getContext(), 8), adaptor.getPtr(),
4230-
diff);
4231-
return mlir::success();
4232-
}
4233-
42344208
mlir::LogicalResult CIRToLLVMSignBitOpLowering::matchAndRewrite(
42354209
cir::SignBitOp op, OpAdaptor adaptor,
42364210
mlir::ConversionPatternRewriter &rewriter) const {
@@ -4363,7 +4337,6 @@ void populateCIRToLLVMConversionPatterns(
43634337
CIRToLLVMObjSizeOpLowering,
43644338
CIRToLLVMPrefetchOpLowering,
43654339
CIRToLLVMPtrDiffOpLowering,
4366-
CIRToLLVMPtrMaskOpLowering,
43674340
CIRToLLVMResumeOpLowering,
43684341
CIRToLLVMReturnAddrOpLowering,
43694342
CIRToLLVMRotateOpLowering,

clang/test/CIR/Lowering/var-arg-x86_64.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,7 @@ long double f2(int n, ...) {
9595
// CHECK: [[OVERFLOW_AREA:%.+]] = load ptr, ptr [[OVERFLOW_AREA_P]]
9696
// Ptr Mask Operations
9797
// CHECK: [[OVERFLOW_AREA_OFFSET_ALIGNED:%.+]] = getelementptr i8, ptr [[OVERFLOW_AREA]], i64 15
98-
// CHECK: [[OVERFLOW_AREA_OFFSET_ALIGNED_P:%.+]] = ptrtoint ptr [[OVERFLOW_AREA_OFFSET_ALIGNED]] to i32
99-
// CHECK: [[MASKED:%.+]] = and i32 [[OVERFLOW_AREA_OFFSET_ALIGNED_P]], -16
100-
// CHECK: [[DIFF:%.+]] = sub i32 [[OVERFLOW_AREA_OFFSET_ALIGNED_P]], [[MASKED]]
101-
// CHECK: [[PTR_MASKED:%.+]] = getelementptr i8, ptr [[OVERFLOW_AREA_OFFSET_ALIGNED]], i32 [[DIFF]]
98+
// CHECK: [[PTR_MASKED:%.+]] = call ptr @llvm.ptrmask.{{.*}}.[[PTR_SIZE_INT:.*]](ptr [[OVERFLOW_AREA_OFFSET_ALIGNED]], [[PTR_SIZE_INT]] -16)
10299
// CHECK: [[OVERFLOW_AREA_NEXT:%.+]] = getelementptr i8, ptr [[PTR_MASKED]], i64 16
103100
// CHECK: store ptr [[OVERFLOW_AREA_NEXT]], ptr [[OVERFLOW_AREA_P]]
104101
// CHECK: [[VALUE:%.+]] = load x86_fp80, ptr [[PTR_MASKED]]

0 commit comments

Comments
 (0)