mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-19 19:31:50 +00:00
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
This commit is contained in:
parent
8d99e7650f
commit
81ed09a1d1
@ -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 =
|
||||
|
43
test/Transforms/MergeFunc/ranges.ll
Normal file
43
test/Transforms/MergeFunc/ranges.ll
Normal file
@ -0,0 +1,43 @@
|
||||
; RUN: opt -mergefunc -S < %s | FileCheck %s
|
||||
define i1 @cmp_with_range(i8*, i8*) {
|
||||
%v1 = load i8* %0, !range !0
|
||||
%v2 = load i8* %1, !range !0
|
||||
%out = icmp eq i8 %v1, %v2
|
||||
ret i1 %out
|
||||
}
|
||||
|
||||
define i1 @cmp_no_range(i8*, i8*) {
|
||||
; CHECK-LABEL: @cmp_no_range
|
||||
; CHECK-NEXT %v1 = load i8* %0
|
||||
; CHECK-NEXT %v2 = load i8* %1
|
||||
; CHECK-NEXT %out = icmp eq i8 %v1, %v2
|
||||
; CHECK-NEXT ret i1 %out
|
||||
%v1 = load i8* %0
|
||||
%v2 = load i8* %1
|
||||
%out = icmp eq i8 %v1, %v2
|
||||
ret i1 %out
|
||||
}
|
||||
|
||||
define i1 @cmp_different_range(i8*, i8*) {
|
||||
; CHECK-LABEL: @cmp_different_range
|
||||
; CHECK-NEXT: %v1 = load i8* %0, !range !1
|
||||
; CHECK-NEXT: %v2 = load i8* %1, !range !1
|
||||
; CHECK-NEXT: %out = icmp eq i8 %v1, %v2
|
||||
; CHECK-NEXT: ret i1 %out
|
||||
%v1 = load i8* %0, !range !1
|
||||
%v2 = load i8* %1, !range !1
|
||||
%out = icmp eq i8 %v1, %v2
|
||||
ret i1 %out
|
||||
}
|
||||
|
||||
define i1 @cmp_with_same_range(i8*, i8*) {
|
||||
; CHECK-LABEL: @cmp_with_same_range
|
||||
; CHECK: tail call i1 @cmp_with_range
|
||||
%v1 = load i8* %0, !range !0
|
||||
%v2 = load i8* %1, !range !0
|
||||
%out = icmp eq i8 %v1, %v2
|
||||
ret i1 %out
|
||||
}
|
||||
|
||||
!0 = metadata !{i8 0, i8 2}
|
||||
!1 = metadata !{i8 5, i8 7}
|
Loading…
x
Reference in New Issue
Block a user