summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/IPO/MergeFunctions.cpp
diff options
context:
space:
mode:
authorStepan Dyatkovskiy <stpworld@narod.ru>2014-06-20 19:11:56 +0000
committerStepan Dyatkovskiy <stpworld@narod.ru>2014-06-20 19:11:56 +0000
commit6baeb8805cd69638ae7c5882826c15a1394a3b79 (patch)
treef9be5d29c8b8209cd68448b59d7dc853b65a94aa /llvm/lib/Transforms/IPO/MergeFunctions.cpp
parentf67d999ebb3c2c0e5ec00b73ef7907954ae13ced (diff)
downloadbcm5719-llvm-6baeb8805cd69638ae7c5882826c15a1394a3b79.tar.gz
bcm5719-llvm-6baeb8805cd69638ae7c5882826c15a1394a3b79.zip
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! llvm-svn: 211391
Diffstat (limited to 'llvm/lib/Transforms/IPO/MergeFunctions.cpp')
-rw-r--r--llvm/lib/Transforms/IPO/MergeFunctions.cpp7
1 files changed, 6 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/IPO/MergeFunctions.cpp b/llvm/lib/Transforms/IPO/MergeFunctions.cpp
index c9b4af76913..c66df600700 100644
--- a/llvm/lib/Transforms/IPO/MergeFunctions.cpp
+++ b/llvm/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 =
OpenPOWER on IntegriCloud