aboutsummaryrefslogtreecommitdiffstats
path: root/community
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2018-06-06 13:50:48 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2018-06-06 13:51:46 +0000
commitee1d69cb00ec768fc2d3b5b63597b351475393e0 (patch)
treecb5eb66ed5092a1b407ec49d67c875d34aaaf417 /community
parentb007fd689eb3bdc8520590b1956241e997016233 (diff)
downloadaports-ee1d69cb00ec768fc2d3b5b63597b351475393e0.tar.bz2
aports-ee1d69cb00ec768fc2d3b5b63597b351475393e0.tar.xz
unmaintained/llvm3.9: move from community
only julia was using it
Diffstat (limited to 'community')
-rw-r--r--community/llvm3.9/APKBUILD219
-rw-r--r--community/llvm3.9/cmake-fix-libLLVM-name.patch26
-rw-r--r--community/llvm3.9/disable-FileSystemTest.CreateDir-perms-assert.patch61
-rw-r--r--community/llvm3.9/fix-memory-mf_exec-on-aarch64.patch33
-rw-r--r--community/llvm3.9/llvm-fix-DynamicLibrary-to-build-with-musl-libc.patch33
-rw-r--r--community/llvm3.9/llvm-fix-build-with-musl-libc.patch46
-rw-r--r--community/llvm3.9/rust-lang-llvm-pr47.patch272
-rw-r--r--community/llvm3.9/rust-lang-llvm-pr53.patch883
-rw-r--r--community/llvm3.9/rust-lang-llvm-pr54.patch103
-rw-r--r--community/llvm3.9/rust-lang-llvm-pr55.patch85
-rw-r--r--community/llvm3.9/rust-lang-llvm-pr57.patch118
11 files changed, 0 insertions, 1879 deletions
diff --git a/community/llvm3.9/APKBUILD b/community/llvm3.9/APKBUILD
deleted file mode 100644
index 2bcd857294..0000000000
--- a/community/llvm3.9/APKBUILD
+++ /dev/null
@@ -1,219 +0,0 @@
-# Contributor: Travis Tilley <ttilley@gmail.com>
-# Contributor: Mitch Tishmack <mitch.tishmack@gmail.com>
-# Contributor: Jakub Jirutka <jakub@jirutka.cz>
-# Maintainer: Jakub Jirutka <jakub@jirutka.cz>
-_pkgname=llvm
-pkgver=3.9.1
-_majorver=${pkgver%.*}
-pkgname=$_pkgname$_majorver
-pkgrel=4
-pkgdesc="Low Level Virtual Machine compiler system (version $_majorver)"
-arch="all"
-url="http://llvm.org/"
-license="UOI-NCSA"
-depends_dev="$pkgname=$pkgver-r$pkgrel"
-makedepends="binutils-dev chrpath cmake file libffi-dev paxmark python2 zlib-dev"
-subpackages="$pkgname-static $pkgname-libs $pkgname-dev"
-source="http://llvm.org/releases/$pkgver/llvm-$pkgver.src.tar.xz
- llvm-fix-build-with-musl-libc.patch
- llvm-fix-DynamicLibrary-to-build-with-musl-libc.patch
- cmake-fix-libLLVM-name.patch
- disable-FileSystemTest.CreateDir-perms-assert.patch
- fix-memory-mf_exec-on-aarch64.patch
-
- rust-lang-llvm-pr47.patch
- rust-lang-llvm-pr53.patch
- rust-lang-llvm-pr54.patch
- rust-lang-llvm-pr55.patch
- rust-lang-llvm-pr57.patch
- "
-builddir="$srcdir/$_pkgname-$pkgver.src"
-
-# ARM has few failures in test suite that we don't care about currently and
-# also it takes forever to run them on the builder.
-case "$CARCH" in
- arm*) options="!check";;
-esac
-
-# NOTE: It seems that there's no (sane) way how to change includedir, sharedir
-# etc. separately, just the CMAKE_INSTALL_PREFIX. Standard CMake variables and
-# even LLVM-specific variables, that are related to these paths, actually
-# don't work (in llvm 3.7).
-#
-# When building a software that depends on LLVM, utility llvm-config should be
-# used to discover where is LLVM installed. It provides options to print
-# path of bindir, includedir, and libdir separately, but in its source, all
-# these paths are actually hard-coded against INSTALL_PREFIX. We can patch it
-# and move paths manually, but I'm really not sure what it may break...
-#
-# Also note that we should *not* add version suffix to files in llvm bindir!
-# It breaks build system of some software that depends on LLVM, because they
-# don't expect these files to have a sufix.
-#
-# So, we install all the LLVM files into /usr/lib/llvm$_majorver.
-# BTW, Fedora and Debian do the same thing.
-#
-_prefix="usr/lib/llvm$_majorver"
-
-prepare() {
- default_prepare
- cd "$builddir"
-
- # https://bugs.llvm.org//show_bug.cgi?id=31870
- rm test/tools/llvm-symbolizer/print_context.c
-
- # Tests added by rust-lang-llvm-pr53.patch, fails for unknown reason.
- rm test/CodeGen/ARM/dbg-range-extension.mir
- rm test/DebugInfo/MIR/X86/livedebugvalues-limit.mir
-
- # Test added by rust-lang-llvm-pr57.patch, fails for unknown reason.
- rm test/CodeGen/MIR/AArch64/inst-size-tlsdesc-callseq.mir
-
- mkdir -p "$builddir"/build
-}
-
-build() {
- cd "$builddir"/build
-
- # Auto-detect it by guessing either.
- local ffi_include_dir="$(pkg-config --cflags-only-I libffi | sed 's|^-I||g')"
-
- cmake -G "Unix Makefiles" -Wno-dev \
- -DCMAKE_BUILD_TYPE=Release \
- -DCMAKE_INSTALL_PREFIX=/$_prefix \
- -DCMAKE_VERBOSE_MAKEFILE=NO \
- -DFFI_INCLUDE_DIR="$ffi_include_dir" \
- -DLLVM_BINUTILS_INCDIR=/usr/include \
- -DLLVM_BUILD_DOCS=OFF \
- -DLLVM_BUILD_EXAMPLES=OFF \
- -DLLVM_BUILD_EXTERNAL_COMPILER_RT=ON \
- -DLLVM_BUILD_LLVM_DYLIB=ON \
- -DLLVM_BUILD_TESTS=ON \
- -DLLVM_DEFAULT_TARGET_TRIPLE="$CBUILD" \
- -DLLVM_DYLIB_EXPORT_ALL=ON \
- -DLLVM_ENABLE_ASSERTIONS=OFF \
- -DLLVM_ENABLE_CXX1Y=ON \
- -DLLVM_ENABLE_FFI=ON \
- -DLLVM_ENABLE_LIBCXX=OFF \
- -DLLVM_ENABLE_PIC=ON \
- -DLLVM_ENABLE_RTTI=ON \
- -DLLVM_ENABLE_SPHINX=OFF \
- -DLLVM_ENABLE_TERMINFO=ON \
- -DLLVM_ENABLE_ZLIB=ON \
- -DLLVM_HOST_TRIPLE="$CHOST" \
- -DLLVM_INCLUDE_EXAMPLES=OFF \
- -DLLVM_LINK_LLVM_DYLIB=ON \
- -DLLVM_TARGETS_TO_BUILD='X86;ARM;AArch64;PowerPC;SystemZ;AMDGPU;NVPTX;Mips;BPF' \
- "$builddir"
-
- make llvm-tblgen
- make
-
- paxmark m \
- bin/llvm-rtdyld \
- bin/lli \
- bin/lli-child-target \
- unittests/ExecutionEngine/MCJIT/MCJITTests \
- unittests/ExecutionEngine/Orc/OrcJITTests \
- unittests/Support/SupportTests
-}
-
-check() {
- cd "$builddir"/build
-
- make check-llvm
-}
-
-package() {
- cd "$builddir"/build
-
- make DESTDIR="$pkgdir" install
-
- # This tool is needed e.g. for running codegen tests in Rust package.
- install -D -m 755 bin/FileCheck "$pkgdir"/$_prefix/bin/FileCheck
-
- cd "$pkgdir"/$_prefix
-
- # Remove RPATHs.
- file lib/*.so bin/* \
- | awk -F: '$2~/ELF/{print $1}' \
- | xargs -r chrpath -d
-
- # Symlink files from /usr/lib/llvm*/bin to /usr/bin.
- mkdir -p "$pkgdir"/usr/bin
- local name path
- for path in bin/*; do
- name=${path##*/}
- case "$name" in
- FileCheck | obj2yaml | yaml2obj) continue;;
- esac
- ln -s ../lib/llvm$_majorver/bin/$name "$pkgdir"/usr/bin/$name-$_majorver
- done
-
- # Move /usr/lib/$pkgname/include/ into /usr/include/$pkgname/
- # and symlink it back.
- _mv include/* "$pkgdir"/usr/include/$pkgname/
- rmdir include
- ln -s ../../include/$pkgname include
-
- # Move /usr/lib/$pkgname/lib/cmake/llvm/ into /usr/lib/cmake/$pkgname/
- # and symlink it back.
- _mv lib/cmake/llvm/* "$pkgdir"/usr/lib/cmake/$pkgname/
- rmdir lib/cmake/llvm
- ln -s ../../../cmake/$pkgname lib/cmake/llvm
-}
-
-static() {
- pkgdesc="LLVM $_majorver static libraries"
-
- _mv "$pkgdir"/$_prefix/lib/*.a "$subpkgdir"/$_prefix/lib/
-}
-
-libs() {
- pkgdesc="LLVM $_majorver runtime library"
- local soname="libLLVM-$_majorver.so"
- local soname2="libLLVM-$pkgver.so"
-
- mkdir -p "$subpkgdir"
- cd "$subpkgdir"
-
- # libLLVM should be in /usr/lib. This is needed for binaries that are
- # dynamically linked with libLLVM, so they can find it on default path.
- _mv "$pkgdir"/$_prefix/lib/$soname usr/lib/
- ln -s $soname usr/lib/$soname2
-
- # And also symlink it back to the LLVM prefix.
- mkdir -p $_prefix/lib
- ln -s ../../$soname $_prefix/lib/$soname
- ln -s ../../$soname $_prefix/lib/$soname2
-}
-
-dev() {
- default_dev
- cd "$subpkgdir"
-
- _mv "$pkgdir"/$_prefix/lib $_prefix/
- _mv "$pkgdir"/$_prefix/include $_prefix/
-
- _mv "$pkgdir"/$_prefix/bin/FileCheck $_prefix/bin/
- _mv "$pkgdir"/$_prefix/bin/llvm-config $_prefix/bin/
- _mv "$pkgdir"/usr/bin/llvm-config-* usr/bin/
-}
-
-_mv() {
- local dest; for dest; do true; done # get last argument
- mkdir -p "$dest"
- mv $@
-}
-
-sha512sums="50cbe8ee911080f586e77861c442348701bd02e2de0c090c54c34f82ac275ecfcd712af0f41e387c33b4a6057778a4258a27554292fe68ab4af3fd9dd6d90683 llvm-3.9.1.src.tar.xz
-f84cd65d7042e89826ba6e8d48c4c302bf4980da369d7f19a55f217e51c00ca8ed178d453df3a3cee76598a7cecb94aed0775a6d24fe73266f82749913fc3e71 llvm-fix-build-with-musl-libc.patch
-19bfb9282455d39d07dbb2b1293b03a45c57d522fbb9c5e58dac034200669628b97e7a90cd4ff5d52d9bb79acfccbef653d8a1140a7f0589ecd6f9b7c4ba0eb6 llvm-fix-DynamicLibrary-to-build-with-musl-libc.patch
-6d1a716e5aa24e6b9a3acf4cc11e2504b1b01abf574074e9e5617b991de87d5e4e687eb18e85e73d5e632568afe2fc357771c4c96f9e136502071991496fb78c cmake-fix-libLLVM-name.patch
-49c47f125014b60d0ea7870f981a2c1708ad705793f89287ed846ee881a837a4dc0170bf467e03f2ef56177473128945287749ac80dc2d13cfabcf8b929ba58a disable-FileSystemTest.CreateDir-perms-assert.patch
-e6d925ddc71f9f2ce8a859ac519dad51cba99c07129e378a5388bb1dd2f7d5b9d5ed392e85267fd20043789c7460a7d705eb8f970b2d130edbf5a934e9505ac4 fix-memory-mf_exec-on-aarch64.patch
-a7c6056bfa3c2b76bbbc1a663ea84e5db6e269d5360afedaad5fdc3279d4732bc414e8c7d3a3f6f0d7b30ed81d8aec3fd2b35377f81db6d441b17b185d8b9bd0 rust-lang-llvm-pr47.patch
-3c35bd342de6ec40aef9af8f18cb7d9aa1d2d8e04e9f320fff7df2c828f663cc12715d86946bc6bbc19f2e99b357a07f0fd9a4acce912c9c195c6837675847d5 rust-lang-llvm-pr53.patch
-4f5418082b3bb0992a57f7abbd4187d119cf277a573f899b63af93522d823f9195a754adc56ea2a8fb2f5925b39eb82975b522c30cac275c71204cbe6d809271 rust-lang-llvm-pr54.patch
-0e38a0390b07a0764bea68dd6a7ea78b9f7b5fd8e292cc7d11f46c0358d68bd40020ca24e0c486d1e74d2a957e1fe79fd3eb29b8ac73a1531b38606605babc43 rust-lang-llvm-pr55.patch
-b9f952a71cb4f88f0657f0f2cf17b6102a303f6fab1845f3026d4889a6466b2746694752bc664228e25861abf05b76425a42f05ec4066f1b90cc6ee2deaf0a16 rust-lang-llvm-pr57.patch"
diff --git a/community/llvm3.9/cmake-fix-libLLVM-name.patch b/community/llvm3.9/cmake-fix-libLLVM-name.patch
deleted file mode 100644
index cb29fe2efc..0000000000
--- a/community/llvm3.9/cmake-fix-libLLVM-name.patch
+++ /dev/null
@@ -1,26 +0,0 @@
-Include version in name of shared libs
-
-libLLVM.so -> libLLVM-$MAJOR.$MINOR.so
-
-Source: http://pkgs.fedoraproject.org/cgit/rpms/llvm3.9.git/tree/llvm-soversion.patch?id=3dac83eaa5b88f550ae50125b14b8f644e10617b
---- a/cmake/modules/AddLLVM.cmake
-+++ b/cmake/modules/AddLLVM.cmake
-@@ -450,6 +450,18 @@
- PREFIX ""
- )
- endif()
-+
-+ # Set SOVERSION on shared libraries that lack explicit SONAME
-+ # specifier, on *nix systems that are not Darwin.
-+ if(UNIX AND NOT APPLE AND NOT ARG_SONAME)
-+ set_target_properties(${name}
-+ PROPERTIES
-+ # Concatenate the version numbers since ldconfig expects exactly
-+ # one component indicating the ABI version, while LLVM uses
-+ # major+minor for that.
-+ SOVERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}
-+ VERSION ${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}${LLVM_VERSION_SUFFIX})
-+ endif()
- endif()
-
- if(ARG_MODULE OR ARG_SHARED)
diff --git a/community/llvm3.9/disable-FileSystemTest.CreateDir-perms-assert.patch b/community/llvm3.9/disable-FileSystemTest.CreateDir-perms-assert.patch
deleted file mode 100644
index e73ce9b6f0..0000000000
--- a/community/llvm3.9/disable-FileSystemTest.CreateDir-perms-assert.patch
+++ /dev/null
@@ -1,61 +0,0 @@
-Do not assert permissions of file created in /tmp directory.
-
-This assertion fails, probably due to some specific setup of /tmp
-on build servers.
-
- FAIL: LLVM-Unit :: Support/SupportTests/FileSystemTest.CreateDir (1293 of 17222)
- ******************** TEST 'LLVM-Unit :: Support/SupportTests/FileSystemTest.CreateDir' FAILED ********************
- Note: Google Test filter = FileSystemTest.CreateDir
- [==========] Running 1 test from 1 test case.
- [----------] Global test environment set-up.
- [----------] 1 test from FileSystemTest
- [ RUN ] FileSystemTest.CreateDir
- /home/buildozer/aports/testing/llvm3.9/src/llvm-3.9.1.src/unittests/Support/Path.cpp:591: Failure
- Value of: fs::perms::owner_read | fs::perms::owner_exe
- Actual: 320
- Expected: Status.permissions() & fs::perms::all_all
- Which is: 448
-
---- a/unittests/Support/Path.cpp
-+++ b/unittests/Support/Path.cpp
-@@ -579,23 +579,23 @@
- ASSERT_NO_ERROR(fs::remove(Twine(TestDirectory) + "foo"));
-
- #ifdef LLVM_ON_UNIX
-- // Set a 0000 umask so that we can test our directory permissions.
-- mode_t OldUmask = ::umask(0000);
--
-- fs::file_status Status;
-- ASSERT_NO_ERROR(
-- fs::create_directory(Twine(TestDirectory) + "baz500", false,
-- fs::perms::owner_read | fs::perms::owner_exe));
-- ASSERT_NO_ERROR(fs::status(Twine(TestDirectory) + "baz500", Status));
-- ASSERT_EQ(Status.permissions() & fs::perms::all_all,
-- fs::perms::owner_read | fs::perms::owner_exe);
-- ASSERT_NO_ERROR(fs::create_directory(Twine(TestDirectory) + "baz777", false,
-- fs::perms::all_all));
-- ASSERT_NO_ERROR(fs::status(Twine(TestDirectory) + "baz777", Status));
-- ASSERT_EQ(Status.permissions() & fs::perms::all_all, fs::perms::all_all);
--
-- // Restore umask to be safe.
-- ::umask(OldUmask);
-+// // Set a 0000 umask so that we can test our directory permissions.
-+// mode_t OldUmask = ::umask(0000);
-+//
-+// fs::file_status Status;
-+// ASSERT_NO_ERROR(
-+// fs::create_directory(Twine(TestDirectory) + "baz500", false,
-+// fs::perms::owner_read | fs::perms::owner_exe));
-+// ASSERT_NO_ERROR(fs::status(Twine(TestDirectory) + "baz500", Status));
-+// ASSERT_EQ(Status.permissions() & fs::perms::all_all,
-+// fs::perms::owner_read | fs::perms::owner_exe);
-+// ASSERT_NO_ERROR(fs::create_directory(Twine(TestDirectory) + "baz777", false,
-+// fs::perms::all_all));
-+// ASSERT_NO_ERROR(fs::status(Twine(TestDirectory) + "baz777", Status));
-+// ASSERT_EQ(Status.permissions() & fs::perms::all_all, fs::perms::all_all);
-+//
-+// // Restore umask to be safe.
-+// ::umask(OldUmask);
- #endif
-
- #ifdef LLVM_ON_WIN32
diff --git a/community/llvm3.9/fix-memory-mf_exec-on-aarch64.patch b/community/llvm3.9/fix-memory-mf_exec-on-aarch64.patch
deleted file mode 100644
index 644c77790a..0000000000
--- a/community/llvm3.9/fix-memory-mf_exec-on-aarch64.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-Fix failures in AllocationTests/MappedMemoryTest.* on aarch64:
-
- Failing Tests (8):
- LLVM-Unit :: Support/./SupportTests/AllocationTests/MappedMemoryTest.AllocAndRelease/3
- LLVM-Unit :: Support/./SupportTests/AllocationTests/MappedMemoryTest.DuplicateNear/3
- LLVM-Unit :: Support/./SupportTests/AllocationTests/MappedMemoryTest.EnabledWrite/3
- LLVM-Unit :: Support/./SupportTests/AllocationTests/MappedMemoryTest.MultipleAllocAndRelease/3
- LLVM-Unit :: Support/./SupportTests/AllocationTests/MappedMemoryTest.SuccessiveNear/3
- LLVM-Unit :: Support/./SupportTests/AllocationTests/MappedMemoryTest.UnalignedNear/3
- LLVM-Unit :: Support/./SupportTests/AllocationTests/MappedMemoryTest.ZeroNear/3
- LLVM-Unit :: Support/./SupportTests/AllocationTests/MappedMemoryTest.ZeroSizeNear/3
-
-Upstream-Issue: https://bugs.llvm.org/show_bug.cgi?id=14278#c10
-
---- a/lib/Support/Unix/Memory.inc
-+++ b/lib/Support/Unix/Memory.inc
-@@ -54,7 +54,7 @@
- llvm::sys::Memory::MF_EXEC:
- return PROT_READ | PROT_WRITE | PROT_EXEC;
- case llvm::sys::Memory::MF_EXEC:
--#if defined(__FreeBSD__)
-+#if defined(__FreeBSD__) || (defined(__linux__) && defined(__aarch64__))
- // On PowerPC, having an executable page that has no read permission
- // can have unintended consequences. The function InvalidateInstruction-
- // Cache uses instructions dcbf and icbi, both of which are treated by
-@@ -62,6 +62,7 @@
- // executing these instructions will result in a segmentation fault.
- // Somehow, this problem is not present on Linux, but it does happen
- // on FreeBSD.
-+ // The same problem is present even on aarch64 Linux (at least on musl).
- return PROT_READ | PROT_EXEC;
- #else
- return PROT_EXEC;
diff --git a/community/llvm3.9/llvm-fix-DynamicLibrary-to-build-with-musl-libc.patch b/community/llvm3.9/llvm-fix-DynamicLibrary-to-build-with-musl-libc.patch
deleted file mode 100644
index d5d7f07b5e..0000000000
--- a/community/llvm3.9/llvm-fix-DynamicLibrary-to-build-with-musl-libc.patch
+++ /dev/null
@@ -1,33 +0,0 @@
-From d12ecb83d01dcb580dd94f4d57828f33d3eb4c35 Mon Sep 17 00:00:00 2001
-From: Natanael Copa <ncopa@alpinelinux.org>
-Date: Thu, 18 Feb 2016 15:33:21 +0100
-Subject: [PATCH 3/3] Fix DynamicLibrary to build with musl libc
-
-stdin/out/err is part of the libc and not the kernel so we check for the
-specific libc that does the unexpected instead of linux.
-
-This is needed for making it build with musl libc.
----
- lib/Support/DynamicLibrary.cpp | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/lib/Support/DynamicLibrary.cpp b/lib/Support/DynamicLibrary.cpp
-index 9a7aeb5..0c1c8f8 100644
---- a/lib/Support/DynamicLibrary.cpp
-+++ b/lib/Support/DynamicLibrary.cpp
-@@ -140,10 +140,10 @@ void* DynamicLibrary::SearchForAddressOfSymbol(const char *symbolName) {
- #define EXPLICIT_SYMBOL(SYM) \
- if (!strcmp(symbolName, #SYM)) return &SYM
-
--// On linux we have a weird situation. The stderr/out/in symbols are both
-+// On GNU libc we have a weird situation. The stderr/out/in symbols are both
- // macros and global variables because of standards requirements. So, we
- // boldly use the EXPLICIT_SYMBOL macro without checking for a #define first.
--#if defined(__linux__) and !defined(__ANDROID__)
-+#if defined(__GLIBC__)
- {
- EXPLICIT_SYMBOL(stderr);
- EXPLICIT_SYMBOL(stdout);
---
-2.7.3
-
diff --git a/community/llvm3.9/llvm-fix-build-with-musl-libc.patch b/community/llvm3.9/llvm-fix-build-with-musl-libc.patch
deleted file mode 100644
index 6ee91ea44d..0000000000
--- a/community/llvm3.9/llvm-fix-build-with-musl-libc.patch
+++ /dev/null
@@ -1,46 +0,0 @@
-From 5c571082fdaf61f6df19d9b7137dc26d71334058 Mon Sep 17 00:00:00 2001
-From: Natanael Copa <ncopa@alpinelinux.org>
-Date: Thu, 18 Feb 2016 10:33:04 +0100
-Subject: [PATCH 2/3] Fix build with musl libc
-
-On musl libc the fopen64 and fopen are the same thing, but for
-compatibility they have a `#define fopen64 fopen`. Same applies for
-fseek64, fstat64, fstatvfs64, ftello64, lstat64, stat64 and tmpfile64.
----
- include/llvm/Analysis/TargetLibraryInfo.h | 9 +++++++++
- 1 file changed, 9 insertions(+)
-
-diff --git a/include/llvm/Analysis/TargetLibraryInfo.h b/include/llvm/Analysis/TargetLibraryInfo.h
-index 7becdf0..7f14427 100644
---- a/include/llvm/Analysis/TargetLibraryInfo.h
-+++ b/include/llvm/Analysis/TargetLibraryInfo.h
-@@ -18,6 +18,26 @@
- #include "llvm/IR/Module.h"
- #include "llvm/Pass.h"
-
-+#undef fopen64
-+#undef fseeko64
-+#undef fstat64
-+#undef fstatvfs64
-+#undef ftello64
-+#undef lstat64
-+#undef stat64
-+#undef tmpfile64
-+#undef F_GETLK64
-+#undef F_SETLK64
-+#undef F_SETLKW64
-+#undef flock64
-+#undef open64
-+#undef openat64
-+#undef creat64
-+#undef lockf64
-+#undef posix_fadvise64
-+#undef posix_fallocate64
-+#undef off64_t
-+
- namespace llvm {
- /// VecDesc - Describes a possible vectorization of a function.
- /// Function 'VectorFnName' is equivalent to 'ScalarFnName' vectorized
---
-2.7.3
-
diff --git a/community/llvm3.9/rust-lang-llvm-pr47.patch b/community/llvm3.9/rust-lang-llvm-pr47.patch
deleted file mode 100644
index 245706827d..0000000000
--- a/community/llvm3.9/rust-lang-llvm-pr47.patch
+++ /dev/null
@@ -1,272 +0,0 @@
-From ae32815f9281a5a8d48014e180901fcdb658285a Mon Sep 17 00:00:00 2001
-From: David Majnemer <david.majnemer@gmail.com>
-Date: Sun, 7 Aug 2016 07:58:00 +0000
-Subject: [rust-lang/llvm#47 1/4] [InstCombine] Infer inbounds on geps of
- allocas
-
-git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277950 91177308-0d34-0410-b5e6-96231b3b80d8
----
- lib/Transforms/InstCombine/InstructionCombining.cpp | 19 +++++++++++++++++++
- test/Transforms/InstCombine/getelementptr.ll | 6 +++---
- 2 files changed, 22 insertions(+), 3 deletions(-)
-
-diff --git a/lib/Transforms/InstCombine/InstructionCombining.cpp b/lib/Transforms/InstCombine/InstructionCombining.cpp
-index 377ccb9c37f7..31b5ad6ae8af 100644
---- a/lib/Transforms/InstCombine/InstructionCombining.cpp
-+++ b/lib/Transforms/InstCombine/InstructionCombining.cpp
-@@ -1898,6 +1898,25 @@ Instruction *InstCombiner::visitGetElementPtrInst(GetElementPtrInst &GEP) {
- }
- }
-
-+ if (!GEP.isInBounds()) {
-+ unsigned PtrWidth =
-+ DL.getPointerSizeInBits(PtrOp->getType()->getPointerAddressSpace());
-+ APInt BasePtrOffset(PtrWidth, 0);
-+ Value *UnderlyingPtrOp =
-+ PtrOp->stripAndAccumulateInBoundsConstantOffsets(DL,
-+ BasePtrOffset);
-+ if (auto *AI = dyn_cast<AllocaInst>(UnderlyingPtrOp)) {
-+ if (GEP.accumulateConstantOffset(DL, BasePtrOffset) &&
-+ BasePtrOffset.isNonNegative()) {
-+ APInt AllocSize(PtrWidth, DL.getTypeAllocSize(AI->getAllocatedType()));
-+ if (BasePtrOffset.ule(AllocSize)) {
-+ return GetElementPtrInst::CreateInBounds(
-+ PtrOp, makeArrayRef(Ops).slice(1), GEP.getName());
-+ }
-+ }
-+ }
-+ }
-+
- return nullptr;
- }
-
-diff --git a/test/Transforms/InstCombine/getelementptr.ll b/test/Transforms/InstCombine/getelementptr.ll
-index 7446734e210c..14abd84fd18e 100644
---- a/test/Transforms/InstCombine/getelementptr.ll
-+++ b/test/Transforms/InstCombine/getelementptr.ll
-@@ -366,7 +366,7 @@ define i32 @test21() {
- %rval = load i32, i32* %pbobel
- ret i32 %rval
- ; CHECK-LABEL: @test21(
--; CHECK: getelementptr %intstruct, %intstruct* %pbob1, i64 0, i32 0
-+; CHECK: getelementptr inbounds %intstruct, %intstruct* %pbob1, i64 0, i32 0
- }
-
-
-@@ -540,8 +540,8 @@ define i8* @test32(i8* %v) {
- %G = load i8*, i8** %F
- ret i8* %G
- ; CHECK-LABEL: @test32(
--; CHECK: %D = getelementptr [4 x i8*], [4 x i8*]* %A, i64 0, i64 1
--; CHECK: %F = getelementptr [4 x i8*], [4 x i8*]* %A, i64 0, i64 2
-+; CHECK: %D = getelementptr inbounds [4 x i8*], [4 x i8*]* %A, i64 0, i64 1
-+; CHECK: %F = getelementptr inbounds [4 x i8*], [4 x i8*]* %A, i64 0, i64 2
- }
-
- ; PR3290
---
-2.7.4
-
-From d31c987130ff1bf9cea9a287195ecceda91c37d1 Mon Sep 17 00:00:00 2001
-From: David Majnemer <david.majnemer@gmail.com>
-Date: Sun, 7 Aug 2016 07:58:10 +0000
-Subject: [rust-lang/llvm#47 2/4] [InstSimplify] Try hard to simplify pointer
- comparisons
-
-Simplify ptrtoint comparisons involving operands with different source
-types.
-
-git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277951 91177308-0d34-0410-b5e6-96231b3b80d8
----
- lib/Analysis/InstructionSimplify.cpp | 10 ++++++++++
- test/Transforms/InstSimplify/compare.ll | 13 +++++++++++++
- 2 files changed, 23 insertions(+)
-
-diff --git a/lib/Analysis/InstructionSimplify.cpp b/lib/Analysis/InstructionSimplify.cpp
-index 7c6edbfca270..8b70d89d62cb 100644
---- a/lib/Analysis/InstructionSimplify.cpp
-+++ b/lib/Analysis/InstructionSimplify.cpp
-@@ -3092,6 +3092,16 @@ static Value *SimplifyICmpInst(unsigned Predicate, Value *LHS, Value *RHS,
- if (LHS->getType()->isPointerTy())
- if (auto *C = computePointerICmp(Q.DL, Q.TLI, Q.DT, Pred, Q.CxtI, LHS, RHS))
- return C;
-+ if (auto *CLHS = dyn_cast<PtrToIntOperator>(LHS))
-+ if (auto *CRHS = dyn_cast<PtrToIntOperator>(RHS))
-+ if (Q.DL.getTypeSizeInBits(CLHS->getPointerOperandType()) ==
-+ Q.DL.getTypeSizeInBits(CLHS->getType()) &&
-+ Q.DL.getTypeSizeInBits(CRHS->getPointerOperandType()) ==
-+ Q.DL.getTypeSizeInBits(CRHS->getType()))
-+ if (auto *C = computePointerICmp(Q.DL, Q.TLI, Q.DT, Pred, Q.CxtI,
-+ CLHS->getPointerOperand(),
-+ CRHS->getPointerOperand()))
-+ return C;
-
- if (GetElementPtrInst *GLHS = dyn_cast<GetElementPtrInst>(LHS)) {
- if (GEPOperator *GRHS = dyn_cast<GEPOperator>(RHS)) {
-diff --git a/test/Transforms/InstSimplify/compare.ll b/test/Transforms/InstSimplify/compare.ll
-index 9d6fd74ae56f..3e7316ec6b48 100644
---- a/test/Transforms/InstSimplify/compare.ll
-+++ b/test/Transforms/InstSimplify/compare.ll
-@@ -205,6 +205,19 @@ define i1 @gep16(i8* %ptr, i32 %a) {
- ; CHECK-NEXT: ret i1 false
- }
-
-+define i1 @gep17() {
-+; CHECK-LABEL: @gep17(
-+ %alloca = alloca i32, align 4
-+ %bc = bitcast i32* %alloca to [4 x i8]*
-+ %gep1 = getelementptr inbounds i32, i32* %alloca, i32 1
-+ %pti1 = ptrtoint i32* %gep1 to i32
-+ %gep2 = getelementptr inbounds [4 x i8], [4 x i8]* %bc, i32 0, i32 1
-+ %pti2 = ptrtoint i8* %gep2 to i32
-+ %cmp = icmp ugt i32 %pti1, %pti2
-+ ret i1 %cmp
-+; CHECK-NEXT: ret i1 true
-+}
-+
- define i1 @zext(i32 %x) {
- ; CHECK-LABEL: @zext(
- %e1 = zext i32 %x to i64
---
-2.7.4
-
-From bd3e05cb1f5293635edff14fcf23cfc73985c977 Mon Sep 17 00:00:00 2001
-From: David Majnemer <david.majnemer@gmail.com>
-Date: Sun, 7 Aug 2016 07:58:12 +0000
-Subject: [rust-lang/llvm#47 3/4] [InstSimplify] Fold gep (gep V, C), (sub 0,
- V) to C
-
-git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277952 91177308-0d34-0410-b5e6-96231b3b80d8
----
- lib/Analysis/InstructionSimplify.cpp | 20 ++++++++++++++++++++
- test/Transforms/InstSimplify/compare.ll | 13 +++++++++++++
- 2 files changed, 33 insertions(+)
-
-diff --git a/lib/Analysis/InstructionSimplify.cpp b/lib/Analysis/InstructionSimplify.cpp
-index 8b70d89d62cb..9d2a47957125 100644
---- a/lib/Analysis/InstructionSimplify.cpp
-+++ b/lib/Analysis/InstructionSimplify.cpp
-@@ -3597,6 +3597,26 @@ static Value *SimplifyGEPInst(Type *SrcTy, ArrayRef<Value *> Ops,
- }
- }
-
-+ // gep (gep V, C), (sub 0, V) -> C
-+ if (Q.DL.getTypeAllocSize(LastType) == 1 &&
-+ all_of(Ops.slice(1).drop_back(1),
-+ [](Value *Idx) { return match(Idx, m_Zero()); })) {
-+ unsigned PtrWidth =
-+ Q.DL.getPointerSizeInBits(Ops[0]->getType()->getPointerAddressSpace());
-+ if (Q.DL.getTypeSizeInBits(Ops.back()->getType()) == PtrWidth) {
-+ APInt BasePtrOffset(PtrWidth, 0);
-+ Value *StrippedBasePtr =
-+ Ops[0]->stripAndAccumulateInBoundsConstantOffsets(Q.DL,
-+ BasePtrOffset);
-+
-+ if (match(Ops.back(),
-+ m_Sub(m_Zero(), m_PtrToInt(m_Specific(StrippedBasePtr))))) {
-+ auto *CI = ConstantInt::get(GEPTy->getContext(), BasePtrOffset);
-+ return ConstantExpr::getIntToPtr(CI, GEPTy);
-+ }
-+ }
-+ }
-+
- // Check to see if this is constant foldable.
- for (unsigned i = 0, e = Ops.size(); i != e; ++i)
- if (!isa<Constant>(Ops[i]))
-diff --git a/test/Transforms/InstSimplify/compare.ll b/test/Transforms/InstSimplify/compare.ll
-index 3e7316ec6b48..addb63c57222 100644
---- a/test/Transforms/InstSimplify/compare.ll
-+++ b/test/Transforms/InstSimplify/compare.ll
-@@ -218,6 +218,19 @@ define i1 @gep17() {
- ; CHECK-NEXT: ret i1 true
- }
-
-+define i32 @gep18() {
-+; CHECK-LABEL: @gep18(
-+ %alloca = alloca i32, align 4 ; alloca + 0
-+ %gep = getelementptr inbounds i32, i32* %alloca, i32 1 ; alloca + 4
-+ %bc = bitcast i32* %gep to [4 x i8]* ; alloca + 4
-+ %pti = ptrtoint i32* %alloca to i32 ; alloca
-+ %sub = sub i32 0, %pti ; -alloca
-+ %add = getelementptr [4 x i8], [4 x i8]* %bc, i32 0, i32 %sub ; alloca + 4 - alloca == 4
-+ %add_to_int = ptrtoint i8* %add to i32 ; 4
-+ ret i32 %add_to_int ; 4
-+; CHECK-NEXT: ret i32 4
-+}
-+
- define i1 @zext(i32 %x) {
- ; CHECK-LABEL: @zext(
- %e1 = zext i32 %x to i64
---
-2.7.4
-
-From c3eb3c7608f439231d0c1340af6b720f113b4bf4 Mon Sep 17 00:00:00 2001
-From: David Majnemer <david.majnemer@gmail.com>
-Date: Tue, 16 Aug 2016 06:13:46 +0000
-Subject: [rust-lang/llvm#47 4/4] [InstSimplify] Fold gep (gep V, C), (xor V,
- -1) to C-1
-
-git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@278779 91177308-0d34-0410-b5e6-96231b3b80d8
----
- lib/Analysis/InstructionSimplify.cpp | 8 +++++++-
- test/Transforms/InstSimplify/compare.ll | 13 -------------
- 2 files changed, 7 insertions(+), 14 deletions(-)
-
-diff --git a/lib/Analysis/InstructionSimplify.cpp b/lib/Analysis/InstructionSimplify.cpp
-index 9d2a47957125..f7a435d1ad46 100644
---- a/lib/Analysis/InstructionSimplify.cpp
-+++ b/lib/Analysis/InstructionSimplify.cpp
-@@ -3597,7 +3597,6 @@ static Value *SimplifyGEPInst(Type *SrcTy, ArrayRef<Value *> Ops,
- }
- }
-
-- // gep (gep V, C), (sub 0, V) -> C
- if (Q.DL.getTypeAllocSize(LastType) == 1 &&
- all_of(Ops.slice(1).drop_back(1),
- [](Value *Idx) { return match(Idx, m_Zero()); })) {
-@@ -3609,11 +3608,18 @@ static Value *SimplifyGEPInst(Type *SrcTy, ArrayRef<Value *> Ops,
- Ops[0]->stripAndAccumulateInBoundsConstantOffsets(Q.DL,
- BasePtrOffset);
-
-+ // gep (gep V, C), (sub 0, V) -> C
- if (match(Ops.back(),
- m_Sub(m_Zero(), m_PtrToInt(m_Specific(StrippedBasePtr))))) {
- auto *CI = ConstantInt::get(GEPTy->getContext(), BasePtrOffset);
- return ConstantExpr::getIntToPtr(CI, GEPTy);
- }
-+ // gep (gep V, C), (xor V, -1) -> C-1
-+ if (match(Ops.back(),
-+ m_Xor(m_PtrToInt(m_Specific(StrippedBasePtr)), m_AllOnes()))) {
-+ auto *CI = ConstantInt::get(GEPTy->getContext(), BasePtrOffset - 1);
-+ return ConstantExpr::getIntToPtr(CI, GEPTy);
-+ }
- }
- }
-
-diff --git a/test/Transforms/InstSimplify/compare.ll b/test/Transforms/InstSimplify/compare.ll
-index addb63c57222..3e7316ec6b48 100644
---- a/test/Transforms/InstSimplify/compare.ll
-+++ b/test/Transforms/InstSimplify/compare.ll
-@@ -218,19 +218,6 @@ define i1 @gep17() {
- ; CHECK-NEXT: ret i1 true
- }
-
--define i32 @gep18() {
--; CHECK-LABEL: @gep18(
-- %alloca = alloca i32, align 4 ; alloca + 0
-- %gep = getelementptr inbounds i32, i32* %alloca, i32 1 ; alloca + 4
-- %bc = bitcast i32* %gep to [4 x i8]* ; alloca + 4
-- %pti = ptrtoint i32* %alloca to i32 ; alloca
-- %sub = sub i32 0, %pti ; -alloca
-- %add = getelementptr [4 x i8], [4 x i8]* %bc, i32 0, i32 %sub ; alloca + 4 - alloca == 4
-- %add_to_int = ptrtoint i8* %add to i32 ; 4
-- ret i32 %add_to_int ; 4
--; CHECK-NEXT: ret i32 4
--}
--
- define i1 @zext(i32 %x) {
- ; CHECK-LABEL: @zext(
- %e1 = zext i32 %x to i64
---
-2.7.4
-
diff --git a/community/llvm3.9/rust-lang-llvm-pr53.patch b/community/llvm3.9/rust-lang-llvm-pr53.patch
deleted file mode 100644
index 47b44808ed..0000000000
--- a/community/llvm3.9/rust-lang-llvm-pr53.patch
+++ /dev/null
@@ -1,883 +0,0 @@
-From 0d4331af6e01235479e44f9775b3fde9e19200a3 Mon Sep 17 00:00:00 2001
-From: Keith Walker <kwalker@arm.com>
-Date: Tue, 27 Sep 2016 16:46:07 +0000
-Subject: [rust-lang/llvm#53 1/2] Propagate DBG_VALUE entries when there are
- unvisited predecessors
-
-Variables are sometimes missing their debug location information in
-blocks in which the variables should be available. This would occur
-when one or more predecessor blocks had not yet been visited by the
-routine which propagated the information from predecessor blocks.
-
-This is addressed by only considering predecessor blocks which have
-already been visited.
-
-The solution to this problem was suggested by Daniel Berlin on the
-LLVM developer mailing list.
-
-Differential Revision: https://reviews.llvm.org/D24927
-
-
-git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@282506 91177308-0d34-0410-b5e6-96231b3b80d8
----
- lib/CodeGen/LiveDebugValues.cpp | 34 ++--
- test/CodeGen/ARM/dbg-range-extension.mir | 282 +++++++++++++++++++++++++++++++
- 2 files changed, 306 insertions(+), 10 deletions(-)
- create mode 100644 test/CodeGen/ARM/dbg-range-extension.mir
-
-diff --git a/lib/CodeGen/LiveDebugValues.cpp b/lib/CodeGen/LiveDebugValues.cpp
-index 4ff88d528108..4cadd5855ed5 100644
---- a/lib/CodeGen/LiveDebugValues.cpp
-+++ b/lib/CodeGen/LiveDebugValues.cpp
-@@ -201,7 +201,8 @@ private:
- VarLocInMBB &OutLocs, VarLocMap &VarLocIDs);
-
- bool join(MachineBasicBlock &MBB, VarLocInMBB &OutLocs, VarLocInMBB &InLocs,
-- const VarLocMap &VarLocIDs);
-+ const VarLocMap &VarLocIDs,
-+ SmallPtrSet<const MachineBasicBlock *, 16> &Visited);
-
- bool ExtendRanges(MachineFunction &MF);
-
-@@ -368,7 +369,8 @@ bool LiveDebugValues::transfer(MachineInstr &MI, OpenRangesSet &OpenRanges,
- /// inserting a new DBG_VALUE instruction at the start of the @MBB - if the same
- /// source variable in all the predecessors of @MBB reside in the same location.
- bool LiveDebugValues::join(MachineBasicBlock &MBB, VarLocInMBB &OutLocs,
-- VarLocInMBB &InLocs, const VarLocMap &VarLocIDs) {
-+ VarLocInMBB &InLocs, const VarLocMap &VarLocIDs,
-+ SmallPtrSet<const MachineBasicBlock *, 16> &Visited) {
- DEBUG(dbgs() << "join MBB: " << MBB.getName() << "\n");
- bool Changed = false;
-
-@@ -376,21 +378,32 @@ bool LiveDebugValues::join(MachineBasicBlock &MBB, VarLocInMBB &OutLocs,
-
- // For all predecessors of this MBB, find the set of VarLocs that
- // can be joined.
-+ int NumVisited = 0;
- for (auto p : MBB.predecessors()) {
-+ // Ignore unvisited predecessor blocks. As we are processing
-+ // the blocks in reverse post-order any unvisited block can
-+ // be considered to not remove any incoming values.
-+ if (!Visited.count(p))
-+ continue;
- auto OL = OutLocs.find(p);
- // Join is null in case of empty OutLocs from any of the pred.
- if (OL == OutLocs.end())
- return false;
-
-- // Just copy over the Out locs to incoming locs for the first predecessor.
-- if (p == *MBB.pred_begin()) {
-+ // Just copy over the Out locs to incoming locs for the first visited
-+ // predecessor, and for all other predecessors join the Out locs.
-+ if (!NumVisited)
- InLocsT = OL->second;
-- continue;
-- }
-- // Join with this predecessor.
-- InLocsT &= OL->second;
-+ else
-+ InLocsT &= OL->second;
-+ NumVisited++;
- }
-
-+ // As we are processing blocks in reverse post-order we
-+ // should have processed at least one predecessor, unless it
-+ // is the entry block which has no predecessor.
-+ assert((NumVisited || MBB.pred_empty()) &&
-+ "Should have processed at least one predecessor");
- if (InLocsT.empty())
- return false;
-
-@@ -463,6 +476,7 @@ bool LiveDebugValues::ExtendRanges(MachineFunction &MF) {
- // To solve it, we perform join() and transfer() using the two worklist method
- // until the ranges converge.
- // Ranges have converged when both worklists are empty.
-+ SmallPtrSet<const MachineBasicBlock *, 16> Visited;
- while (!Worklist.empty() || !Pending.empty()) {
- // We track what is on the pending worklist to avoid inserting the same
- // thing twice. We could avoid this with a custom priority queue, but this
-@@ -471,8 +485,8 @@ bool LiveDebugValues::ExtendRanges(MachineFunction &MF) {
- while (!Worklist.empty()) {
- MachineBasicBlock *MBB = OrderToBB[Worklist.top()];
- Worklist.pop();
-- MBBJoined = join(*MBB, OutLocs, InLocs, VarLocIDs);
--
-+ MBBJoined = join(*MBB, OutLocs, InLocs, VarLocIDs, Visited);
-+ Visited.insert(MBB);
- if (MBBJoined) {
- MBBJoined = false;
- Changed = true;
-diff --git a/test/CodeGen/ARM/dbg-range-extension.mir b/test/CodeGen/ARM/dbg-range-extension.mir
-new file mode 100644
-index 000000000000..b18f56197948
---- /dev/null
-+++ b/test/CodeGen/ARM/dbg-range-extension.mir
-@@ -0,0 +1,282 @@
-+# RUN: llc -mtriple=arm-eabi -run-pass=livedebugvalues %s -o - | FileCheck %s
-+#
-+# Check that the debug information for variables are propagated into the correct blocks.
-+#
-+# Generated from the C source:
-+#
-+# int func2(int, int);
-+# void func(int a) {
-+# int b = func2(10, 11);
-+# if (a) {
-+# int c = func2(12, 13);
-+# for(int i = 1; i < a; i++) {
-+# func2(i, i+b);
-+# }
-+# func2(b,c);
-+# }
-+# func2(b,a);
-+# }
-+
-+# CHECK: [[VAR_A:![0-9]+]] = !DILocalVariable(name: "a",
-+# CHECK: [[VAR_B:![0-9]+]] = !DILocalVariable(name: "b",
-+# CHECK: [[VAR_C:![0-9]+]] = !DILocalVariable(name: "c",
-+# CHECK: [[VAR_I:![0-9]+]] = !DILocalVariable(name: "i",
-+
-+# CHECK: bb.0.entry
-+# CHECK: DBG_VALUE debug-use %r0, debug-use _, [[VAR_A]]
-+# CHECK: DBG_VALUE debug-use [[REG_A:%r[0-9]+]], debug-use _, [[VAR_A]]
-+# CHECK: DBG_VALUE debug-use [[REG_B:%r[0-9]+]], debug-use _, [[VAR_B]]
-+
-+# CHECK: bb.1.if.then
-+# CHECK: DBG_VALUE debug-use [[REG_B]], debug-use _, [[VAR_B]]
-+# CHECK: DBG_VALUE debug-use [[REG_A]], debug-use _, [[VAR_A]]
-+# CHECK: DBG_VALUE debug-use [[REG_C:%r[0-9]+]], debug-use _, [[VAR_C]]
-+# CHECK: DBG_VALUE 1, 0, [[VAR_I]]
-+
-+# CHECK: bb.2.for.body
-+# CHECK: DBG_VALUE debug-use [[REG_I:%r[0-9]+]], debug-use _, [[VAR_I]]
-+# CHECK: DBG_VALUE debug-use [[REG_C]], debug-use _, [[VAR_C]]
-+# CHECK: DBG_VALUE debug-use [[REG_B]], debug-use _, [[VAR_B]]
-+# CHECK: DBG_VALUE debug-use [[REG_A]], debug-use _, [[VAR_A]]
-+# CHECK: DBG_VALUE debug-use [[REG_I]], debug-use _, [[VAR_I]]
-+
-+# CHECK: bb.3.for.cond
-+# CHECK: DBG_VALUE debug-use [[REG_C]], debug-use _, [[VAR_C]]
-+# CHECK: DBG_VALUE debug-use [[REG_B]], debug-use _, [[VAR_B]]
-+# CHECK: DBG_VALUE debug-use [[REG_A]], debug-use _, [[VAR_A]]
-+# CHECK: DBG_VALUE debug-use [[REG_I]], debug-use _, [[VAR_I]]
-+
-+# CHECK: bb.4.for.cond.cleanup
-+# CHECK: DBG_VALUE debug-use [[REG_I]], debug-use _, [[VAR_I]]
-+# CHECK: DBG_VALUE debug-use [[REG_C]], debug-use _, [[VAR_C]]
-+# CHECK: DBG_VALUE debug-use [[REG_B]], debug-use _, [[VAR_B]]
-+# CHECK: DBG_VALUE debug-use [[REG_A]], debug-use _, [[VAR_A]]
-+
-+# CHECK: bb.5.if.end
-+# CHECK: DBG_VALUE debug-use [[REG_B]], debug-use _, [[VAR_B]]
-+# CHECK: DBG_VALUE debug-use [[REG_A]], debug-use _, [[VAR_A]]
-+--- |
-+ ; ModuleID = '/data/kwalker/work/OpenSource-llvm/llvm/test/CodeGen/ARM/dbg-range-extension.ll'
-+ source_filename = "/data/kwalker/work/OpenSource-llvm/llvm/test/CodeGen/ARM/dbg-range-extension.ll"
-+ target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
-+ target triple = "arm---eabi"
-+
-+ ; Function Attrs: minsize nounwind optsize
-+ define void @func(i32 %a) local_unnamed_addr #0 !dbg !8 {
-+ entry:
-+ tail call void @llvm.dbg.value(metadata i32 %a, i64 0, metadata !13, metadata !20), !dbg !21
-+ %call = tail call i32 @func2(i32 10, i32 11) #0, !dbg !22
-+ tail call void @llvm.dbg.value(metadata i32 %call, i64 0, metadata !14, metadata !20), !dbg !23
-+ %tobool = icmp eq i32 %a, 0, !dbg !24
-+ br i1 %tobool, label %if.end, label %if.then, !dbg !25
-+
-+ if.then: ; preds = %entry
-+ %call1 = tail call i32 @func2(i32 12, i32 13) #0, !dbg !26
-+ tail call void @llvm.dbg.value(metadata i32 %call1, i64 0, metadata !15, metadata !20), !dbg !27
-+ tail call void @llvm.dbg.value(metadata i32 1, i64 0, metadata !18, metadata !20), !dbg !28
-+ br label %for.cond, !dbg !29
-+
-+ for.cond: ; preds = %for.body, %if.then
-+ %i.0 = phi i32 [ 1, %if.then ], [ %inc, %for.body ]
-+ tail call void @llvm.dbg.value(metadata i32 %i.0, i64 0, metadata !18, metadata !20), !dbg !28
-+ %cmp = icmp slt i32 %i.0, %a, !dbg !30
-+ br i1 %cmp, label %for.body, label %for.cond.cleanup, !dbg !33
-+
-+ for.cond.cleanup: ; preds = %for.cond
-+ %call3 = tail call i32 @func2(i32 %call, i32 %call1) #0, !dbg !34
-+ br label %if.end, !dbg !35
-+
-+ for.body: ; preds = %for.cond
-+ %0 = add i32 %call, %i.0, !dbg !36
-+ %call2 = tail call i32 @func2(i32 %i.0, i32 %0) #0, !dbg !36
-+ %inc = add nuw nsw i32 %i.0, 1, !dbg !38
-+ tail call void @llvm.dbg.value(metadata i32 %inc, i64 0, metadata !18, metadata !20), !dbg !28
-+ br label %for.cond, !dbg !40, !llvm.loop !41
-+
-+ if.end: ; preds = %for.cond.cleanup, %entry
-+ %call4 = tail call i32 @func2(i32 %call, i32 %a) #0, !dbg !43
-+ ret void, !dbg !44
-+ }
-+
-+ ; Function Attrs: minsize optsize
-+ declare i32 @func2(i32, i32) local_unnamed_addr #1
-+
-+ ; Function Attrs: nounwind readnone
-+ declare void @llvm.dbg.value(metadata, i64, metadata, metadata) #2
-+
-+ ; Function Attrs: nounwind
-+ declare void @llvm.stackprotector(i8*, i8**) #3
-+
-+ attributes #0 = { minsize nounwind optsize }
-+ attributes #1 = { minsize optsize }
-+ attributes #2 = { nounwind readnone }
-+ attributes #3 = { nounwind }
-+
-+ !llvm.dbg.cu = !{!0}
-+ !llvm.module.flags = !{!3, !4, !5, !6}
-+ !llvm.ident = !{!7}
-+
-+ !0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
-+ !1 = !DIFile(filename: "loop.c", directory: "/tmp")
-+ !2 = !{}
-+ !3 = !{i32 2, !"Dwarf Version", i32 4}
-+ !4 = !{i32 2, !"Debug Info Version", i32 3}
-+ !5 = !{i32 1, !"wchar_size", i32 4}
-+ !6 = !{i32 1, !"min_enum_size", i32 4}
-+ !7 = !{!"clang version 4.0.0 (http://llvm.org/git/clang.git b8f10df3679b36f51e1de7c4351b82d297825089) (http://llvm.org/git/llvm.git c2a5d16d1e3b8c49f5bbb1ff87a76ac4f88edb89)"}
-+ !8 = distinct !DISubprogram(name: "func", scope: !1, file: !1, line: 2, type: !9, isLocal: false, isDefinition: true, scopeLine: 2, flags: DIFlagPrototyped, isOptimized: true, unit: !0, variables: !12)
-+ !9 = !DISubroutineType(types: !10)
-+ !10 = !{null, !11}
-+ !11 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
-+ !12 = !{!13, !14, !15, !18}
-+ !13 = !DILocalVariable(name: "a", arg: 1, scope: !8, file: !1, line: 2, type: !11)
-+ !14 = !DILocalVariable(name: "b", scope: !8, file: !1, line: 3, type: !11)
-+ !15 = !DILocalVariable(name: "c", scope: !16, file: !1, line: 5, type: !11)
-+ !16 = distinct !DILexicalBlock(scope: !17, file: !1, line: 4, column: 9)
-+ !17 = distinct !DILexicalBlock(scope: !8, file: !1, line: 4, column: 6)
-+ !18 = !DILocalVariable(name: "i", scope: !19, file: !1, line: 6, type: !11)
-+ !19 = distinct !DILexicalBlock(scope: !16, file: !1, line: 6, column: 3)
-+ !20 = !DIExpression()
-+ !21 = !DILocation(line: 2, column: 15, scope: !8)
-+ !22 = !DILocation(line: 3, column: 17, scope: !8)
-+ !23 = !DILocation(line: 3, column: 13, scope: !8)
-+ !24 = !DILocation(line: 4, column: 6, scope: !17)
-+ !25 = !DILocation(line: 4, column: 6, scope: !8)
-+ !26 = !DILocation(line: 5, column: 11, scope: !16)
-+ !27 = !DILocation(line: 5, column: 7, scope: !16)
-+ !28 = !DILocation(line: 6, column: 11, scope: !19)
-+ !29 = !DILocation(line: 6, column: 7, scope: !19)
-+ !30 = !DILocation(line: 6, column: 20, scope: !31)
-+ !31 = !DILexicalBlockFile(scope: !32, file: !1, discriminator: 1)
-+ !32 = distinct !DILexicalBlock(scope: !19, file: !1, line: 6, column: 3)
-+ !33 = !DILocation(line: 6, column: 3, scope: !31)
-+ !34 = !DILocation(line: 9, column: 3, scope: !16)
-+ !35 = !DILocation(line: 10, column: 2, scope: !16)
-+ !36 = !DILocation(line: 7, column: 4, scope: !37)
-+ !37 = distinct !DILexicalBlock(scope: !32, file: !1, line: 6, column: 30)
-+ !38 = !DILocation(line: 6, column: 26, scope: !39)
-+ !39 = !DILexicalBlockFile(scope: !32, file: !1, discriminator: 3)
-+ !40 = !DILocation(line: 6, column: 3, scope: !39)
-+ !41 = distinct !{!41, !42}
-+ !42 = !DILocation(line: 6, column: 3, scope: !16)
-+ !43 = !DILocation(line: 11, column: 2, scope: !8)
-+ !44 = !DILocation(line: 12, column: 1, scope: !8)
-+
-+...
-+---
-+name: func
-+alignment: 2
-+exposesReturnsTwice: false
-+legalized: false
-+regBankSelected: false
-+selected: false
-+tracksRegLiveness: false
-+liveins:
-+ - { reg: '%r0' }
-+calleeSavedRegisters: [ '%lr', '%d8', '%d9', '%d10', '%d11', '%d12', '%d13',
-+ '%d14', '%d15', '%q4', '%q5', '%q6', '%q7', '%r4',
-+ '%r5', '%r6', '%r7', '%r8', '%r9', '%r10', '%r11',
-+ '%s16', '%s17', '%s18', '%s19', '%s20', '%s21',
-+ '%s22', '%s23', '%s24', '%s25', '%s26', '%s27',
-+ '%s28', '%s29', '%s30', '%s31', '%d8_d10', '%d9_d11',
-+ '%d10_d12', '%d11_d13', '%d12_d14', '%d13_d15',
-+ '%q4_q5', '%q5_q6', '%q6_q7', '%q4_q5_q6_q7', '%r4_r5',
-+ '%r6_r7', '%r8_r9', '%r10_r11', '%d8_d9_d10', '%d9_d10_d11',
-+ '%d10_d11_d12', '%d11_d12_d13', '%d12_d13_d14',
-+ '%d13_d14_d15', '%d8_d10_d12', '%d9_d11_d13', '%d10_d12_d14',
-+ '%d11_d13_d15', '%d8_d10_d12_d14', '%d9_d11_d13_d15',
-+ '%d9_d10', '%d11_d12', '%d13_d14', '%d9_d10_d11_d12',
-+ '%d11_d12_d13_d14' ]
-+frameInfo:
-+ isFrameAddressTaken: false
-+ isReturnAddressTaken: false
-+ hasStackMap: false
-+ hasPatchPoint: false
-+ stackSize: 24
-+ offsetAdjustment: 0
-+ maxAlignment: 4
-+ adjustsStack: true
-+ hasCalls: true
-+ maxCallFrameSize: 0
-+ hasOpaqueSPAdjustment: false
-+ hasVAStart: false
-+ hasMustTailInVarArgFunc: false
-+stack:
-+ - { id: 0, type: spill-slot, offset: -4, size: 4, alignment: 4, callee-saved-register: '%lr' }
-+ - { id: 1, type: spill-slot, offset: -8, size: 4, alignment: 4, callee-saved-register: '%r11' }
-+ - { id: 2, type: spill-slot, offset: -12, size: 4, alignment: 4, callee-saved-register: '%r7' }
-+ - { id: 3, type: spill-slot, offset: -16, size: 4, alignment: 4, callee-saved-register: '%r6' }
-+ - { id: 4, type: spill-slot, offset: -20, size: 4, alignment: 4, callee-saved-register: '%r5' }
-+ - { id: 5, type: spill-slot, offset: -24, size: 4, alignment: 4, callee-saved-register: '%r4' }
-+body: |
-+ bb.0.entry:
-+ successors: %bb.5.if.end, %bb.1.if.then
-+ liveins: %r0, %r4, %r5, %r6, %r7, %r11, %lr
-+
-+ %sp = frame-setup STMDB_UPD %sp, 14, _, killed %r4, killed %r5, killed %r6, killed %r7, killed %r11, killed %lr
-+ frame-setup CFI_INSTRUCTION def_cfa_offset 24
-+ frame-setup CFI_INSTRUCTION offset %lr, -4
-+ frame-setup CFI_INSTRUCTION offset %r11, -8
-+ frame-setup CFI_INSTRUCTION offset %r7, -12
-+ frame-setup CFI_INSTRUCTION offset %r6, -16
-+ frame-setup CFI_INSTRUCTION offset %r5, -20
-+ frame-setup CFI_INSTRUCTION offset %r4, -24
-+ DBG_VALUE debug-use %r0, debug-use _, !13, !20, debug-location !21
-+ %r4 = MOVr killed %r0, 14, _, _
-+ DBG_VALUE debug-use %r4, debug-use _, !13, !20, debug-location !21
-+ %r0 = MOVi 10, 14, _, _, debug-location !22
-+ %r1 = MOVi 11, 14, _, _, debug-location !22
-+ BL @func2, csr_aapcs, implicit-def dead %lr, implicit %sp, implicit killed %r0, implicit killed %r1, implicit-def %sp, implicit-def %r0, debug-location !22
-+ %r5 = MOVr killed %r0, 14, _, _, debug-location !22
-+ DBG_VALUE debug-use %r5, debug-use _, !14, !20, debug-location !23
-+ CMPri %r4, 0, 14, _, implicit-def %cpsr, debug-location !25
-+ Bcc %bb.5.if.end, 0, killed %cpsr
-+
-+ bb.1.if.then:
-+ successors: %bb.3.for.cond
-+ liveins: %r4, %r5
-+
-+ %r0 = MOVi 12, 14, _, _, debug-location !26
-+ %r1 = MOVi 13, 14, _, _, debug-location !26
-+ BL @func2, csr_aapcs, implicit-def dead %lr, implicit %sp, implicit killed %r0, implicit killed %r1, implicit-def %sp, implicit-def %r0, debug-location !26
-+ %r6 = MOVr killed %r0, 14, _, _, debug-location !26
-+ DBG_VALUE debug-use %r6, debug-use _, !15, !20, debug-location !27
-+ %r7 = MOVi 1, 14, _, _
-+ DBG_VALUE 1, 0, !18, !20, debug-location !28
-+ B %bb.3.for.cond
-+
-+ bb.2.for.body:
-+ successors: %bb.3.for.cond
-+ liveins: %r4, %r5, %r6, %r7
-+
-+ %r1 = ADDrr %r5, %r7, 14, _, _, debug-location !36
-+ %r0 = MOVr %r7, 14, _, _, debug-location !36
-+ BL @func2, csr_aapcs, implicit-def dead %lr, implicit %sp, implicit killed %r0, implicit killed %r1, implicit-def %sp, implicit-def dead %r0, debug-location !36
-+ %r7 = ADDri killed %r7, 1, 14, _, _, debug-location !38
-+ DBG_VALUE debug-use %r7, debug-use _, !18, !20, debug-location !28
-+
-+ bb.3.for.cond:
-+ successors: %bb.2.for.body, %bb.4.for.cond.cleanup
-+ liveins: %r4, %r5, %r6, %r7
-+
-+ DBG_VALUE debug-use %r7, debug-use _, !18, !20, debug-location !28
-+ CMPrr %r7, %r4, 14, _, implicit-def %cpsr, debug-location !33
-+ Bcc %bb.2.for.body, 11, killed %cpsr, debug-location !33
-+
-+ bb.4.for.cond.cleanup:
-+ successors: %bb.5.if.end
-+ liveins: %r4, %r5, %r6
-+
-+ %r0 = MOVr %r5, 14, _, _, debug-location !34
-+ %r1 = MOVr killed %r6, 14, _, _, debug-location !34
-+ BL @func2, csr_aapcs, implicit-def dead %lr, implicit %sp, implicit killed %r0, implicit killed %r1, implicit-def %sp, implicit-def dead %r0, debug-location !34
-+
-+ bb.5.if.end:
-+ liveins: %r4, %r5
-+
-+ %r0 = MOVr killed %r5, 14, _, _, debug-location !43
-+ %r1 = MOVr killed %r4, 14, _, _, debug-location !43
-+ %sp = LDMIA_UPD %sp, 14, _, def %r4, def %r5, def %r6, def %r7, def %r11, def %lr, debug-location !43
-+ TAILJMPd @func2, implicit %sp, implicit %sp, implicit killed %r0, implicit killed %r1, debug-location !43
-+
-+...
---
-2.7.4
-
-From 8a0fc26559123bb6eab3ceae93d5a2c94943614b Mon Sep 17 00:00:00 2001
-From: Adrian Prantl <aprantl@apple.com>
-Date: Wed, 28 Sep 2016 17:51:14 +0000
-Subject: [rust-lang/llvm#53 2/2] Teach LiveDebugValues about lexical scopes.
-
-This addresses PR26055 LiveDebugValues is very slow.
-
-Contrary to the old LiveDebugVariables pass LiveDebugValues currently
-doesn't look at the lexical scopes before inserting a DBG_VALUE
-intrinsic. This means that we often propagate DBG_VALUEs much further
-down than necessary. This is especially noticeable in large C++
-functions with many inlined method calls that all use the same
-"this"-pointer.
-
-For example, in the following code it makes no sense to propagate the
-inlined variable a from the first inlined call to f() into any of the
-subsequent basic blocks, because the variable will always be out of
-scope:
-
-void sink(int a);
-void __attribute((always_inline)) f(int a) { sink(a); }
-void foo(int i) {
- f(i);
- if (i)
- f(i);
- f(i);
-}
-
-This patch reuses the LexicalScopes infrastructure we have for
-LiveDebugVariables to take this into account.
-
-The effect on compile time and memory consumption is quite noticeable:
-I tested a benchmark that is a large C++ source with an enormous
-amount of inlined "this"-pointers that would previously eat >24GiB
-(most of them for DBG_VALUE intrinsics) and whose compile time was
-dominated by LiveDebugValues. With this patch applied the memory
-consumption is 1GiB and 1.7% of the time is spent in LiveDebugValues.
-
-https://reviews.llvm.org/D24994
-Thanks to Daniel Berlin and Keith Walker for reviewing!
-
-git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@282611 91177308-0d34-0410-b5e6-96231b3b80d8
----
- lib/CodeGen/LiveDebugValues.cpp | 51 ++++-
- test/CodeGen/ARM/dbg-range-extension.mir | 1 -
- test/DebugInfo/COFF/register-variables.ll | 8 +-
- test/DebugInfo/MIR/X86/livedebugvalues-limit.mir | 228 +++++++++++++++++++++++
- test/DebugInfo/X86/fission-ranges.ll | 6 +-
- 5 files changed, 278 insertions(+), 16 deletions(-)
- create mode 100644 test/DebugInfo/MIR/X86/livedebugvalues-limit.mir
-
-diff --git a/lib/CodeGen/LiveDebugValues.cpp b/lib/CodeGen/LiveDebugValues.cpp
-index 4cadd5855ed5..969944eb24a2 100644
---- a/lib/CodeGen/LiveDebugValues.cpp
-+++ b/lib/CodeGen/LiveDebugValues.cpp
-@@ -23,6 +23,7 @@
- #include "llvm/ADT/SparseBitVector.h"
- #include "llvm/ADT/Statistic.h"
- #include "llvm/ADT/UniqueVector.h"
-+#include "llvm/CodeGen/LexicalScopes.h"
- #include "llvm/CodeGen/MachineFunction.h"
- #include "llvm/CodeGen/MachineFunctionPass.h"
- #include "llvm/CodeGen/MachineInstrBuilder.h"
-@@ -60,6 +61,26 @@ class LiveDebugValues : public MachineFunctionPass {
- private:
- const TargetRegisterInfo *TRI;
- const TargetInstrInfo *TII;
-+ LexicalScopes LS;
-+
-+ /// Keeps track of lexical scopes associated with a user value's source
-+ /// location.
-+ class UserValueScopes {
-+ DebugLoc DL;
-+ LexicalScopes &LS;
-+ SmallPtrSet<const MachineBasicBlock *, 4> LBlocks;
-+
-+ public:
-+ UserValueScopes(DebugLoc D, LexicalScopes &L) : DL(std::move(D)), LS(L) {}
-+
-+ /// Return true if current scope dominates at least one machine
-+ /// instruction in a given machine basic block.
-+ bool dominates(MachineBasicBlock *MBB) {
-+ if (LBlocks.empty())
-+ LS.getMachineBasicBlocks(DL, LBlocks);
-+ return LBlocks.count(MBB) != 0 || LS.dominates(DL, MBB);
-+ }
-+ };
-
- /// Based on std::pair so it can be used as an index into a DenseMap.
- typedef std::pair<const DILocalVariable *, const DILocation *>
-@@ -83,7 +104,7 @@ private:
- struct VarLoc {
- const DebugVariable Var;
- const MachineInstr &MI; ///< Only used for cloning a new DBG_VALUE.
--
-+ mutable UserValueScopes UVS;
- enum { InvalidKind = 0, RegisterKind } Kind;
-
- /// The value location. Stored separately to avoid repeatedly
-@@ -96,9 +117,9 @@ private:
- uint64_t Hash;
- } Loc;
-
-- VarLoc(const MachineInstr &MI)
-+ VarLoc(const MachineInstr &MI, LexicalScopes &LS)
- : Var(MI.getDebugVariable(), MI.getDebugLoc()->getInlinedAt()), MI(MI),
-- Kind(InvalidKind) {
-+ UVS(MI.getDebugLoc(), LS), Kind(InvalidKind) {
- static_assert((sizeof(Loc) == sizeof(uint64_t)),
- "hash does not cover all members of Loc");
- assert(MI.isDebugValue() && "not a DBG_VALUE");
-@@ -125,6 +146,10 @@ private:
- return 0;
- }
-
-+ /// Determine whether the lexical scope of this value's debug location
-+ /// dominates MBB.
-+ bool dominates(MachineBasicBlock &MBB) const { return UVS.dominates(&MBB); }
-+
- void dump() const { MI.dump(); }
-
- bool operator==(const VarLoc &Other) const {
-@@ -229,6 +254,7 @@ public:
- /// Calculate the liveness information for the given machine function.
- bool runOnMachineFunction(MachineFunction &MF) override;
- };
-+
- } // namespace
-
- //===----------------------------------------------------------------------===//
-@@ -295,7 +321,7 @@ void LiveDebugValues::transferDebugValue(const MachineInstr &MI,
- // Add the VarLoc to OpenRanges from this DBG_VALUE.
- // TODO: Currently handles DBG_VALUE which has only reg as location.
- if (isDbgValueDescribedByReg(MI)) {
-- VarLoc VL(MI);
-+ VarLoc VL(MI, LS);
- unsigned ID = VarLocIDs.insert(VL);
- OpenRanges.insert(ID, VL.Var);
- }
-@@ -399,6 +425,13 @@ bool LiveDebugValues::join(MachineBasicBlock &MBB, VarLocInMBB &OutLocs,
- NumVisited++;
- }
-
-+ // Filter out DBG_VALUES that are out of scope.
-+ VarLocSet KillSet;
-+ for (auto ID : InLocsT)
-+ if (!VarLocIDs[ID].dominates(MBB))
-+ KillSet.set(ID);
-+ InLocsT.intersectWithComplement(KillSet);
-+
- // As we are processing blocks in reverse post-order we
- // should have processed at least one predecessor, unless it
- // is the entry block which has no predecessor.
-@@ -519,12 +552,14 @@ bool LiveDebugValues::ExtendRanges(MachineFunction &MF) {
- }
-
- bool LiveDebugValues::runOnMachineFunction(MachineFunction &MF) {
-+ if (!MF.getFunction()->getSubprogram())
-+ // LiveDebugValues will already have removed all DBG_VALUEs.
-+ return false;
-+
- TRI = MF.getSubtarget().getRegisterInfo();
- TII = MF.getSubtarget().getInstrInfo();
-+ LS.initialize(MF);
-
-- bool Changed = false;
--
-- Changed |= ExtendRanges(MF);
--
-+ bool Changed = ExtendRanges(MF);
- return Changed;
- }
-diff --git a/test/CodeGen/ARM/dbg-range-extension.mir b/test/CodeGen/ARM/dbg-range-extension.mir
-index b18f56197948..466f69396948 100644
---- a/test/CodeGen/ARM/dbg-range-extension.mir
-+++ b/test/CodeGen/ARM/dbg-range-extension.mir
-@@ -47,7 +47,6 @@
- # CHECK: DBG_VALUE debug-use [[REG_I]], debug-use _, [[VAR_I]]
-
- # CHECK: bb.4.for.cond.cleanup
--# CHECK: DBG_VALUE debug-use [[REG_I]], debug-use _, [[VAR_I]]
- # CHECK: DBG_VALUE debug-use [[REG_C]], debug-use _, [[VAR_C]]
- # CHECK: DBG_VALUE debug-use [[REG_B]], debug-use _, [[VAR_B]]
- # CHECK: DBG_VALUE debug-use [[REG_A]], debug-use _, [[VAR_A]]
-diff --git a/test/DebugInfo/COFF/register-variables.ll b/test/DebugInfo/COFF/register-variables.ll
-index 9bb782853a3d..08246fef9603 100644
---- a/test/DebugInfo/COFF/register-variables.ll
-+++ b/test/DebugInfo/COFF/register-variables.ll
-@@ -37,8 +37,8 @@
- ; ASM: #DEBUG_VALUE: c <- %EAX
- ; ASM: testl %esi, %esi
- ; ASM: je .LBB0_2
-+; ASM: [[after_je:\.Ltmp.*]]:
- ; ASM: # BB#1: # %if.then
--; ASM-DAG: #DEBUG_VALUE: c <- %EAX
- ; ASM-DAG: #DEBUG_VALUE: inlineinc:a <- %EAX
- ; ASM-DAG: #DEBUG_VALUE: a <- %EAX
- ; ASM-DAG: #DEBUG_VALUE: f:p <- %ESI
-@@ -65,7 +65,7 @@
- ; ASM: .cv_def_range [[after_getint]] [[after_inc_eax]], "A\021\021\000\000\000"
- ; ASM: .short 4414 # Record kind: S_LOCAL
- ; ASM: .asciz "c"
--; ASM: .cv_def_range [[after_getint]] [[after_inc_eax]], "A\021\021\000\000\000"
-+; ASM: .cv_def_range [[after_getint]] [[after_je]], "A\021\021\000\000\000"
- ; ASM: .short 4414 # Record kind: S_LOCAL
- ; ASM: .asciz "b"
- ; ASM: .cv_def_range [[after_inc_eax]] [[after_if]], "A\021\021\000\000\000"
-@@ -132,7 +132,7 @@
- ; OBJ: LocalVariableAddrRange {
- ; OBJ: OffsetStart: .text+0xC
- ; OBJ: ISectStart: 0x0
--; OBJ: Range: 0x6
-+; OBJ: Range: 0x4
- ; OBJ: }
- ; OBJ: }
- ; OBJ: Local {
-@@ -143,7 +143,7 @@
- ; OBJ: }
- ; OBJ: DefRangeRegister {
- ; OBJ: Register: 17
--; OBJ: LocalVariableAddrRange {
-+; OBJ: MayHaveNoName: 0
- ; OBJ: OffsetStart: .text+0x12
- ; OBJ: ISectStart: 0x0
- ; OBJ: Range: 0x6
-diff --git a/test/DebugInfo/MIR/X86/livedebugvalues-limit.mir b/test/DebugInfo/MIR/X86/livedebugvalues-limit.mir
-new file mode 100644
-index 000000000000..4c87543636d5
---- /dev/null
-+++ b/test/DebugInfo/MIR/X86/livedebugvalues-limit.mir
-@@ -0,0 +1,228 @@
-+--- |
-+ ; RUN: llc -run-pass=livedebugvalues -march=x86-64 -o - %s | FileCheck %s
-+ ; Created from:
-+ ; void sink(int a);
-+ ; void __attribute((always_inline)) f(int a) { sink(a); }
-+ ; void foo(int i) {
-+ ; f(i);
-+ ; if (i)
-+ ; f(i);
-+ ; f(i);
-+ ; }
-+ ;
-+ ; This test verifies that LiveDebugValues doesn't propagate DBG_VALUEs into
-+ ; basic blocks that are beyond the scope of the source variable.
-+ ;
-+ ; CHECK: bb.1.if.then:
-+ ; CHECK: DBG_VALUE debug-use %ebx, debug-use _, !19, !13, debug-location !20
-+ ; CHECK-NOT: DBG_VALUE debug-use %ebx, debug-use _, !12, !13, debug-location !21
-+ ; CHECK: DBG_VALUE debug-use %ebx, debug-use _, !12, !13, debug-location !27
-+ ; CHECK: bb.2.if.end:
-+ ; CHECK: DBG_VALUE debug-use %ebx, debug-use _, !19, !13, debug-location !20
-+ ; CHECK-NOT: DBG_VALUE debug-use %ebx, debug-use _, !12, !13, debug-location !21
-+ ; CHECK: DBG_VALUE debug-use %ebx, debug-use _, !12, !13, debug-location !31
-+ ;
-+ ; ModuleID = 'livedebugvalues-limit.ll'
-+ source_filename = "livedebugvalues-limit.c"
-+ target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
-+ target triple = "x86_64-apple-macosx"
-+
-+ ; Function Attrs: alwaysinline nounwind ssp uwtable
-+ define void @f(i32 %a) local_unnamed_addr #0 !dbg !7 {
-+ entry:
-+ tail call void @llvm.dbg.value(metadata i32 %a, i64 0, metadata !12, metadata !13), !dbg !14
-+ tail call void @sink(i32 %a) #4, !dbg !15
-+ ret void, !dbg !16
-+ }
-+
-+ declare void @sink(i32) local_unnamed_addr
-+
-+ ; Function Attrs: nounwind ssp uwtable
-+ define void @foo(i32 %i) local_unnamed_addr #2 !dbg !17 {
-+ entry:
-+ tail call void @llvm.dbg.value(metadata i32 %i, i64 0, metadata !19, metadata !13), !dbg !20
-+ tail call void @llvm.dbg.value(metadata i32 %i, i64 0, metadata !12, metadata !13) #4, !dbg !21
-+ tail call void @sink(i32 %i) #4, !dbg !23
-+ %tobool = icmp eq i32 %i, 0, !dbg !24
-+ br i1 %tobool, label %if.end, label %if.then, !dbg !26
-+
-+ if.then: ; preds = %entry
-+ tail call void @llvm.dbg.value(metadata i32 %i, i64 0, metadata !12, metadata !13) #4, !dbg !27
-+ tail call void @sink(i32 %i) #4, !dbg !29
-+ br label %if.end, !dbg !30
-+
-+ if.end: ; preds = %if.then, %entry
-+ tail call void @llvm.dbg.value(metadata i32 %i, i64 0, metadata !12, metadata !13) #4, !dbg !31
-+ tail call void @sink(i32 %i) #4, !dbg !33
-+ ret void, !dbg !34
-+ }
-+
-+ ; Function Attrs: nounwind readnone
-+ declare void @llvm.dbg.value(metadata, i64, metadata, metadata) #3
-+
-+ ; Function Attrs: nounwind
-+ declare void @llvm.stackprotector(i8*, i8**) #4
-+
-+ attributes #0 = { alwaysinline nounwind ssp uwtable }
-+ attributes #2 = { nounwind ssp uwtable }
-+ attributes #3 = { nounwind readnone }
-+ attributes #4 = { nounwind }
-+
-+ !llvm.dbg.cu = !{!0}
-+ !llvm.module.flags = !{!3, !4, !5}
-+ !llvm.ident = !{!6}
-+
-+ !0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang version 4.0.0 (trunk 281923) (llvm/trunk 281916)", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, enums: !2)
-+ !1 = !DIFile(filename: "livedebugvalues-limit.c", directory: "/Volumes/Fusion/Data/llvm")
-+ !2 = !{}
-+ !3 = !{i32 2, !"Dwarf Version", i32 4}
-+ !4 = !{i32 2, !"Debug Info Version", i32 3}
-+ !5 = !{i32 1, !"PIC Level", i32 2}
-+ !6 = !{!"clang version 4.0.0 (trunk 281923) (llvm/trunk 281916)"}
-+ !7 = distinct !DISubprogram(name: "f", scope: !1, file: !1, line: 3, type: !8, isLocal: false, isDefinition: true, scopeLine: 3, flags: DIFlagPrototyped, isOptimized: true, unit: !0, variables: !11)
-+ !8 = !DISubroutineType(types: !9)
-+ !9 = !{null, !10}
-+ !10 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed)
-+ !11 = !{!12}
-+ !12 = !DILocalVariable(name: "a", arg: 1, scope: !7, file: !1, line: 3, type: !10)
-+ !13 = !DIExpression()
-+ !14 = !DILocation(line: 3, column: 41, scope: !7)
-+ !15 = !DILocation(line: 3, column: 46, scope: !7)
-+ !16 = !DILocation(line: 3, column: 55, scope: !7)
-+ !17 = distinct !DISubprogram(name: "foo", scope: !1, file: !1, line: 4, type: !8, isLocal: false, isDefinition: true, scopeLine: 4, flags: DIFlagPrototyped, isOptimized: true, unit: !0, variables: !18)
-+ !18 = !{!19}
-+ !19 = !DILocalVariable(name: "i", arg: 1, scope: !17, file: !1, line: 4, type: !10)
-+ !20 = !DILocation(line: 4, column: 14, scope: !17)
-+ !21 = !DILocation(line: 3, column: 41, scope: !7, inlinedAt: !22)
-+ !22 = distinct !DILocation(line: 5, column: 3, scope: !17)
-+ !23 = !DILocation(line: 3, column: 46, scope: !7, inlinedAt: !22)
-+ !24 = !DILocation(line: 6, column: 7, scope: !25)
-+ !25 = distinct !DILexicalBlock(scope: !17, file: !1, line: 6, column: 7)
-+ !26 = !DILocation(line: 6, column: 7, scope: !17)
-+ !27 = !DILocation(line: 3, column: 41, scope: !7, inlinedAt: !28)
-+ !28 = distinct !DILocation(line: 7, column: 5, scope: !25)
-+ !29 = !DILocation(line: 3, column: 46, scope: !7, inlinedAt: !28)
-+ !30 = !DILocation(line: 7, column: 5, scope: !25)
-+ !31 = !DILocation(line: 3, column: 41, scope: !7, inlinedAt: !32)
-+ !32 = distinct !DILocation(line: 8, column: 3, scope: !17)
-+ !33 = !DILocation(line: 3, column: 46, scope: !7, inlinedAt: !32)
-+ !34 = !DILocation(line: 9, column: 1, scope: !17)
-+
-+...
-+---
-+name: f
-+alignment: 4
-+exposesReturnsTwice: false
-+legalized: false
-+regBankSelected: false
-+selected: false
-+tracksRegLiveness: true
-+liveins:
-+ - { reg: '%edi' }
-+calleeSavedRegisters: [ '%bh', '%bl', '%bp', '%bpl', '%bx', '%ebp', '%ebx',
-+ '%rbp', '%rbx', '%r12', '%r13', '%r14', '%r15',
-+ '%r12b', '%r13b', '%r14b', '%r15b', '%r12d', '%r13d',
-+ '%r14d', '%r15d', '%r12w', '%r13w', '%r14w', '%r15w' ]
-+frameInfo:
-+ isFrameAddressTaken: false
-+ isReturnAddressTaken: false
-+ hasStackMap: false
-+ hasPatchPoint: false
-+ stackSize: 8
-+ offsetAdjustment: 0
-+ maxAlignment: 0
-+ adjustsStack: false
-+ hasCalls: false
-+ maxCallFrameSize: 0
-+ hasOpaqueSPAdjustment: false
-+ hasVAStart: false
-+ hasMustTailInVarArgFunc: false
-+fixedStack:
-+ - { id: 0, type: spill-slot, offset: -16, size: 8, alignment: 16 }
-+body: |
-+ bb.0.entry:
-+ liveins: %edi, %rbp
-+
-+ frame-setup PUSH64r killed %rbp, implicit-def %rsp, implicit %rsp
-+ CFI_INSTRUCTION def_cfa_offset 16
-+ CFI_INSTRUCTION offset %rbp, -16
-+ %rbp = frame-setup MOV64rr %rsp
-+ CFI_INSTRUCTION def_cfa_register %rbp
-+ DBG_VALUE debug-use %edi, debug-use _, !12, !13, debug-location !14
-+ %rbp = POP64r implicit-def %rsp, implicit %rsp, debug-location !15
-+ TAILJMPd64 @sink, csr_64, implicit %rsp, implicit %rsp, implicit %edi, debug-location !15
-+
-+...
-+---
-+name: foo
-+alignment: 4
-+exposesReturnsTwice: false
-+legalized: false
-+regBankSelected: false
-+selected: false
-+tracksRegLiveness: true
-+liveins:
-+ - { reg: '%edi' }
-+calleeSavedRegisters: [ '%bh', '%bl', '%bp', '%bpl', '%bx', '%ebp', '%ebx',
-+ '%rbp', '%rbx', '%r12', '%r13', '%r14', '%r15',
-+ '%r12b', '%r13b', '%r14b', '%r15b', '%r12d', '%r13d',
-+ '%r14d', '%r15d', '%r12w', '%r13w', '%r14w', '%r15w' ]
-+frameInfo:
-+ isFrameAddressTaken: false
-+ isReturnAddressTaken: false
-+ hasStackMap: false
-+ hasPatchPoint: false
-+ stackSize: 24
-+ offsetAdjustment: -8
-+ maxAlignment: 0
-+ adjustsStack: true
-+ hasCalls: true
-+ maxCallFrameSize: 0
-+ hasOpaqueSPAdjustment: false
-+ hasVAStart: false
-+ hasMustTailInVarArgFunc: false
-+fixedStack:
-+ - { id: 0, type: spill-slot, offset: -24, size: 8, alignment: 8, callee-saved-register: '%rbx' }
-+ - { id: 1, type: spill-slot, offset: -16, size: 8, alignment: 16 }
-+body: |
-+ bb.0.entry:
-+ successors: %bb.2.if.end, %bb.1.if.then
-+ liveins: %edi, %rbx, %rbp
-+
-+ frame-setup PUSH64r killed %rbp, implicit-def %rsp, implicit %rsp
-+ CFI_INSTRUCTION def_cfa_offset 16
-+ CFI_INSTRUCTION offset %rbp, -16
-+ %rbp = frame-setup MOV64rr %rsp
-+ CFI_INSTRUCTION def_cfa_register %rbp
-+ frame-setup PUSH64r killed %rbx, implicit-def %rsp, implicit %rsp
-+ frame-setup PUSH64r undef %rax, implicit-def %rsp, implicit %rsp
-+ CFI_INSTRUCTION offset %rbx, -24
-+ DBG_VALUE debug-use %edi, debug-use _, !19, !13, debug-location !20
-+ %ebx = MOV32rr %edi
-+ DBG_VALUE debug-use %ebx, debug-use _, !12, !13, debug-location !21
-+ DBG_VALUE debug-use %ebx, debug-use _, !19, !13, debug-location !20
-+ CALL64pcrel32 @sink, csr_64, implicit %rsp, implicit %edi, implicit-def %rsp, debug-location !23
-+ TEST32rr %ebx, %ebx, implicit-def %eflags, debug-location !24
-+ JE_1 %bb.2.if.end, implicit %eflags
-+
-+ bb.1.if.then:
-+ successors: %bb.2.if.end
-+ liveins: %ebx, %rbp
-+
-+ DBG_VALUE debug-use %ebx, debug-use _, !19, !13, debug-location !20
-+ DBG_VALUE debug-use %ebx, debug-use _, !12, !13, debug-location !27
-+ %edi = MOV32rr %ebx, debug-location !29
-+ CALL64pcrel32 @sink, csr_64, implicit %rsp, implicit %edi, implicit-def %rsp, debug-location !29
-+
-+ bb.2.if.end:
-+ liveins: %ebx, %rbp
-+
-+ DBG_VALUE debug-use %ebx, debug-use _, !19, !13, debug-location !20
-+ %edi = MOV32rr killed %ebx, debug-location !33
-+ %rsp = ADD64ri8 %rsp, 8, implicit-def dead %eflags, debug-location !33
-+ DBG_VALUE debug-use %ebx, debug-use _, !12, !13, debug-location !31
-+ %rbx = POP64r implicit-def %rsp, implicit %rsp, debug-location !33
-+ %rbp = POP64r implicit-def %rsp, implicit %rsp, debug-location !33
-+ TAILJMPd64 @sink, csr_64, implicit %rsp, implicit %rsp, implicit %edi, debug-location !33
-+
-+...
-diff --git a/test/DebugInfo/X86/fission-ranges.ll b/test/DebugInfo/X86/fission-ranges.ll
-index 3c05f223ee79..0dfb13ab66b7 100644
---- a/test/DebugInfo/X86/fission-ranges.ll
-+++ b/test/DebugInfo/X86/fission-ranges.ll
-@@ -32,13 +32,13 @@
- ; CHECK-NEXT: Length: 25
- ; CHECK-NEXT: Location description: 50 93 04
- ; CHECK: [[E]]: Beginning address index: 4
--; CHECK-NEXT: Length: 23
-+; CHECK-NEXT: Length: 19
- ; CHECK-NEXT: Location description: 50 93 04
- ; CHECK: [[B]]: Beginning address index: 5
--; CHECK-NEXT: Length: 21
-+; CHECK-NEXT: Length: 17
- ; CHECK-NEXT: Location description: 50 93 04
- ; CHECK: [[D]]: Beginning address index: 6
--; CHECK-NEXT: Length: 21
-+; CHECK-NEXT: Length: 17
- ; CHECK-NEXT: Location description: 50 93 04
-
- ; Make sure we don't produce any relocations in any .dwo section (though in particular, debug_info.dwo)
---
-2.7.4
-
diff --git a/community/llvm3.9/rust-lang-llvm-pr54.patch b/community/llvm3.9/rust-lang-llvm-pr54.patch
deleted file mode 100644
index 942e74e4e7..0000000000
--- a/community/llvm3.9/rust-lang-llvm-pr54.patch
+++ /dev/null
@@ -1,103 +0,0 @@
-From 9b74379db3f9e30516f053138fd3697d42b23164 Mon Sep 17 00:00:00 2001
-From: David Majnemer <david.majnemer@gmail.com>
-Date: Fri, 7 Oct 2016 01:38:35 +0000
-Subject: [rust-lang/llvm#54] [SimplifyCFG] Correctly test for unconditional
- branches in GetCaseResults
-
-GetCaseResults assumed that a terminator with one successor was an
-unconditional branch. This is not necessarily the case, it could be a
-cleanupret.
-
-Strengthen the check by querying whether or not the terminator is
-exceptional.
-
-git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@283517 91177308-0d34-0410-b5e6-96231b3b80d8
----
- lib/Transforms/Utils/SimplifyCFG.cpp | 2 +-
- .../SimplifyCFG/X86/switch_to_lookup_table.ll | 60 ++++++++++++++++++++++
- 2 files changed, 61 insertions(+), 1 deletion(-)
-
-diff --git a/lib/Transforms/Utils/SimplifyCFG.cpp b/lib/Transforms/Utils/SimplifyCFG.cpp
-index c197317ac771..d274f97296dc 100644
---- a/lib/Transforms/Utils/SimplifyCFG.cpp
-+++ b/lib/Transforms/Utils/SimplifyCFG.cpp
-@@ -4228,7 +4228,7 @@ GetCaseResults(SwitchInst *SI, ConstantInt *CaseVal, BasicBlock *CaseDest,
- ++I) {
- if (TerminatorInst *T = dyn_cast<TerminatorInst>(I)) {
- // If the terminator is a simple branch, continue to the next block.
-- if (T->getNumSuccessors() != 1)
-+ if (T->getNumSuccessors() != 1 || T->isExceptional())
- return false;
- Pred = CaseDest;
- CaseDest = T->getSuccessor(0);
-diff --git a/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll b/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll
-index bae8c1dc5a4b..77e355a00528 100644
---- a/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll
-+++ b/test/Transforms/SimplifyCFG/X86/switch_to_lookup_table.ll
-@@ -1334,3 +1334,63 @@ cleanup4:
- br label %while.body
- }
-
-+declare void @throw(i1)
-+
-+define void @wineh_test(i64 %val) personality i32 (...)* @__CxxFrameHandler3 {
-+entry:
-+ invoke void @throw(i1 false)
-+ to label %unreachable unwind label %cleanup1
-+
-+unreachable:
-+ unreachable
-+
-+cleanup1:
-+ %cleanuppad1 = cleanuppad within none []
-+ switch i64 %val, label %cleanupdone2 [
-+ i64 0, label %cleanupdone1
-+ i64 1, label %cleanupdone1
-+ i64 6, label %cleanupdone1
-+ ]
-+
-+cleanupdone1:
-+ cleanupret from %cleanuppad1 unwind label %cleanup2
-+
-+cleanupdone2:
-+ cleanupret from %cleanuppad1 unwind label %cleanup2
-+
-+cleanup2:
-+ %phi = phi i1 [ true, %cleanupdone1 ], [ false, %cleanupdone2 ]
-+ %cleanuppad2 = cleanuppad within none []
-+ call void @throw(i1 %phi) [ "funclet"(token %cleanuppad2) ]
-+ unreachable
-+}
-+
-+; CHECK-LABEL: @wineh_test(
-+; CHECK: entry:
-+; CHECK: invoke void @throw(i1 false)
-+; CHECK: to label %[[unreachable:.*]] unwind label %[[cleanup1:.*]]
-+
-+; CHECK: [[unreachable]]:
-+; CHECK: unreachable
-+
-+; CHECK: [[cleanup1]]:
-+; CHECK: %[[cleanuppad1:.*]] = cleanuppad within none []
-+; CHECK: switch i64 %val, label %[[cleanupdone2:.*]] [
-+; CHECK: i64 0, label %[[cleanupdone1:.*]]
-+; CHECK: i64 1, label %[[cleanupdone1]]
-+; CHECK: i64 6, label %[[cleanupdone1]]
-+; CHECK: ]
-+
-+; CHECK: [[cleanupdone1]]:
-+; CHECK: cleanupret from %[[cleanuppad1]] unwind label %[[cleanup2:.*]]
-+
-+; CHECK: [[cleanupdone2]]:
-+; CHECK: cleanupret from %[[cleanuppad1]] unwind label %[[cleanup2]]
-+
-+; CHECK: [[cleanup2]]:
-+; CHECK: %[[phi:.*]] = phi i1 [ true, %[[cleanupdone1]] ], [ false, %[[cleanupdone2]] ]
-+; CHECK: %[[cleanuppad2:.*]] = cleanuppad within none []
-+; CHECK: call void @throw(i1 %[[phi]]) [ "funclet"(token %[[cleanuppad2]]) ]
-+; CHECK: unreachable
-+
-+declare i32 @__CxxFrameHandler3(...)
---
-2.7.4
-
diff --git a/community/llvm3.9/rust-lang-llvm-pr55.patch b/community/llvm3.9/rust-lang-llvm-pr55.patch
deleted file mode 100644
index f534f31e89..0000000000
--- a/community/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
-
diff --git a/community/llvm3.9/rust-lang-llvm-pr57.patch b/community/llvm3.9/rust-lang-llvm-pr57.patch
deleted file mode 100644
index eda4d9a41f..0000000000
--- a/community/llvm3.9/rust-lang-llvm-pr57.patch
+++ /dev/null
@@ -1,118 +0,0 @@
-From 5ac4f80be3e8b5d42475aeaba246455e0016c7ef Mon Sep 17 00:00:00 2001
-From: Anthony Ramine <n.oxyde@gmail.com>
-Date: Sun, 27 Nov 2016 16:28:12 +0100
-Subject: [rust-lang/llvm#57] Backport rL277331
-
----
- lib/Target/AArch64/AArch64InstrInfo.cpp | 3 +
- .../MIR/AArch64/inst-size-tlsdesc-callseq.mir | 84 ++++++++++++++++++++++
- 2 files changed, 87 insertions(+)
- create mode 100644 test/CodeGen/MIR/AArch64/inst-size-tlsdesc-callseq.mir
-
-diff --git a/lib/Target/AArch64/AArch64InstrInfo.cpp b/lib/Target/AArch64/AArch64InstrInfo.cpp
-index 0aa4708f35ac..d39542a8e4eb 100644
---- a/lib/Target/AArch64/AArch64InstrInfo.cpp
-+++ b/lib/Target/AArch64/AArch64InstrInfo.cpp
-@@ -56,6 +56,9 @@ unsigned AArch64InstrInfo::GetInstSizeInBytes(const MachineInstr &MI) const {
- case TargetOpcode::IMPLICIT_DEF:
- case TargetOpcode::KILL:
- return 0;
-+ case AArch64::TLSDESC_CALLSEQ:
-+ // This gets lowered to an instruction sequence which takes 16 bytes
-+ return 16;
- }
-
- llvm_unreachable("GetInstSizeInBytes()- Unable to determin insn size");
-diff --git a/test/CodeGen/MIR/AArch64/inst-size-tlsdesc-callseq.mir b/test/CodeGen/MIR/AArch64/inst-size-tlsdesc-callseq.mir
-new file mode 100644
-index 000000000000..2d966ece768e
---- /dev/null
-+++ b/test/CodeGen/MIR/AArch64/inst-size-tlsdesc-callseq.mir
-@@ -0,0 +1,84 @@
-+# RUN: llc -mtriple=aarch64-unknown -run-pass aarch64-branch-relax -aarch64-tbz-offset-bits=4 %s -o - | FileCheck %s
-+--- |
-+ ; ModuleID = 'test.ll'
-+ source_filename = "test.ll"
-+ target datalayout = "e-m:e-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128"
-+ target triple = "aarch64-unknown"
-+
-+ @ThreadLocalGlobal = external thread_local local_unnamed_addr global i32, align 8
-+
-+ define i32 @test_tlsdesc_callseq_length(i32 %in) {
-+ %val = and i32 %in, 1
-+ %tst = icmp eq i32 %val, 0
-+ br i1 %tst, label %true, label %false
-+
-+ true: ; preds = %0
-+ %1 = load i32, i32* @ThreadLocalGlobal, align 8
-+ ret i32 %1
-+
-+ false: ; preds = %0
-+ ret i32 0
-+ }
-+
-+...
-+---
-+# CHECK-LABEL: name:{{.*}}test_tlsdesc_callseq_length
-+# If the size of TLSDESC_CALLSEQ is computed correctly, that will push
-+# the bb.2.false block too far away from the TBNZW, so the branch will
-+# have to be relaxed (note that we're using -aarch64-tbz-offset-bits to
-+# constrain the range that can be reached with the TBNZW to something smaller
-+# than what TLSDESC_CALLSEQ is lowered to).
-+# CHECK: TBZW killed %w0, 0, %bb.1.true
-+# CHECK: B %bb.2.false
-+name: test_tlsdesc_callseq_length
-+alignment: 2
-+exposesReturnsTwice: false
-+hasInlineAsm: false
-+allVRegsAllocated: true
-+isSSA: false
-+tracksRegLiveness: false
-+tracksSubRegLiveness: false
-+liveins:
-+ - { reg: '%w0' }
-+frameInfo:
-+ isFrameAddressTaken: false
-+ isReturnAddressTaken: false
-+ hasStackMap: false
-+ hasPatchPoint: false
-+ stackSize: 16
-+ offsetAdjustment: 0
-+ maxAlignment: 16
-+ adjustsStack: false
-+ hasCalls: true
-+ maxCallFrameSize: 0
-+ hasOpaqueSPAdjustment: false
-+ hasVAStart: false
-+ hasMustTailInVarArgFunc: false
-+stack:
-+ - { id: 0, type: spill-slot, offset: -16, size: 8, alignment: 16, callee-saved-register: '%lr' }
-+body: |
-+ bb.0 (%ir-block.0):
-+ successors: %bb.1.true, %bb.2.false
-+ liveins: %w0, %lr
-+
-+ TBNZW killed %w0, 0, %bb.2.false
-+
-+ bb.1.true:
-+ liveins: %lr
-+
-+ early-clobber %sp = frame-setup STRXpre killed %lr, %sp, -16 :: (store 8 into %stack.0)
-+ frame-setup CFI_INSTRUCTION def_cfa_offset 16
-+ frame-setup CFI_INSTRUCTION offset %w30, -16
-+ TLSDESC_CALLSEQ target-flags(aarch64-tls) @ThreadLocalGlobal, implicit-def dead %lr, implicit-def %x0, implicit-def dead %x1
-+ %x8 = MRS 56962
-+ %w0 = LDRWroX killed %x8, killed %x0, 0, 0 :: (load 4 from @ThreadLocalGlobal, align 8)
-+ early-clobber %sp, %lr = LDRXpost %sp, 16 :: (load 8 from %stack.0)
-+ RET killed %lr, implicit killed %w0
-+
-+ bb.2.false:
-+ liveins: %lr
-+
-+ %w0 = ORRWrs %wzr, %wzr, 0
-+ RET killed %lr, implicit killed %w0
-+
-+...
---
-2.9.3
-