Skip to content

Commit 58b62cb

Browse files
Jezurkolanza
authored andcommitted
[CIR][Lowering] Lower CIR ptrmask to LLVM ptrmask (llvm#1663)
LLVM dialect now has ptrmask intrinsic, use it instead of the manual computation Fix bitwidth of the generated mask in ABIInfoImpl
1 parent 2a65bcf commit 58b62cb

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
@@ -4206,32 +4206,6 @@ mlir::LogicalResult CIRToLLVMAbsOpLowering::matchAndRewrite(
42064206
return mlir::success();
42074207
}
42084208

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