| 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 |
| |
| |
| @@ -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 |
| |
| |
| @@ -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 |
| |
| |
| @@ -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 |
| |
| |
| @@ -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"} |