diff options
Diffstat (limited to 'unmaintained/llvm3.9/rust-lang-llvm-pr55.patch')
-rw-r--r-- | unmaintained/llvm3.9/rust-lang-llvm-pr55.patch | 85 |
1 files changed, 0 insertions, 85 deletions
diff --git a/unmaintained/llvm3.9/rust-lang-llvm-pr55.patch b/unmaintained/llvm3.9/rust-lang-llvm-pr55.patch deleted file mode 100644 index f534f31e89..0000000000 --- a/unmaintained/llvm3.9/rust-lang-llvm-pr55.patch +++ /dev/null @@ -1,85 +0,0 @@ -From eff5dc809ed54701f2bb3e15c58d01881299cedf Mon Sep 17 00:00:00 2001 -From: David Majnemer <david.majnemer@gmail.com> -Date: Tue, 11 Oct 2016 01:00:45 +0000 -Subject: [rust-lang/llvm#55] [InstCombine] Transform !range metadata to - !nonnull when combining loads - -When combining an integer load with !range metadata that does not include 0 to a pointer load, make sure emit !nonnull metadata on the newly-created pointer load. This prevents the !nonnull metadata from being dropped during a ptrtoint/inttoptr pair. - -This fixes PR30597. - -Patch by Ariel Ben-Yehuda! - -Differential Revision: https://reviews.llvm.org/D25215 - -git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@283836 91177308-0d34-0410-b5e6-96231b3b80d8 ---- - .../InstCombine/InstCombineLoadStoreAlloca.cpp | 12 ++++++-- - test/Transforms/InstCombine/PR30597.ll | 32 ++++++++++++++++++++++ - 2 files changed, 42 insertions(+), 2 deletions(-) - create mode 100644 test/Transforms/InstCombine/PR30597.ll - -diff --git a/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp b/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp -index d312983ed51b..26f4e764501a 100644 ---- a/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp -+++ b/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp -@@ -380,8 +380,16 @@ static LoadInst *combineLoadToNewType(InstCombiner &IC, LoadInst &LI, Type *NewT - break; - case LLVMContext::MD_range: - // FIXME: It would be nice to propagate this in some way, but the type -- // conversions make it hard. If the new type is a pointer, we could -- // translate it to !nonnull metadata. -+ // conversions make it hard. -+ -+ // If it's a pointer now and the range does not contain 0, make it !nonnull. -+ if (NewTy->isPointerTy()) { -+ unsigned BitWidth = IC.getDataLayout().getTypeSizeInBits(NewTy); -+ if (!getConstantRangeFromMetadata(*N).contains(APInt(BitWidth, 0))) { -+ MDNode *NN = MDNode::get(LI.getContext(), None); -+ NewLoad->setMetadata(LLVMContext::MD_nonnull, NN); -+ } -+ } - break; - } - } -diff --git a/test/Transforms/InstCombine/PR30597.ll b/test/Transforms/InstCombine/PR30597.ll -new file mode 100644 -index 000000000000..c0803ed71204 ---- /dev/null -+++ b/test/Transforms/InstCombine/PR30597.ll -@@ -0,0 +1,32 @@ -+; RUN: opt < %s -instcombine -S | FileCheck %s -+ -+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" -+target triple = "x86_64-unknown-linux-gnu" -+ -+; Function Attrs: readonly uwtable -+define i1 @dot_ref_s(i32** noalias nocapture readonly dereferenceable(8)) { -+entry-block: -+ %loadedptr = load i32*, i32** %0, align 8, !nonnull !0 -+ %ptrtoint = ptrtoint i32* %loadedptr to i64 -+ %inttoptr = inttoptr i64 %ptrtoint to i32* -+ %switchtmp = icmp eq i32* %inttoptr, null -+ ret i1 %switchtmp -+ -+; CHECK-LABEL: @dot_ref_s -+; CHECK-NEXT: entry-block: -+; CHECK-NEXT: ret i1 false -+} -+ -+; Function Attrs: readonly uwtable -+define i64* @function(i64* noalias nocapture readonly dereferenceable(8)) { -+entry-block: -+ %loaded = load i64, i64* %0, align 8, !range !1 -+ %inttoptr = inttoptr i64 %loaded to i64* -+ ret i64* %inttoptr -+; CHECK-LABEL: @function -+; CHECK: %{{.+}} = load i64*, i64** %{{.+}}, align 8, !nonnull -+} -+ -+ -+!0 = !{} -+!1 = !{i64 1, i64 140737488355327} --- -2.9.3 - |