diff options
author | Stepan Dyatkovskiy <stpworld@narod.ru> | 2014-06-20 19:11:56 +0000 |
---|---|---|
committer | Stepan Dyatkovskiy <stpworld@narod.ru> | 2014-06-20 19:11:56 +0000 |
commit | 81ed09a1d12470917781cc8777a20f702bd2ac4b (patch) | |
tree | 8bc62399e5bef3c50ed82e3525832b0eeb9ec8cb /lib/Transforms/IPO | |
parent | 8d99e7650fc9e590544c543724af432bc57de27e (diff) | |
download | llvm-81ed09a1d12470917781cc8777a20f702bd2ac4b.tar.gz llvm-81ed09a1d12470917781cc8777a20f702bd2ac4b.tar.bz2 llvm-81ed09a1d12470917781cc8777a20f702bd2ac4b.tar.xz |
Commited patch from Björn Steinbrink:
Summary:
Different range metadata can lead to different optimizations in later
passes, possibly breaking the semantics of the merged function. So range
metadata must be taken into consideration when comparing Load
instructions.
Thanks!
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@211391 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/IPO')
-rw-r--r-- | lib/Transforms/IPO/MergeFunctions.cpp | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/lib/Transforms/IPO/MergeFunctions.cpp b/lib/Transforms/IPO/MergeFunctions.cpp index c9b4af7691..c66df60070 100644 --- a/lib/Transforms/IPO/MergeFunctions.cpp +++ b/lib/Transforms/IPO/MergeFunctions.cpp @@ -325,6 +325,7 @@ private: /// 6.1.Load: volatile (as boolean flag) /// 6.2.Load: alignment (as integer numbers) /// 6.3.Load: synch-scope (as integer numbers) + /// 6.4.Load: range metadata (as integer numbers) /// On this stage its better to see the code, since its not more than 10-15 /// strings for particular instruction, and could change sometimes. int cmpOperation(const Instruction *L, const Instruction *R) const; @@ -788,7 +789,11 @@ int FunctionComparator::cmpOperation(const Instruction *L, if (int Res = cmpNumbers(LI->getOrdering(), cast<LoadInst>(R)->getOrdering())) return Res; - return cmpNumbers(LI->getSynchScope(), cast<LoadInst>(R)->getSynchScope()); + if (int Res = + cmpNumbers(LI->getSynchScope(), cast<LoadInst>(R)->getSynchScope())) + return Res; + return cmpNumbers((uint64_t)LI->getMetadata(LLVMContext::MD_range), + (uint64_t)cast<LoadInst>(R)->getMetadata(LLVMContext::MD_range)); } if (const StoreInst *SI = dyn_cast<StoreInst>(L)) { if (int Res = |