diff options
Diffstat (limited to 'llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp')
-rw-r--r-- | llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp b/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp index 7410b37..274bb7e 100644 --- a/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp +++ b/llvm/lib/Transforms/IPO/WholeProgramDevirt.cpp @@ -379,6 +379,7 @@ namespace { // conditions // 1) All summaries are live. // 2) All function summaries indicate it's unreachable +// 3) There is no non-function with the same GUID (which is rare) bool mustBeUnreachableFunction(ValueInfo TheFnVI) { if ((!TheFnVI) || TheFnVI.getSummaryList().empty()) { // Returns false if ValueInfo is absent, or the summary list is empty @@ -391,12 +392,13 @@ bool mustBeUnreachableFunction(ValueInfo TheFnVI) { // In general either all summaries should be live or all should be dead. if (!Summary->isLive()) return false; - if (auto *FS = dyn_cast<FunctionSummary>(Summary.get())) { + if (auto *FS = dyn_cast<FunctionSummary>(Summary->getBaseObject())) { if (!FS->fflags().MustBeUnreachable) return false; } - // Do nothing if a non-function has the same GUID (which is rare). - // This is correct since non-function summaries are not relevant. + // Be conservative if a non-function has the same GUID (which is rare). + else + return false; } // All function summaries are live and all of them agree that the function is // unreachble. |