================ @@ -103,30 +110,222 @@ static cl::opt<bool> ICPDUMPAFTER("icp-dumpafter", cl::init(false), cl::Hidden, cl::desc("Dump IR after transformation happens")); +// This option is meant to be used by LLVM regression test and test the +// transformation that compares vtables. +static cl::opt<bool> ICPEnableVTableCmp( + "icp-enable-vtable-cmp", cl::init(false), cl::Hidden, + cl::desc("If ThinLTO and WPD is enabled and this option is true, " + "indirect-call promotion pass will compare vtables rather than " + "functions for speculative devirtualization of virtual calls." + " If set to false, indirect-call promotion pass will always " + "compare functions.")); + +static cl::opt<float> + ICPVTableCountPercentage("icp-vtable-count-percentage", cl::init(0.99), + cl::Hidden, + cl::desc("Percentage of vtable count to compare")); + +static cl::opt<int> ICPNumAdditionalVTableLast( + "icp-num-additional-vtable-last", cl::init(0), cl::Hidden, + cl::desc("The number of additional instruction for the last candidate")); + namespace { +using VTableAddressPointOffsetValMap = + SmallDenseMap<const GlobalVariable *, SmallDenseMap<int, Constant *, 4>, 8>; + +// A struct to collect type information for a virtual call site. +struct VirtualCallSiteInfo { + // The offset from the address point to virtual function in the vtable. + uint64_t FunctionOffset; + // The instruction that computes the address point of vtable. + Instruction *VPtr; + // The compatible type used in LLVM type intrinsics. + StringRef CompatibleTypeStr; +}; + +// The key is a virtual call, and value is its type information. +using VirtualCallSiteTypeInfoMap = + SmallDenseMap<const CallBase *, VirtualCallSiteInfo, 8>; + +// Find the offset where type string is `CompatibleType`. +static std::optional<uint64_t> +getCompatibleTypeOffset(const GlobalVariable &VTableVar, + StringRef CompatibleType) { + SmallVector<MDNode *, 2> Types; // type metadata associated with a vtable. + VTableVar.getMetadata(LLVMContext::MD_type, Types); + + for (MDNode *Type : Types) ---------------- david-xl wrote:
why can it have more than one types? https://github.com/llvm/llvm-project/pull/81442 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits