diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td index 5f491a2372c2..6b248e70e407 100644 --- a/clang/include/clang/CIR/Dialect/IR/CIROps.td +++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td @@ -4933,6 +4933,8 @@ def PtrMaskOp : CIR_Op<"ptr_mask", [AllTypesMatch<["ptr", "result"]>]> { let assemblyFormat = [{ `(` $ptr `,` $mask `:` type($mask) `)` `:` qualified(type($result)) attr-dict }]; + + let llvmOp = "PtrMaskOp"; } //===----------------------------------------------------------------------===// diff --git a/clang/lib/CIR/Dialect/Transforms/TargetLowering/ABIInfoImpl.cpp b/clang/lib/CIR/Dialect/Transforms/TargetLowering/ABIInfoImpl.cpp index f136297b77d3..108ef5995701 100644 --- a/clang/lib/CIR/Dialect/Transforms/TargetLowering/ABIInfoImpl.cpp +++ b/clang/lib/CIR/Dialect/Transforms/TargetLowering/ABIInfoImpl.cpp @@ -43,9 +43,11 @@ mlir::Value emitRoundPointerUpToAlignment(cir::CIRBaseBuilderTy &builder, mlir::Value roundUp = builder.createPtrStride( loc, builder.createPtrBitcast(ptr, builder.getUIntNTy(8)), builder.getUnsignedInt(loc, alignment - 1, /*width=*/32)); + auto dataLayout = mlir::DataLayout::closest(roundUp.getDefiningOp()); return builder.create( loc, roundUp.getType(), roundUp, - builder.getSignedInt(loc, -(signed)alignment, /*width=*/32)); + builder.getSignedInt(loc, -(signed)alignment, + dataLayout.getTypeSizeInBits(roundUp.getType()))); } mlir::Type useFirstFieldIfTransparentUnion(mlir::Type Ty) { diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp index 66dce5d80d08..aa9052d7d21e 100644 --- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp +++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp @@ -4214,32 +4214,6 @@ mlir::LogicalResult CIRToLLVMAbsOpLowering::matchAndRewrite( return mlir::success(); } -mlir::LogicalResult CIRToLLVMPtrMaskOpLowering::matchAndRewrite( - cir::PtrMaskOp op, OpAdaptor adaptor, - mlir::ConversionPatternRewriter &rewriter) const { - // FIXME: We'd better to lower to mlir::LLVM::PtrMaskOp if it exists. - // So we have to make it manually here by following: - // https://llvm.org/docs/LangRef.html#llvm-ptrmask-intrinsic - auto loc = op.getLoc(); - auto mask = op.getMask(); - - auto moduleOp = op->getParentOfType(); - mlir::DataLayout layout(moduleOp); - auto iPtrIdxValue = layout.getTypeSizeInBits(mask.getType()); - auto iPtrIdx = mlir::IntegerType::get(moduleOp->getContext(), iPtrIdxValue); - - auto intPtr = rewriter.create( - loc, iPtrIdx, adaptor.getPtr()); // this may truncate - mlir::Value masked = - rewriter.create(loc, intPtr, adaptor.getMask()); - mlir::Value diff = rewriter.create(loc, intPtr, masked); - rewriter.replaceOpWithNewOp( - op, getTypeConverter()->convertType(op.getType()), - mlir::IntegerType::get(moduleOp->getContext(), 8), adaptor.getPtr(), - diff); - return mlir::success(); -} - mlir::LogicalResult CIRToLLVMSignBitOpLowering::matchAndRewrite( cir::SignBitOp op, OpAdaptor adaptor, mlir::ConversionPatternRewriter &rewriter) const { @@ -4372,7 +4346,6 @@ void populateCIRToLLVMConversionPatterns( CIRToLLVMObjSizeOpLowering, CIRToLLVMPrefetchOpLowering, CIRToLLVMPtrDiffOpLowering, - CIRToLLVMPtrMaskOpLowering, CIRToLLVMResumeOpLowering, CIRToLLVMReturnAddrOpLowering, CIRToLLVMRotateOpLowering, diff --git a/clang/test/CIR/Lowering/var-arg-x86_64.c b/clang/test/CIR/Lowering/var-arg-x86_64.c index 438cf9cb8d1a..5a33c4a84fa3 100644 --- a/clang/test/CIR/Lowering/var-arg-x86_64.c +++ b/clang/test/CIR/Lowering/var-arg-x86_64.c @@ -95,10 +95,7 @@ long double f2(int n, ...) { // CHECK: [[OVERFLOW_AREA:%.+]] = load ptr, ptr [[OVERFLOW_AREA_P]] // Ptr Mask Operations // CHECK: [[OVERFLOW_AREA_OFFSET_ALIGNED:%.+]] = getelementptr i8, ptr [[OVERFLOW_AREA]], i64 15 -// CHECK: [[OVERFLOW_AREA_OFFSET_ALIGNED_P:%.+]] = ptrtoint ptr [[OVERFLOW_AREA_OFFSET_ALIGNED]] to i32 -// CHECK: [[MASKED:%.+]] = and i32 [[OVERFLOW_AREA_OFFSET_ALIGNED_P]], -16 -// CHECK: [[DIFF:%.+]] = sub i32 [[OVERFLOW_AREA_OFFSET_ALIGNED_P]], [[MASKED]] -// CHECK: [[PTR_MASKED:%.+]] = getelementptr i8, ptr [[OVERFLOW_AREA_OFFSET_ALIGNED]], i32 [[DIFF]] +// CHECK: [[PTR_MASKED:%.+]] = call ptr @llvm.ptrmask.{{.*}}.[[PTR_SIZE_INT:.*]](ptr [[OVERFLOW_AREA_OFFSET_ALIGNED]], [[PTR_SIZE_INT]] -16) // CHECK: [[OVERFLOW_AREA_NEXT:%.+]] = getelementptr i8, ptr [[PTR_MASKED]], i64 16 // CHECK: store ptr [[OVERFLOW_AREA_NEXT]], ptr [[OVERFLOW_AREA_P]] // CHECK: [[VALUE:%.+]] = load x86_fp80, ptr [[PTR_MASKED]]