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.
> > 
> 
> 

Reply via email to