diff options
author | Jeroen Dobbelaere <jeroen.dobbelaere@synopsys.com> | 2021-07-13 10:16:41 +0200 |
---|---|---|
committer | Jeroen Dobbelaere <jeroen.dobbelaere@synopsys.com> | 2021-07-13 10:18:23 +0200 |
commit | 1d8030053d46b89e3677986d059065c6a2e7a2e1 (patch) | |
tree | a9aba3eaed68a49c4b23aabc2ef1bba19ec90e83 /llvm/lib/Transforms/Utils/InlineFunction.cpp | |
parent | d89d3dfae17d7795dc1ef013db66272020de1959 (diff) | |
download | llvm-1d8030053d46b89e3677986d059065c6a2e7a2e1.zip llvm-1d8030053d46b89e3677986d059065c6a2e7a2e1.tar.gz llvm-1d8030053d46b89e3677986d059065c6a2e7a2e1.tar.bz2 |
[NFC] Do not track calls to inlined intrinsics in IFI.
Just like intrinsics are not tracked for IFI.InlinedCalls, they should not be tracked for IFI.InlinedCallSites.
In the current top-of-tree this change is a NFC, but the full restrict patches (D68484) potentially trigger an read-after-free
if intrinsics are also added to the InlindeCallSites, due to a late optimization potentially removing some of the inlined intrinsics.
Also see https://lists.llvm.org/pipermail/llvm-dev/2021-July/151722.html for a discussion about the problem.
Reviewed By: aeubanks
Differential Revision: https://reviews.llvm.org/D105805
Diffstat (limited to 'llvm/lib/Transforms/Utils/InlineFunction.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/InlineFunction.cpp | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Utils/InlineFunction.cpp b/llvm/lib/Transforms/Utils/InlineFunction.cpp index bd9bd77..d613aab 100644 --- a/llvm/lib/Transforms/Utils/InlineFunction.cpp +++ b/llvm/lib/Transforms/Utils/InlineFunction.cpp @@ -2438,14 +2438,17 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI, // before we splice the inlined code into the CFG and lose track of which // blocks were actually inlined, collect the call sites. We only do this if // call graph updates weren't requested, as those provide value handle based - // tracking of inlined call sites instead. + // tracking of inlined call sites instead. Calls to intrinsics are not + // collected because they are not inlineable. if (InlinedFunctionInfo.ContainsCalls && !IFI.CG) { // Otherwise just collect the raw call sites that were inlined. for (BasicBlock &NewBB : make_range(FirstNewBlock->getIterator(), Caller->end())) for (Instruction &I : NewBB) if (auto *CB = dyn_cast<CallBase>(&I)) - IFI.InlinedCallSites.push_back(CB); + if (!(CB->getCalledFunction() && + CB->getCalledFunction()->isIntrinsic())) + IFI.InlinedCallSites.push_back(CB); } // If we cloned in _exactly one_ basic block, and if that block ends in a |