Skip to content
  1. Nov 28, 2016
    • Chandler Carruth's avatar
      [PM] Extend the explicit 'invalidate' method API on analysis results to · 3ab2a5a8
      Chandler Carruth authored
      accept an Invalidator that allows them to invalidate themselves if their
      dependencies are in turn invalidated.
      
      Rather than recording the dependency graph ahead of time when analysis
      get results from other analyses, this simply lets each result trigger
      the immediate invalidation of any analyses they actually depend on. They
      do this in a way that has three nice properties:
      
      1) They don't have to handle transitive dependencies because the
         infrastructure will recurse for them.
      2) The invalidate methods are still called only once. We just
         dynamically discover the necessary topological ordering, everything
         is memoized nicely.
      3) The infrastructure still provides a default implementation and can
         access it so that only analyses which have dependencies need to do
         anything custom.
      
      To make this work at all, the invalidation logic also has to defer the
      deletion of the result objects themselves so that they can remain alive
      until we have collected the complete set of results to invalidate.
      
      A unittest is added here that has exactly the dependency pattern we are
      concerned with. It hit the use-after-free described by Sean in much
      detail in the long thread about analysis invalidation before this
      change, and even in an intermediate form of this change where we failed
      to defer the deletion of the result objects.
      
      There is an important problem with doing dependency invalidation that
      *isn't* solved here: we don't *enforce* that results correctly
      invalidate all the analyses whose results they depend on.
      
      I actually looked at what it would take to do that, and it isn't as hard
      as I had thought but the complexity it introduces seems very likely to
      outweigh the benefit. The technique would be to provide a base class for
      an analysis result that would be populated with other results, and
      automatically provide the invalidate method which immediately does the
      correct thing. This approach has some nice pros IMO:
      - Handles the case we care about and nothing else: only *results*
        that depend on other analyses trigger extra invalidation.
      - Localized to the result rather than centralized in the analysis
        manager.
      - Ties the storage of the reference to another result to the triggering
        of the invalidation of that analysis.
      - Still supports extending invalidation in customized ways.
      
      But the down sides here are:
      - Very heavy-weight meta-programming is needed to provide this base
        class.
      - Requires a pretty awful API for accessing the dependencies.
      
      Ultimately, I fear it will not pull its weight. But we can re-evaluate
      this at any point if we start discovering consistent problems where the
      invalidation and dependencies get out of sync. It will fit as a clean
      layer on top of the facilities in this patch that we can add if and when
      we need it.
      
      Note that I'm not really thrilled with the names for these APIs... The
      name "Invalidator" seems ok but not great. The method name "invalidate"
      also. In review some improvements were suggested, but they really need
      *other* uses of these terms to be updated as well so I'm going to do
      that in a follow-up commit.
      
      I'm working on the actual fixes to various analyses that need to use
      these, but I want to try to get tests for each of them so we don't
      regress. And those changes are seperable and obvious so once this goes
      in I should be able to roll them out throughout LLVM.
      
      Many thanks to Sean, Justin, and others for help reviewing here.
      
      Differential Revision: https://reviews.llvm.org/D23738
      
      llvm-svn: 288077
      3ab2a5a8
    • Peter Collingbourne's avatar
      cmake: Set rpath for loadable modules as well as shared libraries. · b192a206
      Peter Collingbourne authored
      This fixes a regression introduced by r285714: we weren't setting the
      rpath on LLVMgold.so correctly.
      
      Spotted by mark@chromium.org!
      
      Differential Revision: https://reviews.llvm.org/D27176
      
      llvm-svn: 288076
      b192a206
    • Eli Friedman's avatar
      [SROA] Drop lifetime.start/end intrinsics when they block promotion. · 50967753
      Eli Friedman authored
      Preserving lifetime markers isn't as important as allowing promotion,
      so just drop the lifetime markers if necessary.
      
      This also fixes an assertion failure where other parts of SROA assumed
      that lifetime markers never block promotion.
      
      Fixes https://llvm.org/bugs/show_bug.cgi?id=29139.
      
      Differential Revision: https://reviews.llvm.org/D24854
      
      llvm-svn: 288074
      50967753
    • Sanjay Patel's avatar
      [DAG] add helper function for selectcc --> and+shift transforms; NFC · 1cf9aff6
      Sanjay Patel authored
      llvm-svn: 288073
      1cf9aff6
    • Mehdi Amini's avatar
      Improve error handling in YAML parsing · 3ab3fef2
      Mehdi Amini authored
      Some scanner errors were not checked and reported by the parser.
      
      Fix PR30934. Recommit r288014 after fixing unittest.
      
      Patch by: Serge Guelton <serge.guelton@telecom-bretagne.eu>
      
      Differential Revision: https://reviews.llvm.org/D26419
      
      llvm-svn: 288071
      3ab3fef2
    • David Blaikie's avatar
      [DebugInfo] Add support for DW_AT_main_subprogram on subprograms · ce3c8ef2
      David Blaikie authored
      Patch by Tom Tromey! (for use with Rust)
      
      llvm-svn: 288068
      ce3c8ef2
    • Matthias Braun's avatar
      MachineScheduler: Export function to construct "default" scheduler. · 115efcd3
      Matthias Braun authored
      This makes the createGenericSchedLive() function that constructs the
      default scheduler available for the public API. This should help when
      you want to get a scheduler and the default list of DAG mutations.
      
      This also shrinks the list of default DAG mutations:
      {Load|Store}ClusterDAGMutation and MacroFusionDAGMutation are no longer
      added by default. Targets can easily add them if they need them. It also
      makes it easier for targets to add alternative/custom macrofusion or
      clustering mutations while staying with the default
      createGenericSchedLive(). It also saves the callback back and forth in
      TargetInstrInfo::enableClusterLoads()/enableClusterStores().
      
      Differential Revision: https://reviews.llvm.org/D26986
      
      llvm-svn: 288057
      115efcd3
    • Artem Belevich's avatar
      Revert r287637 "[wasm] hack around test failure after r287553." · 57b99f9b
      Artem Belevich authored
      -cgp-freq-ratio-to-skip-merge option was removed by rollback in r288052.
      
      llvm-svn: 288055
      57b99f9b
    • Stanislav Mekhanoshin's avatar
      [AMDGPU] Allow hoisting of comparisons out of a loop and eliminate condition copies · 0ee250ee
      Stanislav Mekhanoshin authored
      Codegen prepare sinks comparisons close to a user is we have only one register
      for conditions. For AMDGPU we have many SGPRs capable to hold vector conditions.
      Changed BE to report we have many condition registers. That way IR LICM pass
      would hoist an invariant comparison out of a loop and codegen prepare will not
      sink it.
      
      With that done a condition is calculated in one block and used in another.
      Current behavior is to store workitem's condition in a VGPR using v_cndmask_b32
      and then restore it with yet another v_cmp instruction from that v_cndmask's
      result. To mitigate the issue a propagation of source SGPR pair in place of v_cmp
      is implemented. Additional side effect of this is that we may consume less VGPRs
      at a cost of more SGPRs in case if holding of multiple conditions is needed, and
      that is a clear win in most cases.
      
      Differential Revision: https://reviews.llvm.org/D26114
      
      llvm-svn: 288053
      0ee250ee
    • Joerg Sonnenberger's avatar
      Revert r287553: [CodeGenPrep] Skip merging empty case blocks · caaa82d9
      Joerg Sonnenberger authored
      It results in assertions in lib/Analysis/BlockFrequencyInfoImpl.cpp line
      670 ("Expected irreducible CFG").
      
      llvm-svn: 288052
      caaa82d9
    • Justin Lebar's avatar
      [StructurizeCFG] Use range-based for loops. · 3aec10ca
      Justin Lebar authored
      Reviewers: arsenm
      
      Subscribers: wdng, llvm-commits
      
      Differential Revision: https://reviews.llvm.org/D27000
      
      llvm-svn: 288051
      3aec10ca
    • Justin Lebar's avatar
      [StructurizeCFG] Refactor NearestCommonDominator. · 62c20d8b
      Justin Lebar authored
      Summary:
      As far as I can tell, doing our own computations in
      NearestCommonDominator is a false optimization -- DomTree will build up
      what appears to be exactly this data when it decides it's worthwhile.
      Moreover, by building the cache ourselves, we cannot take advantage of
      the cache that the domtree might have available.
      
      In addition, I am not convinced of the correctness of the original code.
      In particular, setting ResultIndex = 1 on the first addBlock instead of
      setting it to 0 is quite fishy.  Similarly, it's not clear to me that
      setting IndexMap[Node] = 0 for every node as we walk up the tree finding
      a common parent is correct.  But rather than ponder over these
      questions, I'd rather just make the code do the obviously-correct thing.
      
      This patch also changes the NearestCommonDominator API a bit, improving
      the names and getting rid of the boolean parameter in addBlock -- see
      http://jlebar.com/2011/12/16/Boolean_parameters_to_API_functions_considered_harmful..html
      
      Reviewers: arsenm
      
      Subscribers: aemerson, wdng, llvm-commits
      
      Differential Revision: https://reviews.llvm.org/D26998
      
      llvm-svn: 288050
      62c20d8b
    • Simon Pilgrim's avatar
      2228f70a
    • Adam Nemet's avatar
      [GVN, OptDiag] Include the value that is forwarded in load elimination · a415a9bd
      Adam Nemet authored
      This requires some changes to the opt-diag API.  Hal and I have
      discussed this at the Dev Meeting and came up with a streaming delimiter
      (setExtraArgs) to solve this.
      
      Arguments after this delimiter are only included in the optimization
      records and not in the remarks printed in the compiler output.  (Note,
      how in the test the content of the YAML file changes but the remarks on
      the compiler output don't.)
      
      This implements the green GVN message with a bug fix at line
      http://lab.llvm.org:8080/artifacts/opt-view_test-suite/build/SingleSource/Benchmarks/Dhrystone/CMakeFiles/dry.dir/html/_org_test-suite_SingleSource_Benchmarks_Dhrystone_dry.c.html#L446
      
      The fix is that now we properly include the constant value in the
      message: "load of type i32 eliminated in favor of 7"
      
      Differential Revision: https://reviews.llvm.org/D26489
      
      llvm-svn: 288047
      a415a9bd
    • Adam Nemet's avatar
      [GVN] Basic optimization remark support · e5112b14
      Adam Nemet authored
      Follow-on patches will add more interesting cases.
      
      The goal of this patch-set is to get the GVN messages printed in
      opt-viewer from Dhrystone as was presented in my Dev Meeting talk.  This
      is the optimization view for the function (the last remark in the
      function has a bug which is fixed in this series):
      http://lab.llvm.org:8080/artifacts/opt-view_test-suite/build/SingleSource/Benchmarks/Dhrystone/CMakeFiles/dry.dir/html/_org_test-suite_SingleSource_Benchmarks_Dhrystone_dry.c.html#L430
      
      Differential Revision: https://reviews.llvm.org/D26488
      
      llvm-svn: 288046
      e5112b14
    • Sanjay Patel's avatar
      [x86] fix formatting; NFC · 100bc01a
      Sanjay Patel authored
      llvm-svn: 288045
      100bc01a
    • Daniil Fukalov's avatar
      [CMAKE] fix LLVM_OPTIMIZED_TABLEGEN for Visual Studio · fb501330
      Daniil Fukalov authored
      At the moment optimized tablegen is generated by LLVM_USE_HOST_TOOLS variable that is not set for Visual Sudio since LLVM_ENABLE_ASSERTIONS depends on CMAKE_BUILD_TYPE value that is not equal to "DEBUG" in case of Visual Studio soltion generation.
      
      Modified to do not depend on LLVM_ENABLE_ASSERTIONS value in VS and Xcode cases
      
      Reviewers: beanz
      
      Subscribers: RKSimon, llvm-commits, mgorny
      
      Differential Revision: https://reviews.llvm.org/D27135
      
      llvm-svn: 288042
      fb501330
    • Adam Nemet's avatar
      [LTO] Move finishOptimizationRemarks after codegen · 58951d38
      Adam Nemet authored
      This addresses the comment D26832.
      
      llvm-svn: 288041
      58951d38
    • Simon Pilgrim's avatar
      [X86][SSE] Added support for combining bit-shifts with shuffles. · 3f10e669
      Simon Pilgrim authored
      Bit-shifts by a whole number of bytes can be represented as a shuffle mask suitable for combining.
      
      Added a 'getFauxShuffleMask' function to allow us to create shuffle masks from other suitable operations.
      
      llvm-svn: 288040
      3f10e669
    • Simon Pilgrim's avatar
      3def9e11
    • Daniel Cederman's avatar
      Test commit · 59168e28
      Daniel Cederman authored
      llvm-svn: 288036
      59168e28
    • Nirav Dave's avatar
      Revert "[DAG] Improve loads-from-store forwarding to handle TokenFactor" · a4133617
      Nirav Dave authored
      This reverts commit r287773 which caused issues with ppc64le builds.
      
      llvm-svn: 288035
      a4133617
    • Ulrich Weigand's avatar
      [SystemZ] Fix build bot fallout from r288030 · a29bf16e
      Ulrich Weigand authored
      Remove unused variable that came in due to a copy-and-paste bug
      and caused build bot failures.
      
      llvm-svn: 288033
      a29bf16e
    • Ulrich Weigand's avatar
      [SystemZ] Support execution hint instructions · 84404f30
      Ulrich Weigand authored
      This adds assembler support for the instructions provided by the
      execution-hint facility (NIAI and BP(R)P).  This required adding
      support for the new relocation types for 12-bit and 24-bit PC-
      relative offsets used by the BP(R)P instructions.
      
      llvm-svn: 288031
      84404f30
    • Ulrich Weigand's avatar
      [SystemZ] Support load-and-trap instructions · 2d9e3d9d
      Ulrich Weigand authored
      This adds support for the instructions provided with the
      load-and-trap facility.
      
      llvm-svn: 288030
      2d9e3d9d
    • Ulrich Weigand's avatar
      [SystemZ] Add remaining branch instructions · 75839913
      Ulrich Weigand authored
      This patch adds assembler support for the remaining branch instructions:
      the non-relative branch on count variants, and all variants of branch
      on index.
      
      The only one of those that can be readily exploited for code generation
      is BRCTH (branch on count using a high 32-bit register as count).  Do
      use it, however, it is necessary to also introduce a hew CHIMux pseudo
      to allow comparisons of a 32-bit value agains a short immediate to go
      into a high register as well (implemented via CHI/CIH).
      
      This causes a bit of codegen changes overall, but those have proven to
      be neutral (or even beneficial) in performance measurements.
      
      llvm-svn: 288029
      75839913
    • Ulrich Weigand's avatar
      [SystemZ] Improve use of conditional instructions · 524f276c
      Ulrich Weigand authored
      This patch moves formation of LOC-type instructions from (late)
      IfConversion to the early if-conversion pass, and in some cases
      additionally creates them directly from select instructions
      during DAG instruction selection.
      
      To make early if-conversion work, the patch implements the
      canInsertSelect / insertSelect callbacks.  It also implements
      the commuteInstructionImpl and FoldImmediate callbacks to
      enable generation of the full range of LOC instructions.
      
      Finally, the patch adds support for all instructions of the
      load-store-on-condition-2 facility, which allows using LOC
      instructions also for high registers.
      
      Due to the use of the GRX32 register class to enable high registers,
      we now also have to handle the cases where there are still no single
      hardware instructions (conditional move from a low register to a high
      register or vice versa).  These are converted back to a branch sequence
      after register allocation.  Since the expandRAPseudos callback is not
      allowed to create new basic blocks, this requires a simple new pass,
      modelled after the ARM/AArch64 ExpandPseudos pass.
      
      Overall, this patch causes significantly more LOC-type instructions
      to be used, and results in a measurable performance improvement.
      
      llvm-svn: 288028
      524f276c
    • James Molloy's avatar
      [InlineCost] Reduce inline thresholds to compensate for cost changes · 6bed13c5
      James Molloy authored
      In r286814, the algorithm for calculating inline costs changed. This
      caused more inlining to take place which is especially apparent
      in optsize and minsize modes.
      
      As the cost calculation removed a skewed behaviour (we were inconsistent
      about the cost of calls) it isn't possible to update the thresholds to
      get exactly the same behaviour as before. However, this threshold change
      accounts for the very common case where an inline candidate has no
      calls within it. In this case, r286814 would inline around 5-6 more (IR)
      instructions.
      
      The changes to -Oz have been heavily benchmarked. The "obvious" value
      for the inline threshold at -Oz is zero, but due to inaccuracies in the
      inline heuristics this can actually cause code size increases due to
      not inlining key thunk functions (that then disappear). Experimentally,
      5 was the sweet spot for code size over the test-suite.
      
      For -Os, this change removes the outlier results shown up by green dragon
      (http://104.154.54.203/db_default/v4/nts/13248).
      
      Fixes D26848.
      
      llvm-svn: 288024
      6bed13c5
    • Chandler Carruth's avatar
      [PM] Remove weird marking of invalidated analyses as "preserved". · 0c6efff1
      Chandler Carruth authored
      This never made a lot of sense. They've been invalidated for one IR unit
      but they aren't really preserved in any normal sense. It seemed like it
      would be an elegant way of communicating to outer IR units that pass
      managers and adaptors had already handled invalidation, but we've since
      ended up adding sets that model this more clearly: we're now using
      the 'AllAnalysesOn<IRUnitT>' set to handle cases where the trick of
      "preserving" invalidated analyses didn't work.
      
      This patch moves to rely on that technique exclusively and removes the
      cumbersome API aspect of updating the preserved set when doing
      invalidation. This in turn will simplify a *number* of upcoming patches.
      
      This has a side benefit of exposing a number of places where we were
      failing to mark the 'AllAnalysesOn<IRUnitT>' set as preserved. This
      patch fixes those, and with those fixes shouldn't change any observable
      behavior.
      
      llvm-svn: 288023
      0c6efff1
    • Davide Italiano's avatar
      0f0d5d8f
    • Davide Italiano's avatar
      [ThreadPool] Remove outdated comment after r288016. · 3dd87dad
      Davide Italiano authored
      llvm-svn: 288017
      3dd87dad
    • Davide Italiano's avatar
      [ThreadPool] Simplify the interface. NFCI. · 3ea0bfa7
      Davide Italiano authored
      The callers don't use the return value. Found by Michael
      Spencer.
      
      llvm-svn: 288016
      3ea0bfa7
    • Mehdi Amini's avatar
      Revert "Improve error handling in YAML parsing" · 43c24282
      Mehdi Amini authored
      This reverts commit r288014, the unittest isn't passing
      
      llvm-svn: 288015
      43c24282
    • Mehdi Amini's avatar
      Improve error handling in YAML parsing · c54281be
      Mehdi Amini authored
      Some scanner errors were not checked and reported by the parser.
      
      Fix PR30934
      
      Patch by: Serge Guelton <serge.guelton@telecom-bretagne.eu>
      
      Differential Revision: https://reviews.llvm.org/D26419
      
      llvm-svn: 288014
      c54281be
    • Chandler Carruth's avatar
      [PM] Add an ASCII-art diagram for the call graph in the CGSCC unit test. · 4cf2c898
      Chandler Carruth authored
      No functionality changed.
      
      llvm-svn: 288013
      4cf2c898
  2. Nov 27, 2016
Loading