>From what I've seen so far, sticking to released versions of LLVM and clang 
>(maybe with minor fixes) would help a lot.

What we have at the moment is a snapshot between versions before LLVM started 
requiring  c++11. I think this was useful at the time but I don't think it's so 
useful any more - most significant actively-developed c++ programs now require 
proper c++11 (including libraries and in many cases thread local storage) or 
will do so in their next major release.

I don't think we should split the port into multiple versions unless we still 
have significant problems with a standard released version.

On 24 January 2016 09:36:15 GMT+00:00, Jonathan Gray <j...@jsg.id.au> 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.
>
>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(), I

-- 
Sent from a phone, please excuse the formatting.

Reply via email to