diff options
| author | David Blaikie <dblaikie@gmail.com> | 2017-06-06 20:51:15 +0000 |
|---|---|---|
| committer | David Blaikie <dblaikie@gmail.com> | 2017-06-06 20:51:15 +0000 |
| commit | c662b501508200076e581beb9345a7631173a1d8 (patch) | |
| tree | 15696957eba57739e3d4608eaad909ba99e5a630 /llvm/lib/Analysis | |
| parent | 98e3e6003d996102e76118804339d42c8a8e9773 (diff) | |
| download | bcm5719-llvm-c662b501508200076e581beb9345a7631173a1d8.tar.gz bcm5719-llvm-c662b501508200076e581beb9345a7631173a1d8.zip | |
GlobalsModRef+OptNone: Don't prove readnone/other properties from an optnone function
Seems like at least one reasonable interpretation of optnone is that the
optimizer never "looks inside" a function. This fix is consistent with
that interpretation.
Specifically this came up in the situation:
f3 calls f2 calls f1
f2 is always_inline
f1 is optnone
The application of readnone to f1 (& thus to f2) caused the inliner to
kill the call to f2 as being trivially dead (without even checking the
cost function, as it happens - not sure if that's also a bug).
llvm-svn: 304833
Diffstat (limited to 'llvm/lib/Analysis')
| -rw-r--r-- | llvm/lib/Analysis/GlobalsModRef.cpp | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/llvm/lib/Analysis/GlobalsModRef.cpp b/llvm/lib/Analysis/GlobalsModRef.cpp index 33f00cb19b2..39c38798f3c 100644 --- a/llvm/lib/Analysis/GlobalsModRef.cpp +++ b/llvm/lib/Analysis/GlobalsModRef.cpp @@ -475,7 +475,10 @@ void GlobalsAAResult::AnalyzeCallGraph(CallGraph &CG, Module &M) { const std::vector<CallGraphNode *> &SCC = *I; assert(!SCC.empty() && "SCC with no functions?"); - if (!SCC[0]->getFunction() || !SCC[0]->getFunction()->isDefinitionExact()) { + Function *F = SCC[0]->getFunction(); + + if (!F || !F->isDefinitionExact() || + F->hasFnAttribute(Attribute::OptimizeNone)) { // Calls externally or not exact - can't say anything useful. Remove any // existing function records (may have been created when scanning // globals). @@ -484,13 +487,12 @@ void GlobalsAAResult::AnalyzeCallGraph(CallGraph &CG, Module &M) { continue; } - FunctionInfo &FI = FunctionInfos[SCC[0]->getFunction()]; + FunctionInfo &FI = FunctionInfos[F]; bool KnowNothing = false; // Collect the mod/ref properties due to called functions. We only compute // one mod-ref set. for (unsigned i = 0, e = SCC.size(); i != e && !KnowNothing; ++i) { - Function *F = SCC[i]->getFunction(); if (!F) { KnowNothing = true; break; @@ -545,6 +547,15 @@ void GlobalsAAResult::AnalyzeCallGraph(CallGraph &CG, Module &M) { for (auto *Node : SCC) { if (FI.getModRefInfo() == MRI_ModRef) break; // The mod/ref lattice saturates here. + + // Don't prove any properties based on the implementation of an optnone + // function. + if (Node->getFunction()->hasFnAttribute(Attribute::OptimizeNone)) { + FI.addModRefInfo(MRI_Ref); + FI.addModRefInfo(MRI_Mod); + continue; + } + for (Instruction &I : instructions(Node->getFunction())) { if (FI.getModRefInfo() == MRI_ModRef) break; // The mod/ref lattice saturates here. |

