diff options
Diffstat (limited to 'patches/llvm_host/llvm-0008-dont-widen-metadata-on-store-to-load-forwarding.patch')
-rw-r--r-- | patches/llvm_host/llvm-0008-dont-widen-metadata-on-store-to-load-forwarding.patch | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/patches/llvm_host/llvm-0008-dont-widen-metadata-on-store-to-load-forwarding.patch b/patches/llvm_host/llvm-0008-dont-widen-metadata-on-store-to-load-forwarding.patch new file mode 100644 index 00000000..b66584dc --- /dev/null +++ b/patches/llvm_host/llvm-0008-dont-widen-metadata-on-store-to-load-forwarding.patch @@ -0,0 +1,107 @@ +From 3c80c2658022201214241e9229ac35097cc476d2 Mon Sep 17 00:00:00 2001 +From: Eli Friedman <eli.friedman@gmail.com> +Date: Thu, 16 Jun 2016 02:33:42 +0000 +Subject: [PATCH] [InstCombine] Don't widen metadata on store-to-load + forwarding + +The original check for load CSE or store-to-load forwarding is wrong +when the forwarded stored value happened to be a load. + +Ref https://github.com/JuliaLang/julia/issues/16894 + +Differential Revision: http://reviews.llvm.org/D21271 + +Patch by Yichao Yu! + +git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@272868 91177308-0d34-0410-b5e6-96231b3b80d8 + +Alpine maintainer notes: + - Updated for llvm 3.8.1. + - Corresponds to llvm-D21271-instcombine-tbaa-3.8.patch in Julia. +--- + include/llvm/Analysis/Loads.h | 3 ++- + lib/Analysis/Loads.cpp | 5 ++++- + .../InstCombine/InstCombineLoadStoreAlloca.cpp | 6 ++++-- + test/Transforms/InstCombine/tbaa-store-to-load.ll | 17 +++++++++++++++++ + 4 files changed, 27 insertions(+), 4 deletions(-) + create mode 100644 test/Transforms/InstCombine/tbaa-store-to-load.ll + +diff --git a/include/llvm/Analysis/Loads.h b/include/llvm/Analysis/Loads.h +index e5bd0c8..9d24b7b 100644 +--- a/include/llvm/Analysis/Loads.h ++++ b/include/llvm/Analysis/Loads.h +@@ -82,7 +82,8 @@ Value *FindAvailableLoadedValue(LoadInst *Load, BasicBlock *ScanBB, + BasicBlock::iterator &ScanFrom, + unsigned MaxInstsToScan = DefMaxInstsToScan, + AliasAnalysis *AA = nullptr, +- AAMDNodes *AATags = nullptr); ++ AAMDNodes *AATags = nullptr, ++ bool *IsLoadCSE = nullptr); + + } + +diff --git a/lib/Analysis/Loads.cpp b/lib/Analysis/Loads.cpp +index dce243c..7d3fd59 100644 +--- a/lib/Analysis/Loads.cpp ++++ b/lib/Analysis/Loads.cpp +@@ -322,7 +322,8 @@ llvm::DefMaxInstsToScan("available-load-scan-limit", cl::init(6), cl::Hidden, + Value *llvm::FindAvailableLoadedValue(LoadInst *Load, BasicBlock *ScanBB, + BasicBlock::iterator &ScanFrom, + unsigned MaxInstsToScan, +- AliasAnalysis *AA, AAMDNodes *AATags) { ++ AliasAnalysis *AA, AAMDNodes *AATags, ++ bool *IsLoadCSE) { + if (MaxInstsToScan == 0) + MaxInstsToScan = ~0U; + +@@ -374,6 +375,8 @@ Value *llvm::FindAvailableLoadedValue(LoadInst *Load, BasicBlock *ScanBB, + + if (AATags) + LI->getAAMetadata(*AATags); ++ if (IsLoadCSE) ++ *IsLoadCSE = true; + return LI; + } + +diff --git a/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp b/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp +index 6a5d5a6..d312983 100644 +--- a/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp ++++ b/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp +@@ -800,10 +800,12 @@ Instruction *InstCombiner::visitLoadInst(LoadInst &LI) { + // separated by a few arithmetic operations. + BasicBlock::iterator BBI(LI); + AAMDNodes AATags; ++ bool IsLoadCSE = false; + if (Value *AvailableVal = + FindAvailableLoadedValue(Op, LI.getParent(), BBI, +- DefMaxInstsToScan, AA, &AATags)) { +- if (LoadInst *NLI = dyn_cast<LoadInst>(AvailableVal)) { ++ DefMaxInstsToScan, AA, &AATags, &IsLoadCSE)) { ++ if (IsLoadCSE) { ++ LoadInst *NLI = cast<LoadInst>(AvailableVal); + unsigned KnownIDs[] = { + LLVMContext::MD_tbaa, LLVMContext::MD_alias_scope, + LLVMContext::MD_noalias, LLVMContext::MD_range, +diff --git a/test/Transforms/InstCombine/tbaa-store-to-load.ll b/test/Transforms/InstCombine/tbaa-store-to-load.ll +new file mode 100644 +index 0000000..707be73 +--- /dev/null ++++ b/test/Transforms/InstCombine/tbaa-store-to-load.ll +@@ -0,0 +1,17 @@ ++; RUN: opt -S -instcombine < %s 2>&1 | FileCheck %s ++ ++define i64 @f(i64* %p1, i64* %p2) { ++top: ++ ; check that the tbaa is preserved ++ ; CHECK-LABEL: @f( ++ ; CHECK: %v1 = load i64, i64* %p1, align 8, !tbaa !0 ++ ; CHECK: store i64 %v1, i64* %p2, align 8 ++ ; CHECK: ret i64 %v1 ++ %v1 = load i64, i64* %p1, align 8, !tbaa !0 ++ store i64 %v1, i64* %p2, align 8 ++ %v2 = load i64, i64* %p2, align 8 ++ ret i64 %v2 ++} ++ ++!0 = !{!1, !1, i64 0} ++!1 = !{!"load_tbaa"} |