[WPD] Use new llvm.public.type.test intrinsic for potentially publicly visible classes
authorArthur Eubanks <aeubanks@google.com>
Thu, 30 Jun 2022 22:18:04 +0000 (15:18 -0700)
committerArthur Eubanks <aeubanks@google.com>
Tue, 26 Jul 2022 15:01:08 +0000 (08:01 -0700)
commit2eade1dba4a8d6e1c6867e9127bcd88cf4e55976
tree080ccfec588a3231d14022bc922f5c05e9a11adb
parente43621b09c9741d2e3a8a3d8ed216699af5ff8ba
[WPD] Use new llvm.public.type.test intrinsic for potentially publicly visible classes

Turning on opaque pointers has uncovered an issue with WPD where we currently pattern match away `assume(type.test)` in WPD so that a later LTT doesn't resolve the type test to undef and introduce an `assume(false)`. The pattern matching can fail in cases where we transform two `assume(type.test)`s into `assume(phi(type.test.1, type.test.2))`.

Currently we create `assume(type.test)` for all virtual calls that might be devirtualized. This is to support `-Wl,--lto-whole-program-visibility`.

To prevent this, all virtual calls that may not be in the same LTO module instead use a new `llvm.public.type.test` intrinsic in place of the `llvm.type.test`. Then when we know if `-Wl,--lto-whole-program-visibility` is passed or not, we can either replace all `llvm.public.type.test` with `llvm.type.test`, or replace all `llvm.public.type.test` with `true`. This prevents WPD from trying to pattern match away `assume(type.test)` for public virtual calls when failing the pattern matching will result in miscompiles.

Reviewed By: tejohnson

Differential Revision: https://reviews.llvm.org/D128955
26 files changed:
clang/lib/CodeGen/CGClass.cpp
clang/lib/CodeGen/ItaniumCXXABI.cpp
clang/test/CodeGenCXX/cfi-mfcall.cpp
clang/test/CodeGenCXX/thinlto-distributed-type-metadata.cpp
clang/test/CodeGenCXX/thinlto_public_type_test_distributed.ll [new file with mode: 0644]
clang/test/CodeGenCXX/type-metadata.cpp
lld/test/ELF/lto/update_public_type_test.ll [new file with mode: 0644]
llvm/include/llvm/IR/Intrinsics.td
llvm/include/llvm/IR/ModuleSummaryIndex.h
llvm/include/llvm/LTO/legacy/LTOCodeGenerator.h
llvm/include/llvm/Transforms/IPO/WholeProgramDevirt.h
llvm/lib/Analysis/ModuleSummaryAnalysis.cpp
llvm/lib/Analysis/TypeMetadataUtils.cpp
llvm/lib/Bitcode/Reader/BitcodeReader.cpp
llvm/lib/IR/ModuleSummaryIndex.cpp
llvm/lib/LTO/LTO.cpp
llvm/lib/LTO/LTOBackend.cpp
llvm/lib/LTO/LTOCodeGenerator.cpp
llvm/lib/LTO/ThinLTOCodeGenerator.cpp
llvm/lib/Transforms/IPO/LowerTypeTests.cpp
llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp
llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp
llvm/test/LTO/X86/public-type-test.ll [new file with mode: 0644]
llvm/test/ThinLTO/X86/devirt_vcall_vis_public.ll
llvm/test/ThinLTO/X86/public-type-test.ll [new file with mode: 0644]
llvm/tools/llvm-lto/llvm-lto.cpp