llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Erich Keane (erichkeane) <details> <summary>Changes</summary> For the purposes of zeroing out a type, we need to make sure that we handle vptrs. While this seems like it is the wrong thing to do, we end up immediately initializing the vtable correctly in the constructor prologue, so this just ensures we do a memset/etc right before then. Note that the original version of this function operates on a CXXRecordDecl, so skips this type, which we cannot do, since later logic determines whether we can/should zero-init this based on whether there is zero-attrs in the zero init. --- Full diff: https://github.com/llvm/llvm-project/pull/200305.diff 2 Files Affected: - (modified) clang/include/clang/CIR/Dialect/Builder/CIRBaseBuilder.h (+3) - (modified) clang/test/CIR/CodeGen/ctor-null-init.cpp (+37) ``````````diff diff --git a/clang/include/clang/CIR/Dialect/Builder/CIRBaseBuilder.h b/clang/include/clang/CIR/Dialect/Builder/CIRBaseBuilder.h index f5222accff154..f7616045fae96 100644 --- a/clang/include/clang/CIR/Dialect/Builder/CIRBaseBuilder.h +++ b/clang/include/clang/CIR/Dialect/Builder/CIRBaseBuilder.h @@ -127,9 +127,12 @@ class CIRBaseBuilderTy : public mlir::OpBuilder { return getNullDataMemberAttr(dataMemberTy); if (auto methodTy = mlir::dyn_cast<cir::MethodType>(ty)) return getNullMethodAttr(methodTy); + if (auto vptrTy = mlir::dyn_cast<cir::VPtrType>(ty)) + return cir::ZeroAttr::get(vptrTy); if (mlir::isa<cir::BoolType>(ty)) { return getFalseAttr(); } + llvm_unreachable("Zero initializer for given type is NYI"); } diff --git a/clang/test/CIR/CodeGen/ctor-null-init.cpp b/clang/test/CIR/CodeGen/ctor-null-init.cpp index 6f31a46305ae8..6f99cfa084a55 100644 --- a/clang/test/CIR/CodeGen/ctor-null-init.cpp +++ b/clang/test/CIR/CodeGen/ctor-null-init.cpp @@ -89,3 +89,40 @@ void test_base_chain_null_init() { // OGCG: %[[TMP:.*]] = alloca %struct.G // OGCG: %[[BASE:.*]] = getelementptr inbounds i8, ptr %[[TMP]], i64 0 // OGCG: call void @llvm.memset.p0.i64(ptr{{.*}} %[[BASE]], i8 0, i64 4, i1 false) + +struct VBase { + virtual ~VBase(); +}; + +struct VDerived : VBase { + VDerived(); +}; +VDerived::VDerived() : VBase() {} + +// OGCG-LABEL: define {{.*}}@_ZN8VDerivedC2Ev +// OGCG: %[[ADDR:.*]] = getelementptr inbounds i8, ptr %[[THIS:.*]], +// OGCG: call void @llvm.memset.p0.i64(ptr align 8 %[[ADDR]], i8 0, i64 8, i1 false) +// OGCG: call void @_ZN5VBaseC2Ev(ptr noundef nonnull align 8 dereferenceable(8) %[[THIS]]) +// OGCG: store ptr getelementptr inbounds inrange(-16, 16) ({ [4 x ptr] }, ptr @_ZTV8VDerived, i32 0, i32 0, i32 2), ptr %[[THIS]], align 8 + +// CIR-LABEL: cir.func {{.*}}@_ZN5VBaseC2Ev +// CIR: cir.vtable.address_point(@_ZTV5VBase +// CIR: cir.vtable.get_vptr + +// LLVM-LABEL: define {{.*}}@_ZN5VBaseC2Ev +// LLVM: store ptr getelementptr inbounds nuw (i8, ptr @_ZTV5VBase, i64 16), ptr % +// OGCG-LABEL: define {{.*}}@_ZN5VBaseC2Ev +// OGCG: store ptr getelementptr inbounds inrange(-16, 16) ({ [4 x ptr] }, ptr @_ZTV5VBase, i32 0, i32 0, i32 2), ptr % + +// CIR-LABEL: cir.func {{.*}}@_ZN8VDerivedC2Ev +// CIR: %[[BASE:.*]] = cir.base_class_addr {{.*}} : !cir.ptr<!rec_VDerived> nonnull [0] -> !cir.ptr<!rec_VBase> +// CIR: %[[ZERO:.*]] = cir.const #cir.const_record<{#cir.zero : !cir.vptr}> : !rec_VBase +// CIR: cir.store align(8) %[[ZERO]], %[[BASE]] : !rec_VBase, !cir.ptr<!rec_VBase> +// CIR: cir.call @_ZN5VBaseC2Ev(%[[BASE]]) +// CIR: cir.vtable.address_point(@_ZTV8VDerived +// CIR: %5 = cir.vtable.get_vptr + +// LLVM-LABEL: define {{.*}}@_ZN8VDerivedC2Ev +// LLVM: store %struct.VBase zeroinitializer, ptr %[[ADDR:.*]], align 8 +// LLVM: call void @_ZN5VBaseC2Ev(ptr {{.*}}%[[ADDR]]) +// LLVM: store ptr getelementptr inbounds nuw (i8, ptr @_ZTV8VDerived, i64 16), ptr %[[ADDR]] `````````` </details> https://github.com/llvm/llvm-project/pull/200305 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
