On Sun, 24 Jan 2016 20:36:15 +1100, Jonathan Gray wrote: > There are projects that use the llvm libraries that take time to update, > and llvm seems to often make a lot of breaking changes between major > versions. > > This is why there was a llvm port in openbsd-wip (before it was removed > without anyone asking why I added it...) as it was tied to the specific > version required by the include-what-you-use port there. That and the > Mesa code tends to support multiple llvm releases at once but not the > mishmash of 3.4 and 3.5 the current llvm port is. Though support for > llvm 3.4 was since removed from Mesa, and there are versions of > include-what-you-use that target other actual released versions of llvm > including 3.7. > > If ports llvm would stick to an actual released version of llvm without > importing half a release a lot of problems would go away though. > So perhaps that would be enough.
That is the plan. > On Sun, Jan 24, 2016 at 09:06:36AM +0000, Stuart Henderson wrote: > > Setting MODGCC4_VER might work locally but you can't do it this way for > > anything that gets committed, it will create a conflict in bulk builds. The > > main advantage of having multiple gcc versions is that an arch can be held > > back if it doesn't work with the latest version, this shouldn't be a > > problem for LLVM. > > > > On 24 January 2016 03:13:47 GMT+00:00, Juan Francisco Cantero Hurtado > > <i...@juanfra.info> wrote: > > >On Sun, Jan 24, 2016 at 12:07:03AM +0000, Stuart Henderson wrote: > > >> I wouldn't say that this works well with gcc. I would recommend > > >against keeping multiple versions of a port without a good and specific > > >reason. > > > > > >In the gcc case, the latest version is imported, people works on their > > >ports and when everything works fine with the latest version, this is > > >promoted as the default version and the older version is deleted. If > > >some of my ports are broken, I can change MODGCC4_VER and to work > > >individually in one port without to break other packages which I use > > >but I don't know how to help to fix the problems. > > > > > >In addition to that, I would like various versions of llvm (not just > > >clang) because more and more interpreters/compilers depend of llvm and > > >we can't have updated packages because for any reason we can't update > > >llvm due to some conflict with other packages. (example: rubinius > > >deletion or people wasting their time trying to build an updated llvm > > >during the first attemps to port rust) > > > > > >That said, I'm obviously not going to maintain llvm and others will do > > >the hard work, so my request is just a hope and not a red line or > > >something similar :) > > > > > >> > > >> > > >> On 23 January 2016 22:16:16 GMT+00:00, Juan Francisco Cantero Hurtado > > ><i...@juanfra.info> wrote: > > >> >Can you modify the structure of devel/llvm/ to something like > > >> >devel/llvm/version/? With lang/gcc works pretty well, we can work > > >with > > >> >the latest version while the ports tree uses the stable version by > > >> >default. > > >> > > > >> > > > >> >On Sat, Jan 23, 2016 at 07:39:22PM +0100, Pascal Stumpf wrote: > > >> >> So here's an updated diff for LLVM 3.7.1. With landry@'s recent > > >> >commit, > > >> >> xulrunner is no longer a showstopper. > > >> >> > > >> >> > > >> >> Index: Makefile > > >> >> > > >=================================================================== > > >> >> RCS file: /cvs/ports/devel/llvm/Makefile,v > > >> >> retrieving revision 1.108 > > >> >> diff -u -p -r1.108 Makefile > > >> >> --- Makefile 24 Aug 2015 07:45:56 -0000 1.108 > > >> >> +++ Makefile 23 Jan 2016 18:38:51 -0000 > > >> >> @@ -8,14 +8,17 @@ DPB_PROPERTIES = parallel > > >> >> > > >> >> COMMENT = modular, fast C/C++/ObjC compiler, static analyzer and > > >> >tools > > >> >> > > >> >> -LLVM_V = 3.5 > > >> >> -DISTNAME = llvm-${LLVM_V}.20140228 > > >> >> -REVISION = 35 > > >> >> +LLVM_V = 3.7.1 > > >> >> +DISTNAME = llvm-${LLVM_V}.src > > >> >> +PKGNAME = llvm-${LLVM_V} > > >> >> CATEGORIES = devel > > >> >> -MASTER_SITES = http://comstyle.com/source/ > > >> >> +DISTFILES = llvm-${LLVM_V}.src${EXTRACT_SUFX} \ > > >> >> + cfe-${LLVM_V}.src${EXTRACT_SUFX} > > >> >> +MASTER_SITES = http://www.llvm.org/releases/${LLVM_V}/ > > >> >> EXTRACT_SUFX = .tar.xz > > >> >> > > >> >> -SHARED_LIBS = clang 1.0 > > >> >> +SHARED_LIBS = clang 2.0 \ > > >> >> + LTO 0.0 > > >> >> > > >> >> # packager notes in http://llvm.org/docs/Packaging.html > > >> >> HOMEPAGE = http://www.llvm.org/ > > >> >> @@ -25,15 +28,21 @@ MAINTAINER= Brad Smith <b...@comstyle.co > > >> >> # BSD > > >> >> PERMIT_PACKAGE_CDROM = Yes > > >> >> > > >> >> -WANTLIB = c m pthread stdc++ z > > >> >> +WANTLIB = c m pthread z > > >> >> > > >> >> MODULES = devel/cmake \ > > >> >> - lang/python > > >> >> + lang/python \ > > >> >> + gcc4 > > >> >> > > >> >> -TEST_DEPENDS = devel/dejagnu \ > > >> >> - shells/bash > > >> >> +MODGCC4_LANGS = c c++ > > >> >> +MODGCC4_ARCHS = * > > >> >> + > > >> >> +TEST_DEPENDS = devel/dejagnu \ > > >> >> + shells/bash \ > > >> >> + lang/gcc/${MODGCC4_VERSION},-c++ > > >> >> BUILD_DEPENDS += textproc/py-sphinx > > >> >> -RUN_DEPENDS += devel/gtest > > >> >> +RUN_DEPENDS += devel/gtest \ > > >> >> + lang/gcc/${MODGCC4_VERSION},-c++ > > >> >> > > >> >> SEPARATE_BUILD = Yes > > >> >> CONFIGURE_ARGS = -DLLVM_ENABLE_FFI:Bool=False \ > > >> >> @@ -47,22 +56,34 @@ CONFIGURE_ARGS = -DLLVM_ENABLE_FFI:Bool= > > >> >> # introduced when PIE was enabled > > >> >> .if ${MACHINE_ARCH} == "powerpc" > > >> >> CONFIGURE_ARGS += -DCMAKE_EXE_LINKER_FLAGS="-Wl,--relax -nopie" > > >> >> +CONFIGURE_ARGS += -DCMAKE_SHARED_LINKER_FLAGS="-Wl,--relax > > >-nopie" > > >> >> .endif > > >> >> > > >> >> TEST_TARGET = check > > >> >> > > >> >> +# XXX sync > > >> >> +GCC_VER = 4.9.3 > > >> >> +.if ${MACHINE_ARCH} == "amd64" > > >> >> +GCC_CONFIG = x86_64-unknown-openbsd${OSREV} > > >> >> +.else > > >> >> +GCC_CONFIG = ${MACHINE_ARCH}-unknown-openbsd${OSREV} > > >> >> +.endif > > >> >> CLANG_INCLUDE_PATH = lib/clang/${LLVM_V}/include > > >> >> -SUBST_VARS += CLANG_INCLUDE_PATH LLVM_V > > >> >> +SUBST_VARS += CLANG_INCLUDE_PATH LLVM_V GCC_VER > > >> >> GCC_CONFIG > > >> >> + > > >> >> +post-extract: > > >> >> + mv ${WRKDIR}/cfe-${LLVM_V}.src ${WRKSRC}/tools/clang > > >> >> > > >> >> pre-configure: > > >> >> - @${SUBST_CMD} ${WRKSRC}/tools/clang/tools/scan-build/scan-build > > >> >> + @${SUBST_CMD} ${WRKSRC}/tools/clang/tools/scan-build/scan-build > > >\ > > >> >> + ${WRKSRC}/tools/clang/lib/Driver/ToolChains.cpp > > >> >> + @${SUBST_CMD} ${WRKSRC}/tools/clang/tools/scan-build/scan-build > > >\ > > >> >> + ${WRKSRC}/tools/clang/lib/Driver/Tools.cpp > > >> >> -@ln -s ${MODPY_BIN} ${WRKDIR}/bin/python > > >> >> > > >> >> post-build: > > >> >> cd ${WRKSRC}/docs && make -f Makefile.sphinx man > > >> >> - pod2man --release=CVS --center="LLVM" \ > > >> >> - ${WRKSRC}/tools/clang/docs/tools/clang.pod \ > > >> >> - ${WRKSRC}/docs/_build/man/clang.1 > > >> >> + cd ${WRKSRC}/tools/clang/docs && make -f Makefile.sphinx man > > >> >> > > >> >> post-install: > > >> >> ${INSTALL_SCRIPT} > > >> >${WRKSRC}/tools/clang/tools/scan-build/ccc-analyzer \ > > >> >> @@ -75,7 +96,10 @@ post-install: > > >> >> ${PREFIX}/man/man1 > > >> >> ${INSTALL_DATA} > > >${WRKSRC}/tools/clang/tools/scan-build/scan-build.1 > > >> >\ > > >> >> ${PREFIX}/man/man1 > > >> >> - # lit is not installed anymore > > >> >> + ${INSTALL_DATA} ${WRKSRC}/tools/clang/docs/_build/man/clang.1 \ > > >> >> + ${PREFIX}/man/man1 > > >> >> + # lit and FileCheck are not installed > > >> >> @rm ${PREFIX}/man/man1/lit.1 > > >> >> + @rm ${PREFIX}/man/man1/FileCheck.1 > > >> >> > > >> >> .include <bsd.port.mk> > > >> >> Index: distinfo > > >> >> > > >=================================================================== > > >> >> RCS file: /cvs/ports/devel/llvm/distinfo,v > > >> >> retrieving revision 1.13 > > >> >> diff -u -p -r1.13 distinfo > > >> >> --- distinfo 18 Apr 2014 09:30:48 -0000 1.13 > > >> >> +++ distinfo 23 Jan 2016 18:38:51 -0000 > > >> >> @@ -1,2 +1,4 @@ > > >> >> -SHA256 (llvm-3.5.20140228.tar.xz) = > > >> >vBFmbVEiY2CQZf7Boqcebh+s+ejpfpoZ8vY5c3cxgXw= > > >> >> -SIZE (llvm-3.5.20140228.tar.xz) = 17945548 > > >> >> +SHA256 (cfe-3.7.1.src.tar.xz) = > > >> >VuIWTHwqF3LV7So+V0hf9z/wbJff8S7b7qGsxEErBnQ= > > >> >> +SHA256 (llvm-3.7.1.src.tar.xz) = > > >> >vneU7QzsQtbGgsqONRdTW1RVWj3vq+yDVU28dNtUWtU= > > >> >> +SIZE (cfe-3.7.1.src.tar.xz) = 9110616 > > >> >> +SIZE (llvm-3.7.1.src.tar.xz) = 14592544 > > >> >> Index: patches/patch-CMakeLists_txt > > >> >> > > >=================================================================== > > >> >> RCS file: patches/patch-CMakeLists_txt > > >> >> diff -N patches/patch-CMakeLists_txt > > >> >> --- patches/patch-CMakeLists_txt 18 Apr 2014 09:30:48 -0000 > > >> >> 1.4 > > >> >> +++ /dev/null 1 Jan 1970 00:00:00 -0000 > > >> >> @@ -1,15 +0,0 @@ > > >> >> -$OpenBSD: patch-CMakeLists_txt,v 1.4 2014/04/18 09:30:48 brad Exp > > >$ > > >> >> - > > >> >> -Don't confuse scripts who want the version with appended 'svn' > > >goo. > > >> >> - > > >> >> ---- CMakeLists.txt.orig Sun Mar 2 21:57:43 2014 > > >> >> -+++ CMakeLists.txt Sun Mar 2 22:13:02 2014 > > >> >> -@@ -29,7 +29,7 @@ set(LLVM_VERSION_MAJOR 3) > > >> >> - set(LLVM_VERSION_MINOR 5) > > >> >> - > > >> >> - if (NOT PACKAGE_VERSION) > > >> >> -- set(PACKAGE_VERSION > > >> >"${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}svn") > > >> >> -+ set(PACKAGE_VERSION > > >> >"${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}") > > >> >> - endif() > > >> >> - > > >> >> - option(LLVM_INSTALL_TOOLCHAIN_ONLY "Only include toolchain files > > >in > > >> >the 'install' target." OFF) > > >> >> Index: patches/patch-Makefile_config_in > > >> >> > > >=================================================================== > > >> >> RCS file: /cvs/ports/devel/llvm/patches/patch-Makefile_config_in,v > > >> >> retrieving revision 1.8 > > >> >> diff -u -p -r1.8 patch-Makefile_config_in > > >> >> --- patches/patch-Makefile_config_in 18 Apr 2014 09:30:48 > > >-0000 1.8 > > >> >> +++ patches/patch-Makefile_config_in 23 Jan 2016 18:38:51 -0000 > > >> >> @@ -1,7 +1,7 @@ > > >> >> $OpenBSD: patch-Makefile_config_in,v 1.8 2014/04/18 09:30:48 brad > > >> >Exp $ > > >> >> ---- Makefile.config.in.orig Sun Feb 16 19:19:46 2014 > > >> >> -+++ Makefile.config.in Sun Feb 16 19:28:35 2014 > > >> >> -@@ -99,11 +99,11 @@ endif > > >> >> +--- Makefile.config.in.orig Wed Aug 12 19:12:16 2015 > > >> >> ++++ Makefile.config.in Tue Sep 8 21:53:49 2015 > > >> >> +@@ -106,11 +106,11 @@ endif > > >> >> PROJ_bindir := $(PROJ_prefix)/bin > > >> >> PROJ_libdir := $(PROJ_prefix)/lib > > >> >> PROJ_datadir := $(PROJ_prefix)/share > > >> >> Index: patches/patch-cmake_modules_AddLLVM_cmake > > >> >> > > >=================================================================== > > >> >> RCS file: patches/patch-cmake_modules_AddLLVM_cmake > > >> >> diff -N patches/patch-cmake_modules_AddLLVM_cmake > > >> >> --- /dev/null 1 Jan 1970 00:00:00 -0000 > > >> >> +++ patches/patch-cmake_modules_AddLLVM_cmake 23 Jan 2016 18:38:51 > > >> >-0000 > > >> >> @@ -0,0 +1,12 @@ > > >> >> +$OpenBSD$ > > >> >> +--- cmake/modules/AddLLVM.cmake.orig Fri Sep 11 17:38:23 2015 > > >> >> ++++ cmake/modules/AddLLVM.cmake Fri Sep 11 17:39:48 2015 > > >> >> +@@ -178,7 +178,7 @@ function(add_link_opts target_name) > > >> >> + elseif(${CMAKE_SYSTEM_NAME} MATCHES "SunOS") > > >> >> + set_property(TARGET ${target_name} APPEND_STRING > > >PROPERTY > > >> >> + LINK_FLAGS " -Wl,-z > > >> >-Wl,discard-unused=sections") > > >> >> +- elseif(NOT WIN32 AND NOT LLVM_LINKER_IS_GOLD) > > >> >> ++ elseif(NOT WIN32 AND NOT LLVM_LINKER_IS_GOLD AND NOT > > >> >${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD") > > >> >> + # Object files are compiled with > > >-ffunction-data-sections. > > >> >> + # Versions of bfd ld < 2.23.1 have a bug in > > >--gc-sections > > >> >that breaks > > >> >> + # tools that use plugins. Always pass --gc-sections once > > >we > > >> >require > > >> >> Index: patches/patch-cmake_modules_HandleLLVMOptions_cmake > > >> >> > > >=================================================================== > > >> >> RCS file: > > >> > > >>/cvs/ports/devel/llvm/patches/patch-cmake_modules_HandleLLVMOptions_cmake,v > > >> >> retrieving revision 1.1 > > >> >> diff -u -p -r1.1 patch-cmake_modules_HandleLLVMOptions_cmake > > >> >> --- patches/patch-cmake_modules_HandleLLVMOptions_cmake 18 Apr > > >2014 > > >> >09:30:48 -0000 1.1 > > >> >> +++ patches/patch-cmake_modules_HandleLLVMOptions_cmake 23 Jan > > >2016 > > >> >18:38:51 -0000 > > >> >> @@ -1,49 +1,13 @@ > > >> >> -$OpenBSD: patch-cmake_modules_HandleLLVMOptions_cmake,v 1.1 > > >> >2014/04/18 09:30:48 brad Exp $ > > >> >> ---- cmake/modules/HandleLLVMOptions.cmake.orig Sat Feb 8 > > >15:05:05 > > >> >2014 > > >> >> -+++ cmake/modules/HandleLLVMOptions.cmake Sat Feb 8 15:05:17 > > >2014 > > >> >> -@@ -7,45 +7,6 @@ include(AddLLVMDefinitions) > > >> >> - include(CheckCCompilerFlag) > > >> >> - include(CheckCXXCompilerFlag) > > >> >> - > > >> >> --if(NOT LLVM_FORCE_USE_OLD_TOOLCHAIN) > > >> >> -- if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") > > >> >> -- if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.7) > > >> >> -- message(FATAL_ERROR "Host GCC version must be at least > > >4.7!") > > >> >> -- endif() > > >> >> -- elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") > > >> >> -- if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.1) > > >> >> -- message(FATAL_ERROR "Host Clang version must be at least > > >> >3.1!") > > >> >> -- endif() > > >> >> -- > > >> >> -- # Also test that we aren't using too old of a version of > > >> >libstdc++ with the > > >> >> -- # Clang compiler. This is tricky as there is no real way to > > >> >check the > > >> >> -- # version of libstdc++ directly. Instead we test for a known > > >> >bug in > > >> >> -- # libstdc++4.6 that is fixed in libstdc++4.7. > > >> >> -- if(NOT LLVM_ENABLE_LIBCXX) > > >> >> -- set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS}) > > >> >> -- set(OLD_CMAKE_REQUIRED_LIBRARIES > > >${CMAKE_REQUIRED_LIBRARIES}) > > >> >> -- set(CMAKE_REQUIRED_FLAGS "-std=c++0x") > > >> >> -- if (ANDROID) > > >> >> -- set(CMAKE_REQUIRED_LIBRARIES "atomic") > > >> >> -- endif() > > >> >> -- check_cxx_source_compiles(" > > >> >> --#include <atomic> > > >> >> --std::atomic<float> x(0.0f); > > >> >> --int main() { return (float)x; }" > > >> >> -- LLVM_NO_OLD_LIBSTDCXX) > > >> >> -- if(NOT LLVM_NO_OLD_LIBSTDCXX) > > >> >> -- message(FATAL_ERROR "Host Clang must be able to find > > >> >libstdc++4.7 or newer!") > > >> >> -- endif() > > >> >> -- set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS}) > > >> >> -- set(CMAKE_REQUIRED_LIBRARIES > > >${OLD_CMAKE_REQUIRED_LIBRARIES}) > > >> >> -- endif() > > >> >> -- elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") > > >> >> -- if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 17.0) > > >> >> -- message(FATAL_ERROR "Host Visual Studio must be at least > > >2012 > > >> >(MSVC 17.0)") > > >> >> -- endif() > > >> >> -- endif() > > >> >> --endif() > > >> >> -- > > >> >> - if( LLVM_ENABLE_ASSERTIONS ) > > >> >> - # MSVC doesn't like _DEBUG on release builds. See PR 4379. > > >> >> - if( NOT MSVC ) > > >> >> +$OpenBSD$ > > >> >> +--- cmake/modules/HandleLLVMOptions.cmake.orig Wed Sep 9 > > >14:34:05 > > >> >2015 > > >> >> ++++ cmake/modules/HandleLLVMOptions.cmake Wed Sep 9 14:34:55 > > >2015 > > >> >> +@@ -132,7 +132,8 @@ endif() > > >> >> + # Pass -Wl,-z,defs. This makes sure all symbols are defined. > > >> >Otherwise a DSO > > >> >> + # build might work on ELF but fail on MachO/COFF. > > >> >> + if(NOT (${CMAKE_SYSTEM_NAME} MATCHES "Darwin" OR WIN32 OR CYGWIN > > >OR > > >> >> +- ${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") AND > > >> >> ++ ${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD" OR > > >> >> ++ ${CMAKE_SYSTEM_NAME} MATCHES "OpenBSD") AND > > >> >> + NOT LLVM_USE_SANITIZER) > > >> >> + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} > > >> >-Wl,-z,defs") > > >> >> + endif() > > >> >> Index: patches/patch-include_llvm_CodeGen_SelectionDAGISel_h > > >> >> > > >=================================================================== > > >> >> RCS file: patches/patch-include_llvm_CodeGen_SelectionDAGISel_h > > >> >> diff -N patches/patch-include_llvm_CodeGen_SelectionDAGISel_h > > >> >> --- patches/patch-include_llvm_CodeGen_SelectionDAGISel_h 24 Aug > > >2015 > > >> >07:45:56 -0000 1.1 > > >> >> +++ /dev/null 1 Jan 1970 00:00:00 -0000 > > >> >> @@ -1,59 +0,0 @@ > > >> >> -$OpenBSD: patch-include_llvm_CodeGen_SelectionDAGISel_h,v 1.1 > > >> >2015/08/24 07:45:56 ajacoutot Exp $ > > >> >> - > > >> >> -r219009 > > >> >> -[ISel] Keep matching state consistent when folding during X86 > > >> >address match > > >> >> - > > >> >> -In the X86 backend, matching an address is initiated by the > > >'addr' > > >> >complex > > >> >> -pattern and its friends. During this process we may reassociate > > >> >and-of-shift > > >> >> -into shift-of-and (FoldMaskedShiftToScaledMask) to allow folding > > >of > > >> >the > > >> >> -shift into the scale of the address. > > >> >> - > > >> >> -However as demonstrated by the testcase, this can trigger CSE of > > >not > > >> >only the > > >> >> -shift and the AND which the code is prepared for but also the > > >> >underlying load > > >> >> -node. In the testcase this node is sitting in the RecordedNode > > >and > > >> >MatchScope > > >> >> -data structures of the matcher and becomes a deleted node upon > > >CSE. > > >> >Returning > > >> >> -from the complex pattern function, we try to access it again > > >hitting > > >> >an assert > > >> >> -because the node is no longer a load even though this was checked > > >> >before. > > >> >> - > > >> >> -Now obviously changing the DAG this late is bending the rules but > > >I > > >> >think it > > >> >> -makes sense somewhat. Outside of addresses we prefer > > >and-of-shift > > >> >because it > > >> >> -may lead to smaller immediates (FoldMaskAndShiftToScale is an > > >even > > >> >better > > >> >> -example because it create a non-canonical node). We currently > > >don't > > >> >recognize > > >> >> -addresses during DAGCombiner where arguably this canonicalization > > >> >should be > > >> >> -performed. On the other hand, having this in the matcher allows > > >us > > >> >to cover > > >> >> -all the cases where an address can be used in an instruction. > > >> >> - > > >> >> -I've also talked a little bit to Dan Gohman on llvm-dev who added > > >> >the RAUW for > > >> >> -the new shift node in FoldMaskedShiftToScaledMask. This RAUW is > > >> >responsible > > >> >> -for initiating the recursive CSE on users > > >> >> > > >> > > >>-(http://lists.cs.uiuc.edu/pipermail/llvmdev/2014-September/076903.html) > > >> >but it > > >> >> -is not strictly necessary since the shift is hooked into the > > >visited > > >> >user. Of > > >> >> -course it's safer to keep the DAG consistent at all times (e.g. > > >for > > >> >accurate > > >> >> -number of uses, etc.). > > >> >> - > > >> >> -So rather than changing the fundamentals, I've decided to > > >continue > > >> >along the > > >> >> -previous patches and detect the CSE. This patch installs a very > > >> >targeted > > >> >> -DAGUpdateListener for the duration of a complex-pattern match and > > >> >updates the > > >> >> -matching state accordingly. (Previous patches used HandleSDNode > > >to > > >> >detect the > > >> >> -CSE but that's not practical here). The listener is only > > >installed > > >> >on X86. > > >> >> - > > >> >> -I tested that there is no measurable overhead due to this while > > >> >running > > >> >> -through the spec2k BC files with llc. The only thing we pay for > > >is > > >> >the > > >> >> -creation of the listener. The callback never ever triggers in > > >> >spec2k since > > >> >> -this is a corner case. > > >> >> - > > >> >> ---- include/llvm/CodeGen/SelectionDAGISel.h.orig Tue Aug 4 > > >22:44:44 > > >> >2015 > > >> >> -+++ include/llvm/CodeGen/SelectionDAGISel.h Tue Aug 4 22:46:22 > > >2015 > > >> >> -@@ -238,6 +238,12 @@ class SelectionDAGISel : public > > >> >MachineFunctionPass { > > >> >> - const unsigned char *MatcherTable, > > >> >> - unsigned TableSize); > > >> >> - > > >> >> -+ /// \brief Return true if complex patterns for this target can > > >> >mutate the > > >> >> -+ /// DAG. > > >> >> -+ virtual bool ComplexPatternFuncMutatesDAG() const { > > >> >> -+ return false; > > >> >> -+ } > > >> >> -+ > > >> >> - private: > > >> >> - > > >> >> - // Calls to these functions are generated by tblgen. > > >> >> Index: patches/patch-include_llvm_CodeGen_SelectionDAG_h > > >> >> > > >=================================================================== > > >> >> RCS file: patches/patch-include_llvm_CodeGen_SelectionDAG_h > > >> >> diff -N patches/patch-include_llvm_CodeGen_SelectionDAG_h > > >> >> --- patches/patch-include_llvm_CodeGen_SelectionDAG_h 15 Nov 2014 > > >> >03:26:40 -0000 1.1 > > >> >> +++ /dev/null 1 Jan 1970 00:00:00 -0000 > > >> >> @@ -1,30 +0,0 @@ > > >> >> -$OpenBSD: patch-include_llvm_CodeGen_SelectionDAG_h,v 1.1 > > >2014/11/15 > > >> >03:26:40 brad Exp $ > > >> >> - > > >> >> -r221709 > > >> >> -Totally forget deallocated SDNodes in SDDbgInfo. > > >> >> - > > >> >> -What would happen before that commit is that the SDDbgValues > > >> >associated with > > >> >> -a deallocated SDNode would be marked Invalidated, but SDDbgInfo > > >> >would keep > > >> >> -a map entry keyed by the SDNode pointer pointing to this list of > > >> >invalidated > > >> >> -SDDbgNodes. As the memory gets reused, the list might get wrongly > > >> >associated > > >> >> -with another new SDNode. As the SDDbgValues are cloned when they > > >are > > >> >transfered, > > >> >> -this can lead to an exponential number of SDDbgValues being > > >produced > > >> >during > > >> >> -DAGCombine like in http://llvm.org/bugs/show_bug.cgi?id=20893 > > >> >> - > > >> >> -Note that the previous behavior wasn't really buggy as the > > >> >invalidation made > > >> >> -sure that the SDDbgValues won't be used. This commit can be > > >> >considered a > > >> >> -memory optimization and as such is really hard to validate in a > > >> >unit-test. > > >> >> - > > >> >> ---- include/llvm/CodeGen/SelectionDAG.h.orig Fri Nov 14 21:08:36 > > >> >2014 > > >> >> -+++ include/llvm/CodeGen/SelectionDAG.h Fri Nov 14 21:09:49 2014 > > >> >> -@@ -126,6 +126,10 @@ class SDDbgInfo { (public) > > >> >> - DbgValMap[Node].push_back(V); > > >> >> - } > > >> >> - > > >> >> -+ /// \brief Invalidate all DbgValues attached to the node and > > >> >remove > > >> >> -+ /// it from the Node-to-DbgValues map. > > >> >> -+ void erase(const SDNode *Node); > > >> >> -+ > > >> >> - void clear() { > > >> >> - DbgValMap.clear(); > > >> >> - DbgValues.clear(); > > >> >> Index: patches/patch-include_llvm_Config_config_h_cmake > > >> >> > > >=================================================================== > > >> >> RCS file: patches/patch-include_llvm_Config_config_h_cmake > > >> >> diff -N patches/patch-include_llvm_Config_config_h_cmake > > >> >> --- patches/patch-include_llvm_Config_config_h_cmake 26 Jul 2014 > > >> >09:27:29 -0000 1.1 > > >> >> +++ /dev/null 1 Jan 1970 00:00:00 -0000 > > >> >> @@ -1,16 +0,0 @@ > > >> >> -$OpenBSD: patch-include_llvm_Config_config_h_cmake,v 1.1 > > >2014/07/26 > > >> >09:27:29 pascal Exp $ > > >> >> - > > >> >> -r213966 > > >> >> -Fix arc4random detection. > > >> >> - > > >> >> ---- include/llvm/Config/config.h.cmake.orig Wed Jul 9 15:45:23 > > >2014 > > >> >> -+++ include/llvm/Config/config.h.cmake Wed Jul 9 15:59:51 2014 > > >> >> -@@ -34,7 +34,7 @@ > > >> >> - #undef GCC_INSTALL_PREFIX > > >> >> - > > >> >> - /* Define to 1 if you have the `arc4random' function. */ > > >> >> --#cmakedefine HAVE_ARC4RANDOM > > >> >> -+#cmakedefine HAVE_DECL_ARC4RANDOM ${HAVE_DECL_ARC4RANDOM} > > >> >> - > > >> >> - /* Define to 1 if you have the `backtrace' function. */ > > >> >> - #cmakedefine HAVE_BACKTRACE ${HAVE_BACKTRACE} > > >> >> Index: patches/patch-include_llvm_Support_ELF_h > > >> >> > > >=================================================================== > > >> >> RCS file: patches/patch-include_llvm_Support_ELF_h > > >> >> diff -N patches/patch-include_llvm_Support_ELF_h > > >> >> --- patches/patch-include_llvm_Support_ELF_h 11 Sep 2014 17:54:13 > > >> >-0000 1.1 > > >> >> +++ /dev/null 1 Jan 1970 00:00:00 -0000 > > >> >> @@ -1,19 +0,0 @@ > > >> >> -$OpenBSD: patch-include_llvm_Support_ELF_h,v 1.1 2014/09/11 > > >17:54:13 > > >> >brad Exp $ > > >> >> - > > >> >> -r213427 > > >> >> -[PowerPC] 32-bit ELF PIC support > > >> >> - > > >> >> -This adds initial support for PPC32 ELF PIC (Position Independent > > >> >Code; the > > >> >> --fPIC variety), thus rectifying a long-standing deficiency in the > > >> >PowerPC > > >> >> -backend. > > >> >> - > > >> >> ---- include/llvm/Support/ELF.h.orig Sun Jul 27 00:01:21 2014 > > >> >> -+++ include/llvm/Support/ELF.h Sun Jul 27 00:02:18 2014 > > >> >> -@@ -437,6 +437,7 @@ enum { > > >> >> - R_PPC_GOT16_LO = 15, > > >> >> - R_PPC_GOT16_HI = 16, > > >> >> - R_PPC_GOT16_HA = 17, > > >> >> -+ R_PPC_PLTREL24 = 18, > > >> >> - R_PPC_REL32 = 26, > > >> >> - R_PPC_TLS = 67, > > >> >> - R_PPC_DTPMOD32 = 68, > > >> >> Index: patches/patch-include_llvm_Target_TargetInstrInfo_h > > >> >> > > >=================================================================== > > >> >> RCS file: patches/patch-include_llvm_Target_TargetInstrInfo_h > > >> >> diff -N patches/patch-include_llvm_Target_TargetInstrInfo_h > > >> >> --- patches/patch-include_llvm_Target_TargetInstrInfo_h 18 Sep > > >2014 > > >> >20:19:27 -0000 1.1 > > >> >> +++ /dev/null 1 Jan 1970 00:00:00 -0000 > > >> >> @@ -1,32 +0,0 @@ > > >> >> -$OpenBSD: patch-include_llvm_Target_TargetInstrInfo_h,v 1.1 > > >> >2014/09/18 20:19:27 brad Exp $ > > >> >> - > > >> >> -r217801 > > >> >> -Fix a lot of confusion around inserting nops on empty functions. > > >> >> - > > >> >> -On MachO, and MachO only, we cannot have a truly empty function > > >> >since that > > >> >> -breaks the linker logic for atomizing the section. > > >> >> - > > >> >> -When we are emitting a frame pointer, the presence of an > > >unreachable > > >> >will > > >> >> -create a cfi instruction pointing past the last instruction. This > > >is > > >> >perfectly > > >> >> -fine. The FDE information encodes the pc range it applies to. If > > >> >some tool > > >> >> -cannot handle this, we should explicitly say which bug we are > > >> >working around > > >> >> -and only work around it when it is actually relevant (not for ELF > > >> >for example). > > >> >> - > > >> >> -Given the unreachable we could omit the .cfi_def_cfa_register, > > >but > > >> >then > > >> >> -again, we could also omit the entire function prologue if we > > >wanted > > >> >to. > > >> >> - > > >> >> ---- include/llvm/Target/TargetInstrInfo.h.orig Mon Sep 15 > > >16:00:35 > > >> >2014 > > >> >> -+++ include/llvm/Target/TargetInstrInfo.h Mon Sep 15 16:01:15 > > >2014 > > >> >> -@@ -661,10 +661,8 @@ class TargetInstrInfo : public MCInstrInfo { > > >> >(public) > > >> >> - MachineBasicBlock::iterator MI) const; > > >> >> - > > >> >> - > > >> >> -- /// getNoopForMachoTarget - Return the noop instruction to use > > >> >for a noop. > > >> >> -- virtual void getNoopForMachoTarget(MCInst &NopInst) const { > > >> >> -- // Default to just using 'nop' string. > > >> >> -- } > > >> >> -+ /// Return the noop instruction to use for a noop. > > >> >> -+ virtual void getNoopForMachoTarget(MCInst &NopInst) const; > > >> >> - > > >> >> - > > >> >> - /// isPredicated - Returns true if the instruction is already > > >> >predicated. > > >> >> Index: patches/patch-lib_Analysis_IVUsers_cpp > > >> >> > > >=================================================================== > > >> >> RCS file: patches/patch-lib_Analysis_IVUsers_cpp > > >> >> diff -N patches/patch-lib_Analysis_IVUsers_cpp > > >> >> --- patches/patch-lib_Analysis_IVUsers_cpp 10 Jul 2014 22:46:37 > > >> >-0000 1.1 > > >> >> +++ /dev/null 1 Jan 1970 00:00:00 -0000 > > >> >> @@ -1,45 +0,0 @@ > > >> >> -$OpenBSD: patch-lib_Analysis_IVUsers_cpp,v 1.1 2014/07/10 > > >22:46:37 > > >> >brad Exp $ > > >> >> - > > >> >> -r203719 > > >> >> -PR17473: Don't normalize an expression during postinc > > >transformation > > >> >unless it's > > >> >> -invertible. > > >> >> - > > >> >> ---- lib/Analysis/IVUsers.cpp.orig Sun Mar 2 21:57:38 2014 > > >> >> -+++ lib/Analysis/IVUsers.cpp Sat Jun 14 03:56:54 2014 > > >> >> -@@ -186,15 +186,34 @@ bool IVUsers::AddUsersImpl(Instruction *I, > > >> >> - > > >> >> - if (AddUserToIVUsers) { > > >> >> - // Okay, we found a user that we cannot reduce. > > >> >> -- IVUses.push_back(new IVStrideUse(this, User, I)); > > >> >> -- IVStrideUse &NewUse = IVUses.back(); > > >> >> -+ IVStrideUse &NewUse = AddUser(User, I); > > >> >> - // Autodetect the post-inc loop set, populating > > >> >NewUse.PostIncLoops. > > >> >> - // The regular return value here is discarded; instead of > > >> >recording > > >> >> - // it, we just recompute it when we need it. > > >> >> -+ const SCEV *OriginalISE = ISE; > > >> >> - ISE = TransformForPostIncUse(NormalizeAutodetect, > > >> >> - ISE, User, I, > > >> >> - NewUse.PostIncLoops, > > >> >> - *SE, *DT); > > >> >> -+ > > >> >> -+ // PostIncNormalization effectively simplifies the > > >expression > > >> >under > > >> >> -+ // pre-increment assumptions. Those assumptions (no > > >wrapping) > > >> >might not > > >> >> -+ // hold for the post-inc value. Catch such cases by making > > >> >sure the > > >> >> -+ // transformation is invertible. > > >> >> -+ if (OriginalISE != ISE) { > > >> >> -+ const SCEV *DenormalizedISE = > > >> >> -+ TransformForPostIncUse(Denormalize, ISE, User, I, > > >> >> -+ NewUse.PostIncLoops, *SE, *DT); > > >> >> -+ > > >> >> -+ // If we normalized the expression, but denormalization > > >> >doesn't give the > > >> >> -+ // original one, discard this user. > > >> >> -+ if (OriginalISE != DenormalizedISE) { > > >> >> -+ DEBUG(dbgs() << " DISCARDING (NORMALIZATION ISN'T > > >> >INVERTIBLE): " > > >> >> -+ << *ISE << '\n'); > > >> >> -+ IVUses.pop_back(); > > >> >> -+ return false; > > >> >> -+ } > > >> >> -+ } > > >> >> - DEBUG(if (SE->getSCEV(I) != ISE) > > >> >> - dbgs() << " NORMALIZED TO: " << *ISE << '\n'); > > >> >> - } > > >> >> Index: patches/patch-lib_CodeGen_AsmPrinter_AsmPrinter_cpp > > >> >> > > >=================================================================== > > >> >> RCS file: patches/patch-lib_CodeGen_AsmPrinter_AsmPrinter_cpp > > >> >> diff -N patches/patch-lib_CodeGen_AsmPrinter_AsmPrinter_cpp > > >> >> --- patches/patch-lib_CodeGen_AsmPrinter_AsmPrinter_cpp 18 Sep > > >2014 > > >> >20:19:27 -0000 1.1 > > >> >> +++ /dev/null 1 Jan 1970 00:00:00 -0000 > > >> >> @@ -1,68 +0,0 @@ > > >> >> -$OpenBSD: patch-lib_CodeGen_AsmPrinter_AsmPrinter_cpp,v 1.1 > > >> >2014/09/18 20:19:27 brad Exp $ > > >> >> - > > >> >> -r217801 > > >> >> -Fix a lot of confusion around inserting nops on empty functions. > > >> >> - > > >> >> -On MachO, and MachO only, we cannot have a truly empty function > > >> >since that > > >> >> -breaks the linker logic for atomizing the section. > > >> >> - > > >> >> -When we are emitting a frame pointer, the presence of an > > >unreachable > > >> >will > > >> >> -create a cfi instruction pointing past the last instruction. This > > >is > > >> >perfectly > > >> >> -fine. The FDE information encodes the pc range it applies to. If > > >> >some tool > > >> >> -cannot handle this, we should explicitly say which bug we are > > >> >working around > > >> >> -and only work around it when it is actually relevant (not for ELF > > >> >for example). > > >> >> - > > >> >> -Given the unreachable we could omit the .cfi_def_cfa_register, > > >but > > >> >then > > >> >> -again, we could also omit the entire function prologue if we > > >wanted > > >> >to. > > >> >> - > > >> >> -r217899 > > >> >> -Add back a fallback case for targets that do not or cannot > > >implement > > >> >getNoopForMachoTarget(). > > >> >> - > > >> >> ---- lib/CodeGen/AsmPrinter/AsmPrinter.cpp.orig Sun Mar 2 > > >21:57:42 > > >> >2014 > > >> >> -+++ lib/CodeGen/AsmPrinter/AsmPrinter.cpp Tue Sep 16 22:33:35 > > >2014 > > >> >> -@@ -739,14 +739,12 @@ void AsmPrinter::EmitFunctionBody() { > > >> >> - > > >> >> - // Print out code for the function. > > >> >> - bool HasAnyRealCode = false; > > >> >> -- const MachineInstr *LastMI = 0; > > >> >> - for (MachineFunction::const_iterator I = MF->begin(), E = > > >> >MF->end(); > > >> >> - I != E; ++I) { > > >> >> - // Print a label for the basic block. > > >> >> - EmitBasicBlockStart(I); > > >> >> - for (MachineBasicBlock::const_iterator II = I->begin(), IE = > > >> >I->end(); > > >> >> - II != IE; ++II) { > > >> >> -- LastMI = II; > > >> >> - > > >> >> - // Print the assembly for the instruction. > > >> >> - if (!II->isLabel() && !II->isImplicitDef() && > > >!II->isKill() > > >> >&& > > >> >> -@@ -807,24 +805,18 @@ void AsmPrinter::EmitFunctionBody() { > > >> >> - } > > >> >> - } > > >> >> - > > >> >> -- // If the last instruction was a prolog label, then we have a > > >> >situation where > > >> >> -- // we emitted a prolog but no function body. This results in > > >the > > >> >ending prolog > > >> >> -- // label equaling the end of function label and an invalid > > >"row" > > >> >in the > > >> >> -- // FDE. We need to emit a noop in this situation so that the > > >> >FDE's rows are > > >> >> -- // valid. > > >> >> -- bool RequiresNoop = LastMI && LastMI->isPrologLabel(); > > >> >> -- > > >> >> - // If the function is empty and the object file uses > > >> >.subsections_via_symbols, > > >> >> - // then we need to emit *something* to the function body to > > >> >prevent the > > >> >> - // labels from collapsing together. Just emit a noop. > > >> >> -- if ((MAI->hasSubsectionsViaSymbols() && !HasAnyRealCode) || > > >> >RequiresNoop) { > > >> >> -+ if ((MAI->hasSubsectionsViaSymbols() && !HasAnyRealCode)) { > > >> >> - MCInst Noop; > > >> >> - TM.getInstrInfo()->getNoopForMachoTarget(Noop); > > >> >> -- if (Noop.getOpcode()) { > > >> >> -- OutStreamer.AddComment("avoids zero-length function"); > > >> >> -+ OutStreamer.AddComment("avoids zero-length function"); > > >> >> -+ > > >> >> -+ // Targets can opt-out of emitting the noop here by leaving > > >the > > >> >opcode > > >> >> -+ // unspecified. > > >> >> -+ if (Noop.getOpcode()) > > >> >> - OutStreamer.EmitInstruction(Noop, getSubtargetInfo()); > > >> >> -- } else // Target not mc-ized yet. > > >> >> -- OutStreamer.EmitRawText(StringRef("\tnop\n")); > > >> >> - } > > >> >> - > > >> >> - const Function *F = MF->getFunction(); > > >> >> Index: patches/patch-lib_CodeGen_SelectionDAG_LegalizeTypes_h > > >> >> > > >=================================================================== > > >> >> RCS file: patches/patch-lib_CodeGen_SelectionDAG_LegalizeTypes_h > > >> >> diff -N patches/patch-lib_CodeGen_SelectionDAG_LegalizeTypes_h > > >> >> --- patches/patch-lib_CodeGen_SelectionDAG_LegalizeTypes_h 14 Aug > > >> >2014 01:08:09 -0000 1.1 > > >> >> +++ /dev/null 1 Jan 1970 00:00:00 -0000 > > >> >> @@ -1,21 +0,0 @@ > > >> >> -$OpenBSD: patch-lib_CodeGen_SelectionDAG_LegalizeTypes_h,v 1.1 > > >> >2014/08/14 01:08:09 brad Exp $ > > >> >> - > > >> >> -r211435 > > >> >> -Legalizer: Add support for splitting insert_subvectors. > > >> >> - > > >> >> -We handle this by spilling the whole thing to the stack and doing > > >> >the > > >> >> -insertion as a store. > > >> >> - > > >> >> -PR19492. This happens in real code because the vectorizer creates > > >> >v2i128 when AVX is > > >> >> -enabled. > > >> >> - > > >> >> ---- lib/CodeGen/SelectionDAG/LegalizeTypes.h.orig Thu Jul 17 > > >> >01:03:52 2014 > > >> >> -+++ lib/CodeGen/SelectionDAG/LegalizeTypes.h Thu Jul 17 01:04:56 > > >> >2014 > > >> >> -@@ -570,6 +570,7 @@ class LLVM_LIBRARY_VISIBILITY > > >DAGTypeLegalizer { > > >> >(priv > > >> >> - void SplitVecRes_BUILD_VECTOR(SDNode *N, SDValue &Lo, SDValue > > >> >&Hi); > > >> >> - void SplitVecRes_CONCAT_VECTORS(SDNode *N, SDValue &Lo, > > >SDValue > > >> >&Hi); > > >> >> - void SplitVecRes_EXTRACT_SUBVECTOR(SDNode *N, SDValue &Lo, > > >> >SDValue &Hi); > > >> >> -+ void SplitVecRes_INSERT_SUBVECTOR(SDNode *N, SDValue &Lo, > > >SDValue > > >> >&Hi); > > >> >> - void SplitVecRes_FPOWI(SDNode *N, SDValue &Lo, SDValue &Hi); > > >> >> - void SplitVecRes_INSERT_VECTOR_ELT(SDNode *N, SDValue &Lo, > > >> >SDValue &Hi); > > >> >> - void SplitVecRes_LOAD(LoadSDNode *N, SDValue &Lo, SDValue > > >&Hi); > > >> >> Index: > > >patches/patch-lib_CodeGen_SelectionDAG_LegalizeVectorTypes_cpp > > >> >> > > >=================================================================== > > >> >> RCS file: > > >> >patches/patch-lib > > > > -- > > Sent from a phone, please excuse the formatting. > > > >