1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 11:13:28 +01:00

[InstCombine] Properly combine metadata when replacing a load with another

Not doing this can lead to misoptimizations down the line, e.g. because
of range metadata on the replacing load excluding values that are valid
for the load that is being replaced.

llvm-svn: 241886
This commit is contained in:
Bjorn Steinbrink 2015-07-10 06:55:44 +00:00
parent 7084152bd9
commit 1a4f8db997
2 changed files with 49 additions and 1 deletions

View File

@ -749,10 +749,27 @@ Instruction *InstCombiner::visitLoadInst(LoadInst &LI) {
// where there are several consecutive memory accesses to the same location,
// separated by a few arithmetic operations.
BasicBlock::iterator BBI = &LI;
if (Value *AvailableVal = FindAvailableLoadedValue(Op, LI.getParent(), BBI,6))
AAMDNodes AATags;
if (Value *AvailableVal = FindAvailableLoadedValue(Op, LI.getParent(), BBI,
6, nullptr, &AATags)) {
if (LoadInst *NLI = dyn_cast<LoadInst>(AvailableVal)) {
unsigned KnownIDs[] = {
LLVMContext::MD_tbaa,
LLVMContext::MD_alias_scope,
LLVMContext::MD_noalias,
LLVMContext::MD_range,
LLVMContext::MD_invariant_load,
LLVMContext::MD_nonnull,
};
combineMetadata(NLI, &LI, KnownIDs);
if (AATags)
NLI->setAAMetadata(AATags);
};
return ReplaceInstUsesWith(
LI, Builder->CreateBitOrPointerCast(AvailableVal, LI.getType(),
LI.getName() + ".cast"));
}
// load(gep null, ...) -> unreachable
if (GetElementPtrInst *GEPI = dyn_cast<GetElementPtrInst>(Op)) {

View File

@ -0,0 +1,31 @@
; RUN: opt -instcombine -S < %s | FileCheck %s
target datalayout = "e-m:e-p:64:64:64-i64:64-f80:128-n8:16:32:64-S128"
; CHECK-LABEL: @test_load_load_combine_metadata(
; Check that range metadata is combined and AA metadata is preserved
; CHECK: %[[V:.*]] = load i32, i32* %0
; CHECK-SAME: !tbaa !{{[0-9]+}}
; CHECK-SAME: !range ![[RANGE:[0-9]+]]
; CHECK-SAME: !alias.scope !{{[0-9]+}}
; CHECK-SAME: !noalias !{{[0-9]+}}
; CHECK: store i32 %[[V]], i32* %1
; CHECK: store i32 %[[V]], i32* %2
define void @test_load_load_combine_metadata(i32*, i32*, i32*) {
%a = load i32, i32* %0, !tbaa !8, !range !0, !alias.scope !5, !noalias !6
%b = load i32, i32* %0, !range !1
store i32 %a, i32* %1
store i32 %b, i32* %2
ret void
}
; CHECK: ![[RANGE]] = !{i32 0, i32 1, i32 8, i32 9}
!0 = !{ i32 0, i32 1 }
!1 = !{ i32 8, i32 9 }
!2 = !{!2}
!3 = !{!3, !2}
!4 = !{!4, !2}
!5 = !{!3}
!6 = !{!4}
!7 = !{ !"tbaa root" }
!8 = !{ !7, !7, i64 0 }