mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
[SelectionDAG] Fix PR23603.
Summary: LLVM's MI level notion of invariant_load is different from LLVM's IR level notion of invariant_load with respect to dereferenceability. The IR notion of invariant_load only guarantees that all *non-faulting* invariant loads result in the same value. The MI notion of invariant load guarantees that the load can be legally moved to any location within its containing function. The MI notion of invariant_load is stronger than the IR notion of invariant_load -- an MI invariant_load is an IR invariant_load + a guarantee that the location being loaded from is dereferenceable throughout the function's lifetime. Reviewers: hfinkel, reames Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D10075 llvm-svn: 238881
This commit is contained in:
parent
2e71400006
commit
ac84e180d5
@ -2848,7 +2848,17 @@ void SelectionDAGBuilder::visitLoad(const LoadInst &I) {
|
||||
|
||||
bool isVolatile = I.isVolatile();
|
||||
bool isNonTemporal = I.getMetadata(LLVMContext::MD_nontemporal) != nullptr;
|
||||
bool isInvariant = I.getMetadata(LLVMContext::MD_invariant_load) != nullptr;
|
||||
|
||||
// The IR notion of invariant_load only guarantees that all *non-faulting*
|
||||
// invariant loads result in the same value. The MI notion of invariant load
|
||||
// guarantees that the load can be legally moved to any location within its
|
||||
// containing function. The MI notion of invariant_load is stronger than the
|
||||
// IR notion of invariant_load -- an MI invariant_load is an IR invariant_load
|
||||
// with a guarantee that the location being loaded from is dereferenceable
|
||||
// throughout the function's lifetime.
|
||||
|
||||
bool isInvariant = I.getMetadata(LLVMContext::MD_invariant_load) != nullptr &&
|
||||
isDereferenceablePointer(SV, *DAG.getTarget().getDataLayout());
|
||||
unsigned Alignment = I.getAlignment();
|
||||
|
||||
AAMDNodes AAInfo;
|
||||
|
24
test/CodeGen/X86/pr23603.ll
Normal file
24
test/CodeGen/X86/pr23603.ll
Normal file
@ -0,0 +1,24 @@
|
||||
; RUN: llc < %s -mtriple=x86_64-apple-darwin | FileCheck %s
|
||||
|
||||
declare void @free_v()
|
||||
|
||||
define void @f(i32* %x, i32 %c32, i32* %y) {
|
||||
; CHECK-LABEL: f
|
||||
entry:
|
||||
%v = load i32, i32* %x, !invariant.load !0
|
||||
; CHECK: movl (%rdi), %ebx
|
||||
; CHECK: free_v
|
||||
; CHECK-NOT: movl (%rdi), %ebx
|
||||
call void @free_v()
|
||||
%c = icmp ne i32 %c32, 0
|
||||
br i1 %c, label %left, label %merge
|
||||
|
||||
left:
|
||||
store i32 %v, i32* %y
|
||||
br label %merge
|
||||
|
||||
merge:
|
||||
ret void
|
||||
}
|
||||
|
||||
!0 = !{}
|
Loading…
Reference in New Issue
Block a user