llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clangir Author: Arseniy Obolenskiy (aobolensk) <details> <summary>Changes</summary> The result was always in the default address space, so objects in other address spaces left an unrealized_conversion_cast and failed LLVM translation --- Full diff: https://github.com/llvm/llvm-project/pull/238495.diff 4 Files Affected: - (modified) clang/include/clang/CIR/Dialect/IR/CIROps.td (+9-2) - (modified) clang/include/clang/CIR/Dialect/IR/CIRTypeConstraints.td (+1-3) - (modified) clang/lib/CIR/CodeGen/CIRGenClass.cpp (-1) - (modified) clang/test/CIR/CodeGen/base-class-addrspace.cpp (+18-14) ``````````diff diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td index bd762aae3e1d7..b289127db10f7 100644 --- a/clang/include/clang/CIR/Dialect/IR/CIROps.td +++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td @@ -3705,7 +3705,14 @@ def CIR_VTableAddrPointOp : CIR_Op<"vtable.address_point", [ // VTableGetVPtr //===----------------------------------------------------------------------===// -def CIR_VTableGetVPtrOp : CIR_Op<"vtable.get_vptr", [Pure]> { +def CIR_VTableGetVPtrOp : CIR_Op<"vtable.get_vptr", [ + Pure, + TypesMatchWith< + "result is a vptr pointer in the address space of 'src'", "src", + "result", + "cir::PointerType::get(cir::VPtrType::get($_self.getContext()), " + "mlir::cast<cir::PointerType>($_self).getAddrSpace())"> +]> { let summary = "Get a the address of the vtable pointer for an object"; let description = [{ The `vtable.get_vptr` operation retrieves the address of the vptr for a @@ -3714,7 +3721,7 @@ def CIR_VTableGetVPtrOp : CIR_Op<"vtable.get_vptr", [Pure]> { The vptr will always be at offset zero in the object, but this operation is more explicit about what is being retrieved than a direct bitcast. - The return type is always `!cir.ptr<!cir.vptr>`. + The return type is `!cir.ptr<!cir.vptr>` in the address space of `src`. Example: ``` diff --git a/clang/include/clang/CIR/Dialect/IR/CIRTypeConstraints.td b/clang/include/clang/CIR/Dialect/IR/CIRTypeConstraints.td index a5a33b175ca3a..b62fc2bac937f 100644 --- a/clang/include/clang/CIR/Dialect/IR/CIRTypeConstraints.td +++ b/clang/include/clang/CIR/Dialect/IR/CIRTypeConstraints.td @@ -455,9 +455,7 @@ def CIR_AnyDataMemberType : CIR_TypeBase<"::cir::DataMemberType", def CIR_AnyVPtrType : CIR_TypeBase<"::cir::VPtrType", "vptr type">, BuildableType<"$_builder.getType<" # cppType # ">()">; -def CIR_PtrToVPtr : CIR_PtrToType<CIR_AnyVPtrType>, - BuildableType<"$_builder.getType<" # cppType # ">(" - "$_builder.getType<::cir::VPtrType>())">; +def CIR_PtrToVPtr : CIR_PtrToType<CIR_AnyVPtrType>; //===----------------------------------------------------------------------===// // Scalar Type predicates diff --git a/clang/lib/CIR/CodeGen/CIRGenClass.cpp b/clang/lib/CIR/CodeGen/CIRGenClass.cpp index 738f546467243..6bd11b50df058 100644 --- a/clang/lib/CIR/CodeGen/CIRGenClass.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenClass.cpp @@ -455,7 +455,6 @@ void CIRGenFunction::initializeVTablePointer(mlir::Location loc, // // vtable field is derived from `this` pointer, therefore they should be in // the same addr space. - assert(!cir::MissingFeatures::addressSpace()); auto vtablePtr = cir::VTableGetVPtrOp::create(builder, loc, classAddr.getPointer()); Address vtableField = Address(vtablePtr, classAddr.getAlignment()); diff --git a/clang/test/CIR/CodeGen/base-class-addrspace.cpp b/clang/test/CIR/CodeGen/base-class-addrspace.cpp index 25126600acabe..a974efd76e4e2 100644 --- a/clang/test/CIR/CodeGen/base-class-addrspace.cpp +++ b/clang/test/CIR/CodeGen/base-class-addrspace.cpp @@ -5,11 +5,6 @@ // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm %s -o %t.ll // RUN: FileCheck --input-file=%t.ll %s -check-prefix=OGCG -// FIXME: Add LLVM and OGCG checks for the virtual base once cir.vtable.get_vptr -// keeps the address space. -// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir -DVBASE %s -o %t-vbase.cir -// RUN: FileCheck --input-file=%t-vbase.cir %s -check-prefix=CIR-VBASE - // A base or derived class subobject is in the address space of the object. #define AS1 __attribute__((address_space(1))) @@ -104,17 +99,26 @@ AS3 D *to_derived_as3(AS3 B *b) { return static_cast<AS3 D *>(b); } // OGCG: %[[DERIVED:.*]] = getelementptr inbounds i8, ptr addrspace(3) %{{.*}}, i64 -4 // OGCG: phi ptr addrspace(3) [ %[[DERIVED]], %{{.*}} ], [ null, %{{.*}} ] -#ifdef VBASE struct V { int v; }; struct W : virtual V { int w; }; AS1 V *to_virtual_base(AS1 W *w) { return w; } -// CIR-VBASE-LABEL: cir.func {{.*}}@_Z15to_virtual_basePU3AS11W -// CIR-VBASE: cir.ternary -// CIR-VBASE: cir.const #cir.ptr<null> : !cir.ptr<!rec_V, target_address_space(1)> -// CIR-VBASE: }, false { -// CIR-VBASE: %[[BYTES:.*]] = cir.cast bitcast %{{.*}} : !cir.ptr<!rec_W, target_address_space(1)> -> !cir.ptr<!u8i, target_address_space(1)> -// CIR-VBASE: cir.ptr_stride %[[BYTES]], %{{.*}} : (!cir.ptr<!u8i, target_address_space(1)>, !s64i) -> !cir.ptr<!u8i, target_address_space(1)> -// CIR-VBASE: }) : (!cir.bool) -> !cir.ptr<!rec_V, target_address_space(1)> -#endif +// CIR-LABEL: cir.func {{.*}}@_Z15to_virtual_basePU3AS11W +// CIR: cir.ternary +// CIR: cir.const #cir.ptr<null> : !cir.ptr<!rec_V, target_address_space(1)> +// CIR: }, false { +// CIR: cir.vtable.get_vptr %{{.*}} : !cir.ptr<!rec_W, target_address_space(1)> -> !cir.ptr<!cir.vptr, target_address_space(1)> +// CIR: %[[BYTES:.*]] = cir.cast bitcast %{{.*}} : !cir.ptr<!rec_W, target_address_space(1)> -> !cir.ptr<!u8i, target_address_space(1)> +// CIR: cir.ptr_stride %[[BYTES]], %{{.*}} : (!cir.ptr<!u8i, target_address_space(1)>, !s64i) -> !cir.ptr<!u8i, target_address_space(1)> +// CIR: }) : (!cir.bool) -> !cir.ptr<!rec_V, target_address_space(1)> + +// LLVM-LABEL: define {{.*}}@_Z15to_virtual_basePU3AS11W +// LLVM: load ptr, ptr addrspace(1) %[[W:.*]], align 8 +// LLVM: %[[VBASE:.*]] = getelementptr i8, ptr addrspace(1) %[[W]], i64 %{{.*}} +// LLVM: phi ptr addrspace(1) [ %[[VBASE]], %{{.*}} ], [ null, %{{.*}} ] + +// OGCG-LABEL: define {{.*}}@_Z15to_virtual_basePU3AS11W +// OGCG: load ptr, ptr addrspace(1) %[[W:.*]], align 8 +// OGCG: %[[VBASE:.*]] = getelementptr inbounds i8, ptr addrspace(1) %[[W]], i64 %{{.*}} +// OGCG: phi ptr addrspace(1) [ %[[VBASE]], %{{.*}} ], [ null, %{{.*}} ] `````````` </details> https://github.com/llvm/llvm-project/pull/238495 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
