Skip to content
  1. Sep 30, 2019
  2. Sep 07, 2019
    • Teresa Johnson's avatar
      Change TargetLibraryInfo analysis passes to always require Function · 9c27b59c
      Teresa Johnson authored
      Summary:
      This is the first change to enable the TLI to be built per-function so
      that -fno-builtin* handling can be migrated to use function attributes.
      See discussion on D61634 for background. This is an enabler for fixing
      handling of these options for LTO, for example.
      
      This change should not affect behavior, as the provided function is not
      yet used to build a specifically per-function TLI, but rather enables
      that migration.
      
      Most of the changes were very mechanical, e.g. passing a Function to the
      legacy analysis pass's getTLI interface, or in Module level cases,
      adding a callback. This is similar to the way the per-function TTI
      analysis works.
      
      There was one place where we were looking for builtins but not in the
      context of a specific function. See FindCXAAtExit in
      lib/Transforms/IPO/GlobalOpt.cpp. I'm somewhat concerned my workaround
      could provide the wrong behavior in some corner cases. Suggestions
      welcome.
      
      Reviewers: chandlerc, hfinkel
      
      Subscribers: arsenm, dschuff, jvesely, nhaehnle, mehdi_amini, javed.absar, sbc100, jgravelle-google, eraman, aheejin, steven_wu, george.burgess.iv, dexonsmith, jfb, asbirlea, gchatelet, llvm-commits
      
      Tags: #llvm
      
      Differential Revision: https://reviews.llvm.org/D66428
      
      llvm-svn: 371284
      9c27b59c
  3. Aug 15, 2019
  4. Apr 23, 2019
  5. Apr 19, 2019
  6. Apr 05, 2019
  7. Apr 03, 2019
  8. Feb 21, 2019
    • Wei Mi's avatar
      [Inliner] Pass nullptr for the ORE param of getInlineCost if RemarkEnabled · 500606f2
      Wei Mi authored
      is false.
      
      Right now for inliner and partial inliner, we always pass the address of a
      valid ORE object to getInlineCost even if RemarkEnabled is false because of
      no -Rpass is specified. Since ComputeFullInlineCost will be set to true if
      ORE is non-null in getInlineCost, this introduces the problem that in
      getInlineCost we cannot return early even if we already know the cost is
      definitely higher than the threshold. It is a general problem for compile
      time.
      
      This patch fixes that by pass nullptr as the ORE argument if RemarkEnabled is
      false.
      
      Differential Revision: https://reviews.llvm.org/D58399
      
      llvm-svn: 354542
      500606f2
  9. Jan 19, 2019
    • Chandler Carruth's avatar
      Update the file headers across all of the LLVM projects in the monorepo · 2946cd70
      Chandler Carruth authored
      to reflect the new license.
      
      We understand that people may be surprised that we're moving the header
      entirely to discuss the new license. We checked this carefully with the
      Foundation's lawyer and we believe this is the correct approach.
      
      Essentially, all code in the project is now made available by the LLVM
      project under our new license, so you will see that the license headers
      include that license only. Some of our contributors have contributed
      code under our old license, and accordingly, we have retained a copy of
      our old license notice in the top-level files in each project and
      repository.
      
      llvm-svn: 351636
      2946cd70
  10. Jan 05, 2019
    • Easwaran Raman's avatar
      [Inliner] Optimize shouldBeDeferred · 366a873f
      Easwaran Raman authored
      This has some minor optimizations to shouldBeDeferred. This is not
      strictly NFC because the early exit inside the loop assumes
      TotalSecondaryCost is monotonically non-decreasing, which is not true if
      the threshold used by CostAnalyzer is negative. AFAICT the thresholds do
      not go below 0 for the default values of the various options we use.
      
      llvm-svn: 350456
      366a873f
  11. Nov 19, 2018
    • Vedant Kumar's avatar
      [ProfileSummary] Standardize methods and fix comment · e7b789b5
      Vedant Kumar authored
      Every Analysis pass has a get method that returns a reference of the Result of
      the Analysis, for example, BlockFrequencyInfo
      &BlockFrequencyInfoWrapperPass::getBFI().  I believe that
      ProfileSummaryInfo::getPSI() is the only exception to that, as it was returning
      a pointer.
      
      Another change is renaming isHotBB and isColdBB to isHotBlock and isColdBlock,
      respectively.  Most methods use BB as the argument of variable names while
      methods usually refer to Basic Blocks as Blocks, instead of BB.  For example,
      Function::getEntryBlock, Loop:getExitBlock, etc.
      
      I also fixed one of the comments.
      
      Patch by Rodrigo Caetano Rocha!
      
      Differential Revision: https://reviews.llvm.org/D54669
      
      llvm-svn: 347182
      e7b789b5
  12. Oct 24, 2018
    • Wei Mi's avatar
      [PM] keeping history when original SCC split and then merge into itself · 80a0c97e
      Wei Mi authored
      in the same round of SCC update.
      
      In https://reviews.llvm.org/rL309784, inline history is added to prevent
      infinite inlining across multiple run of inliner and SCC update, but the
      history will only be kept when new SCC is actually generated during SCC update.
      
      We found a case that SCC can be split and then merge into itself in the same
      round of SCC update, so the same SCC will be pop out from UR.CWorklist and
      then added back immediately, without any new SCC generated, that is why the
      existing patch cannot catch the infinite inline case.
      
      What the patch does is even if no new SCC is generated, if only the current
      SCC appears in UR.CWorklist again, then keep the inline history.
      
      Differential Revision: https://reviews.llvm.org/D52915
      
      llvm-svn: 345103
      80a0c97e
  13. Aug 28, 2018
    • David Bolvansky's avatar
      [Inliner] Attribute callsites with inline remarks · c1b27b56
      David Bolvansky authored
      Summary:
      Sometimes reading an output *.ll file it is not easy to understand why some callsites are not inlined. We can read output of inline remarks (option --pass-remarks-missed=inline) and try correlating its messages with the callsites.
      
      An easier way proposed by this patch is to add to every callsite processed by Inliner an attribute with the latest message that describes the cause of not inlining this callsite. The attribute is called //inline-remark//. By default this feature is off. It can be switched on by the option //-inline-remark-attribute//.
      
      For example in the provided test the result method //@test1// has two callsites //@bar// and inline remarks report different inlining missed reasons:
        remark: <unknown>:0:0: bar not inlined into test1 because too costly to inline (cost=-5, threshold=-6)
        remark: <unknown>:0:0: bar not inlined into test1 because it should never be inlined (cost=never): recursive
      
      It is not clear which remark correspond to which callsite. With the inline remark attribute enabled we get the reasons attached to their callsites:
        define void @test1() {
          call void @bar(i1 true) #0
          call void @bar(i1 false) #2
          ret void
        }
        attributes #0 = { "inline-remark"="(cost=-5, threshold=-6)" }
        ..
        attributes #2 = { "inline-remark"="(cost=never): recursive" }
      
      Patch by: yrouban (Yevgeny Rouban)
      
      Reviewers: xbolva00, tejohnson, apilipenko
      
      Reviewed By: xbolva00, tejohnson
      
      Subscribers: eraman, llvm-commits
      
      Differential Revision: https://reviews.llvm.org/D50435
      
      llvm-svn: 340834
      c1b27b56
  14. Aug 24, 2018
    • David Bolvansky's avatar
      Revert [Inliner] Attribute callsites with inline remarks · 1ccbddca
      David Bolvansky authored
      llvm-svn: 340619
      1ccbddca
    • David Bolvansky's avatar
      [Inliner] Attribute callsites with inline remarks · 7c0537a3
      David Bolvansky authored
      Summary:
      Sometimes reading an output *.ll file it is not easy to understand why some callsites are not inlined. We can read output of inline remarks (option --pass-remarks-missed=inline) and try correlating its messages with the callsites.
      
      An easier way proposed by this patch is to add to every callsite processed by Inliner an attribute with the latest message that describes the cause of not inlining this callsite. The attribute is called //inline-remark//. By default this feature is off. It can be switched on by the option //-inline-remark-attribute//.
      
      For example in the provided test the result method //@test1// has two callsites //@bar// and inline remarks report different inlining missed reasons:
        remark: <unknown>:0:0: bar not inlined into test1 because too costly to inline (cost=-5, threshold=-6)
        remark: <unknown>:0:0: bar not inlined into test1 because it should never be inlined (cost=never): recursive
      
      It is not clear which remark correspond to which callsite. With the inline remark attribute enabled we get the reasons attached to their callsites:
        define void @test1() {
          call void @bar(i1 true) #0
          call void @bar(i1 false) #2
          ret void
        }
        attributes #0 = { "inline-remark"="(cost=-5, threshold=-6)" }
        ..
        attributes #2 = { "inline-remark"="(cost=never): recursive" }
      
      Patch by: yrouban (Yevgeny Rouban)
      
      Reviewers: xbolva00, tejohnson, apilipenko
      
      Reviewed By: xbolva00, tejohnson
      
      Subscribers: eraman, llvm-commits
      
      Differential Revision: https://reviews.llvm.org/D50435
      
      llvm-svn: 340618
      7c0537a3
  15. Aug 14, 2018
  16. Aug 06, 2018
  17. Aug 05, 2018
    • David Bolvansky's avatar
      Enrich inline messages · c0aa4b75
      David Bolvansky authored
      Summary:
      This patch improves Inliner to provide causes/reasons for negative inline decisions.
      1. It adds one new message field to InlineCost to report causes for Always and Never instances. All Never and Always instantiations must provide a simple message.
      2. Several functions that used to return the inlining results as boolean are changed to return InlineResult which carries the cause for negative decision.
      3. Changed remark priniting and debug output messages to provide the additional messages and related inline cost.
      4. Adjusted tests for changed printing.
      
      Patch by: yrouban (Yevgeny Rouban)
      
      
      Reviewers: craig.topper, sammccall, sgraenitz, NutshellySima, shchenz, chandlerc, apilipenko, javed.absar, tejohnson, dblaikie, sanjoy, eraman, xbolva00
      
      Reviewed By: tejohnson, xbolva00
      
      Subscribers: xbolva00, llvm-commits, arsenm, mehdi_amini, eraman, haicheng, steven_wu, dexonsmith
      
      Differential Revision: https://reviews.llvm.org/D49412
      
      llvm-svn: 338969
      c0aa4b75
  18. Aug 01, 2018
    • David Bolvansky's avatar
      Revert "Enrich inline messages", tests fail · fbbb83c7
      David Bolvansky authored
      llvm-svn: 338496
      fbbb83c7
    • David Bolvansky's avatar
      Enrich inline messages · 7f36cd9d
      David Bolvansky authored
      Summary:
      This patch improves Inliner to provide causes/reasons for negative inline decisions.
      1. It adds one new message field to InlineCost to report causes for Always and Never instances. All Never and Always instantiations must provide a simple message.
      2. Several functions that used to return the inlining results as boolean are changed to return InlineResult which carries the cause for negative decision.
      3. Changed remark priniting and debug output messages to provide the additional messages and related inline cost.
      4. Adjusted tests for changed printing.
      
      Patch by: yrouban (Yevgeny Rouban)
      
      
      Reviewers: craig.topper, sammccall, sgraenitz, NutshellySima, shchenz, chandlerc, apilipenko, javed.absar, tejohnson, dblaikie, sanjoy, eraman, xbolva00
      
      Reviewed By: tejohnson, xbolva00
      
      Subscribers: xbolva00, llvm-commits, arsenm, mehdi_amini, eraman, haicheng, steven_wu, dexonsmith
      
      Differential Revision: https://reviews.llvm.org/D49412
      
      llvm-svn: 338494
      7f36cd9d
  19. Jul 31, 2018
    • David Bolvansky's avatar
      Revert Enrich inline messages · ab79414f
      David Bolvansky authored
      llvm-svn: 338389
      ab79414f
    • David Bolvansky's avatar
      Enrich inline messages · b562dbab
      David Bolvansky authored
      Summary:
      This patch improves Inliner to provide causes/reasons for negative inline decisions.
      1. It adds one new message field to InlineCost to report causes for Always and Never instances. All Never and Always instantiations must provide a simple message.
      2. Several functions that used to return the inlining results as boolean are changed to return InlineResult which carries the cause for negative decision.
      3. Changed remark priniting and debug output messages to provide the additional messages and related inline cost.
      4. Adjusted tests for changed printing.
      
      Patch by: yrouban (Yevgeny Rouban)
      
      
      Reviewers: craig.topper, sammccall, sgraenitz, NutshellySima, shchenz, chandlerc, apilipenko, javed.absar, tejohnson, dblaikie, sanjoy, eraman, xbolva00
      
      Reviewed By: tejohnson, xbolva00
      
      Subscribers: xbolva00, llvm-commits, arsenm, mehdi_amini, eraman, haicheng, steven_wu, dexonsmith
      
      Differential Revision: https://reviews.llvm.org/D49412
      
      llvm-svn: 338387
      b562dbab
  20. Jun 28, 2018
  21. Jun 04, 2018
    • David Blaikie's avatar
      Move Analysis/Utils/Local.h back to Transforms · 31b98d2e
      David Blaikie authored
      Review feedback from r328165. Split out just the one function from the
      file that's used by Analysis. (As chandlerc pointed out, the original
      change only moved the header and not the implementation anyway - which
      was fine for the one function that was used (since it's a
      template/inlined in the header) but not in general)
      
      llvm-svn: 333954
      31b98d2e
  22. May 14, 2018
    • Nicola Zaghen's avatar
      Rename DEBUG macro to LLVM_DEBUG. · d34e60ca
      Nicola Zaghen authored
          
      The DEBUG() macro is very generic so it might clash with other projects.
      The renaming was done as follows:
      - git grep -l 'DEBUG' | xargs sed -i 's/\bDEBUG\s\?(/LLVM_DEBUG(/g'
      - git diff -U0 master | ../clang/tools/clang-format/clang-format-diff.py -i -p1 -style LLVM
      - Manual change to APInt
      - Manually chage DOCS as regex doesn't match it.
      
      In the transition period the DEBUG() macro is still present and aliased
      to the LLVM_DEBUG() one.
      
      Differential Revision: https://reviews.llvm.org/D43624
      
      llvm-svn: 332240
      d34e60ca
  23. May 08, 2018
  24. Mar 21, 2018
    • David Blaikie's avatar
      Fix a couple of layering violations in Transforms · 2be39228
      David Blaikie authored
      Remove #include of Transforms/Scalar.h from Transform/Utils to fix layering.
      
      Transforms depends on Transforms/Utils, not the other way around. So
      remove the header and the "createStripGCRelocatesPass" function
      declaration (& definition) that is unused and motivated this dependency.
      
      Move Transforms/Utils/Local.h into Analysis because it's used by
      Analysis/MemoryBuiltins.cpp.
      
      llvm-svn: 328165
      2be39228
  25. Oct 19, 2017
  26. Oct 11, 2017
  27. Oct 10, 2017
  28. Sep 28, 2017
    • Sanjoy Das's avatar
      Use a BumpPtrAllocator for Loop objects · def1729d
      Sanjoy Das authored
      Summary:
      And now that we no longer have to explicitly free() the Loop instances, we can
      (with more ease) use the destructor of LoopBase to do what LoopBase::clear() was
      doing.
      
      Reviewers: chandlerc
      
      Subscribers: mehdi_amini, mcrosier, llvm-commits
      
      Differential Revision: https://reviews.llvm.org/D38201
      
      llvm-svn: 314375
      def1729d
  29. Sep 20, 2017
    • Adam Nemet's avatar
      Allow ORE.emit to take a closure to delay building the remark object · 15fccf00
      Adam Nemet authored
      In the lambda we are now returning the remark by value so we need to preserve
      its type in the insertion operator.  This requires making the insertion
      operator generic.
      
      I've also converted a few cases to use the new API.  It seems to work pretty
      well.  See the LoopUnroller for a slightly more interesting case.
      
      llvm-svn: 313691
      15fccf00
  30. Aug 21, 2017
  31. Aug 20, 2017
  32. Aug 02, 2017
    • Chandler Carruth's avatar
      [PM] Fix a bug where through CGSCC iteration we can get · 95055d8f
      Chandler Carruth authored
      infinite-inlining across multiple runs of the inliner by keeping a tiny
      history of internal-to-SCC inlining decisions.
      
      This is still a bit gross, but I don't yet have any fundamentally better
      ideas and numerous people are blocked on this to use new PM and ThinLTO
      together.
      
      The core of the idea is to detect when we are about to do an inline that
      has a chance of re-splitting an SCC which we have split before with
      a similar inlining step. That is a critical component in the inlining
      forming a cycle and so far detects all of the various cyclic patterns
      I can come up with as well as the original real-world test case (which
      comes from a ThinLTO build of libunwind).
      
      I've added some tests that I think really demonstrate what is going on
      here. They are essentially state machines that march the inliner through
      various steps of a cycle and check that we stop when the cycle is closed
      and that we actually did do inlining to form that cycle.
      
      A lot of thanks go to Eric Christopher and Sanjoy Das for the help
      understanding this issue and improving the test cases.
      
      The biggest "yuck" here is the layering issue -- the CGSCC pass manager
      is providing somewhat magical state to the inliner for it to use to make
      itself converge. This isn't great, but I don't honestly have a lot of
      better ideas yet and at least seems nicely isolated.
      
      I have tested this patch, and it doesn't block *any* inlining on the
      entire LLVM test suite and SPEC, so it seems sufficiently narrowly
      targeted to the issue at hand.
      
      We have come up with hypothetical issues that this patch doesn't cover,
      but so far none of them are practical and we don't have a viable
      solution yet that covers the hypothetical stuff, so proceeding here in
      the interim. Definitely an area that we will be back and revisiting in
      the future.
      
      Differential Revision: https://reviews.llvm.org/D36188
      
      llvm-svn: 309784
      95055d8f
Loading