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/unittests/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/unittests/Analysis')
| -rw-r--r-- | llvm/unittests/Analysis/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | llvm/unittests/Analysis/GlobalsModRefTest.cpp | 41 |
2 files changed, 42 insertions, 0 deletions
diff --git a/llvm/unittests/Analysis/CMakeLists.txt b/llvm/unittests/Analysis/CMakeLists.txt index 8082c54b9c6..ac8bca25d93 100644 --- a/llvm/unittests/Analysis/CMakeLists.txt +++ b/llvm/unittests/Analysis/CMakeLists.txt @@ -12,6 +12,7 @@ add_llvm_unittest(AnalysisTests CallGraphTest.cpp CFGTest.cpp CGSCCPassManagerTest.cpp + GlobalsModRefTest.cpp LazyCallGraphTest.cpp LoopInfoTest.cpp MemoryBuiltinsTest.cpp diff --git a/llvm/unittests/Analysis/GlobalsModRefTest.cpp b/llvm/unittests/Analysis/GlobalsModRefTest.cpp new file mode 100644 index 00000000000..da8b44d273f --- /dev/null +++ b/llvm/unittests/Analysis/GlobalsModRefTest.cpp @@ -0,0 +1,41 @@ +//===--- GlobalsModRefTest.cpp - Mixed TBAA unit tests --------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/Analysis/GlobalsModRef.h" +#include "llvm/AsmParser/Parser.h" +#include "llvm/Support/SourceMgr.h" +#include "gtest/gtest.h" + +using namespace llvm; + +TEST(GlobalsModRef, OptNone) { + StringRef Assembly = R"( + define void @f() optnone { + ret void + } + )"; + + LLVMContext Context; + SMDiagnostic Error; + auto M = parseAssemblyString(Assembly, Error, Context); + ASSERT_TRUE(M) << "Bad assembly?"; + + const auto &funcs = M->functions(); + ASSERT_NE(funcs.begin(), funcs.end()); + EXPECT_EQ(std::next(funcs.begin()), funcs.end()); + const Function &F = *funcs.begin(); + + Triple Trip(M->getTargetTriple()); + TargetLibraryInfoImpl TLII(Trip); + TargetLibraryInfo TLI(TLII); + llvm::CallGraph CG(*M); + + auto AAR = GlobalsAAResult::analyzeModule(*M, TLI, CG); + EXPECT_EQ(FMRB_UnknownModRefBehavior, AAR.getModRefBehavior(&F)); +} |

