Commit Graph

13227 Commits

Author SHA1 Message Date
Johannes Doerfert 9e7dd29d66 [ValueTracking] Look through casts when determining non-nullness
Bitcast and certain Ptr2Int/Int2Ptr instructions will not alter the
value of their operand and can therefore be looked through when we
determine non-nullness.

Differential Revision: https://reviews.llvm.org/D54956

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352293 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-26 23:40:35 +00:00
Nemanja Ivanovic 8c69b6f74f [PowerPC] Update Vector Costs for P9
For the power9 CPU, vector operations consume a pair of execution units rather
than one execution unit like a scalar operation. Update the target transform
cost functions to reflect the higher cost of vector operations when targeting
Power9.

Patch by RolandF.

Differential revision: https://reviews.llvm.org/D55461


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352261 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-26 01:18:48 +00:00
Vedant Kumar 083b7c74a1 [HotColdSplit] Introduce a cost model to control splitting behavior
The main goal of the model is to avoid *increasing* function size, as
that would eradicate any memory locality benefits from splitting. This
happens when:

  - There are too many inputs or outputs to the cold region. Argument
    materialization and reloads of outputs have a cost.

  - The cold region has too many distinct exit blocks, causing a large
    switch to be formed in the caller.

  - The code size cost of the split code is less than the cost of a
    set-up call.

A secondary goal is to prevent excessive overall binary size growth.

With the cost model in place, I experimented to find a splitting
threshold that works well in practice. To make warm & cold code easily
separable for analysis purposes, I moved split functions to a "cold"
section. I experimented with thresholds between [0, 4] and set the
default to the threshold which minimized geomean __text size.

Experiment data from building LNT+externals for X86 (N = 639 programs,
all sizes in bytes):

| Configuration | __text geom size | __cold geom size | TEXT geom size |
| **-Os**       | 1736.3           | 0, n=0           | 10961.6        |
| -Os, thresh=0 | 1740.53          | 124.482, n=134   | 11014          |
| -Os, thresh=1 | 1734.79          | 57.8781, n=90    | 10978.6        |
| -Os, thresh=2 | ** 1733.85 **    | 65.6604, n=61    | 10977.6        |
| -Os, thresh=3 | 1733.85          | 65.3071, n=61    | 10977.6        |
| -Os, thresh=4 | 1735.08          | 67.5156, n=54    | 10965.7        |
| **-Oz**       | 1554.4           | 0, n=0           | 10153          |
| -Oz, thresh=2 | ** 1552.2 **     | 65.633, n=61     | 10176          |
| **-O3**       | 2563.37          | 0, n=0           | 13105.4        |
| -O3, thresh=2 | ** 2559.49 **    | 71.1072, n=61    | 13162.4        |

Picking thresh=2 reduces the geomean __text section size by 0.14% at
-Os, -Oz, and -O3 and causes ~0.2% growth in the TEXT segment. Note that
TEXT size is page-aligned, whereas section sizes are byte-aligned.

Experiment data from building LNT+externals for ARM64 (N = 558 programs,
all sizes in bytes):

| Configuration | __text geom size | __cold geom size | TEXT geom size |
| **-Os**       | 1763.96          | 0, n=0           | 42934.9        |
| -Os, thresh=2 | ** 1760.9 **     | 76.6755, n=61    | 42934.9        |

Picking thresh=2 reduces the geomean __text section size by 0.17% at
-Os and causes no growth in the TEXT segment.

Measurements were done with D57082 (r352080) applied.

Differential Revision: https://reviews.llvm.org/D57125

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352228 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-25 18:30:37 +00:00
Max Kazantsev 1e87413d95 [NFC] One more crashing test on LoopSimplifyCFG
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352194 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-25 11:47:16 +00:00
Max Kazantsev 2f0b27b1ba [NFC] Add failing test on LCSSA forming
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352190 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-25 11:32:21 +00:00
Max Kazantsev 4792786c43 [NFC] Add test with multiple loops
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352176 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-25 08:46:00 +00:00
Max Kazantsev 0e56479684 [LoopSimplifyCFG] Fix inconsistency in blocks in loop markup
2nd part of D57095 with the same reason, just in another place. We never
fold branches that are not immediately in the current loop, but this check
is missing in `IsEdgeLive` As result, it may think that the edge in subloop is
dead while it's live. It's a pessimization in the current stance.

Differential Revision: https://reviews.llvm.org/D57147
Reviewed By: rupprecht	


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352170 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-25 05:05:02 +00:00
Vedant Kumar 7216dfe791 [HotColdSplit] Split more aggressively before/after cold invokes
While a cold invoke itself and its unwind destination can't be
extracted, code which unconditionally executes before/after the invoke
may still be profitable to extract.

With cost model changes from D57125 applied, this gives a 3.5% increase
in split text across LNT+externals on arm64 at -Os.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352160 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-25 03:22:23 +00:00
Eli Friedman ce8f6d38a5 [Analysis] Fix isSafeToLoadUnconditionally handling of volatile.
A volatile operation cannot be used to prove an address points to normal
memory.  (LangRef was recently updated to state it explicitly.)

Differential Revision: https://reviews.llvm.org/D57040



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352109 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-24 21:31:13 +00:00
Alina Sbirlea 1895810dff [MemorySSA +LICM CFHoist] Solve PR40317.
Summary:
MemorySSA needs updating each time an instruction is moved.
LICM and control flow hoisting re-hoists instructions, thus needing another update when re-moving those instructions.
Pending cleanup: the MSSA update is duplicated, should be moved inside moveInstructionBefore.

Reviewers: jnspaulsson

Subscribers: sanjoy, jlebar, Prazek, george.burgess.iv, llvm-commits

Differential Revision: https://reviews.llvm.org/D57176

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352092 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-24 19:48:35 +00:00
Philip Reames ed5c317d76 Test cases for demanded elements on vector GEPs
This is the first part of splitting apart https://reviews.llvm.org/D57140 into usuable pieces.  Landing the tests in advance of posting a review specifically for the demanded elements part.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352091 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-24 19:35:28 +00:00
Philip Reames 92e62a99ee [RS4GC] Expand/standardize tests introduced in rL352059
Write a couple of variations on vector geps w/both scalars and vectors live over safepoints.  Use update_test_checks to show all the IR.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352062 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-24 16:45:23 +00:00
Philip Reames 0332ddd449 [RS4GC] Be slightly less conservative for gep vector_base, scalar_idx
After submitting https://reviews.llvm.org/D57138, I realized it was slightly more conservative than needed. The scalar indices don't appear to be a problem on a vector gep, we even had a test for that.

Differential Revision: https://reviews.llvm.org/D57161



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352061 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-24 16:34:00 +00:00
Philip Reames 7d4d59cf8a [RS4GC] Avoid crashing on gep scalar_base, vector_idx
This is an alternative to https://reviews.llvm.org/D57103.  After discussion, we dedicided to check this in as a temporary workaround, and pursue a true fix under the original thread.

The issue at hand is that the base rewriting algorithm doesn't consider the fact that GEPs can turn a scalar input into a vector of outputs. We had handling for scalar GEPs and fully vector GEPs (i.e. all vector operands), but not the scalar-base + vector-index forms. A true fix here requires treating GEP analogously to extractelement or shufflevector.

This patch is merely a workaround. It simply hides the crash at the cost of some ugly code gen for this presumable very rare pattern.

Differential Revision: https://reviews.llvm.org/D57138



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352059 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-24 16:08:18 +00:00
Simon Pilgrim 2e5edf4b8d [TTI] Add generic UADDSAT/USUBSAT costs
Add generic costs calculation for UADDSAT/USUBSAT intrinsics, this fallbacks to using generic costs for uadd_with_overflow/usub_with_overflow + a select.

Differential Revision: https://reviews.llvm.org/D56907

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352044 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-24 12:27:10 +00:00
Max Kazantsev c7b9bea4d5 [NFC] Add another failing test on LoopSimplifyCFG
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352026 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-24 05:43:19 +00:00
Max Kazantsev 7a48151988 [LoopSimplifyCFG] Fix inconsistency in live blocks markup
When we choose whether or not we should mark block as dead, we have an
inconsistent logic in markup of live blocks.
- We take candidate IF its terminator branches on constant AND it is immediately
  in current loop;
- We mark successor live IF its terminator doesn't branch by constant OR it branches
  by constant and the successor is its always taken block.

What we are missing here is that when the terminator branches on a constant but is
not taken as a candidate because is it not immediately in the current loop, we will
mark only one (always taken) successor as live. Therefore, we do NOT do the actual
folding but may NOT mark one of the successors as live. So the result of markup is
wrong in this case, and we may then hit various asserts.

Thanks Jordan Rupprech for reporting this!

Differential Revision: https://reviews.llvm.org/D57095
Reviewed By: rupprecht


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352024 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-24 05:20:29 +00:00
Max Kazantsev 78cd705671 [NFC] Add a failing test on live block markup in term folding
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352023 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-24 05:05:55 +00:00
David Callahan 26d8013491 Update entry count for cold calls
Summary:
Profile sample files include the number of times each entry or inlined
call site is sampled. This is translated into the entry count metadta
on functions.

When sample data is being read, if a call site that was inlined
in the sample program is considered cold and not inlined, then
the entry count of the out-of-line functions does not reflect
the current compilation.

In this patch, we note call sites where the function was not inlined
and as a last action of the sample profile loading, we update the
called function's entry count to reflect the calls from these
call sites which are not included in the profile file.

Reviewers: danielcdh, wmi, Kader, modocache

Reviewed By: wmi

Subscribers: davidxl, eraman, llvm-commits

Differential Revision: https://reviews.llvm.org/D52845

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352001 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-24 00:55:23 +00:00
Max Kazantsev 83265e9e74 [IRCE] Support narrow latch condition for wide range checks
This patch relaxes restrictions on types of latch condition and range check.
In current implementation, they should match. This patch allows to handle
wide range checks against narrow condition. The motivating example is the
following:

  int N = ...
  for (long i = 0; (int) i < N; i++) {
    if (i >= length) deopt;
  }

In this patch, the option that enables this support is turned off by
default. We'll wait until it is switched to true.

Differential Revision: https://reviews.llvm.org/D56837
Reviewed By: reames


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351926 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-23 07:20:56 +00:00
Matt Arsenault 1f5f9eca96 Codegen support for atomicrmw fadd/fsub
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351851 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-22 18:36:06 +00:00
Matt Arsenault 52f6127659 Reapply "IR: Add fp operations to atomicrmw"
This reapplies commits r351778 and r351782 with
RISCV test fixes.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351850 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-22 18:18:02 +00:00
Max Kazantsev 5b032bb140 [LoopPredication] Support guards expressed as branches by widenable condition
This patch adds support of guards expressed as branches by widenable
conditions in Loop Predication.

Differential Revision: https://reviews.llvm.org/D56081
Reviewed By: reames


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351805 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-22 11:49:06 +00:00
Chandler Carruth 73f9a1d617 Revert r351778: IR: Add fp operations to atomicrmw
This broke the RISCV build, and even with that fixed, one of the RISCV
tests behaves surprisingly differently with asserts than without,
leaving there no clear test pattern to use. Generally it seems bad for
hte IR to differ substantially due to asserts (as in, an alloca is used
with asserts that isn't needed without!) and nothing I did simply would
fix it so I'm reverting back to green.

This also required reverting the RISCV build fix in r351782.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351796 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-22 10:29:58 +00:00
Matt Arsenault 020dc8d94b IR: Add fp operations to atomicrmw
Add just fadd/fsub for now.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351778 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-22 03:32:36 +00:00
Philip Reames 27ae9060d2 [CVP] Use LVI to constant fold deopt operands
Deopt operands are generally intended to record information about a site in code with minimal perturbation of the surrounding code. Idiomatically, they also tend to appear down rare paths. Putting these together, we have an obvious case for extending CVP w/deopt operand constant folding. Arguably, we should be doing this for all operands on all instructions, but that's definitely a much larger and risky change.

Differential Revision: https://reviews.llvm.org/D55678



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351774 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-22 01:34:33 +00:00
Simon Pilgrim 21d100aff8 [CostModel][X86] Add explicit vector select costs
Prior to SSE41 (and sometimes on AVX1), vector select has to be performed as a ((X & C)|(Y & ~C)) bit select.

Exposes a couple of issues with the min/max reduction costs (which only go down to SSE42 for some reason).

The increase pre-SSE41 selection costs also prevent a couple of tests from firing any longer, so I've either tweaked the target or added AVX tests as well to the existing SSE2 tests.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351685 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-20 13:55:01 +00:00
Simon Pilgrim 38ece52d64 [CostModel][X86] Add explicit fcmp costs for pre-SSE42 targets
Typical throughputs: cmpss/cmpps = 1cy and cmpsd/cmppd = 2cy before the Core2 era

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351684 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-20 13:21:43 +00:00
Nikita Popov c333f36cb3 [InstCombine] Simplify cttz/ctlz + icmp ugt/ult
Followup to D55745, this time handling comparisons with ugt and ult
predicates (which are the canonical forms for non-equality predicates).

For ctlz we can convert into a simple icmp, for cttz we can convert
into a mask check.

Differential Revision: https://reviews.llvm.org/D56355

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351645 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-19 09:56:01 +00:00
Johannes Doerfert 3afa698404 Enable IPConstantPropagation to work with abstract call sites
This modification of the currently unused inter-procedural constant
propagation pass (IPConstantPropagation) shows how abstract call sites
enable optimization of callback calls alongside direct and indirect
calls. Through minimal changes, mostly dealing with the partial mapping
of callbacks, inter-procedural constant propagation was enabled for
callbacks, e.g., OpenMP runtime calls or pthreads_create.

Differential Revision: https://reviews.llvm.org/D56447

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351628 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-19 05:19:12 +00:00
Roman Tereshin 23188a224d Reapply "[CGP] Check for existing inttotpr before creating new one"
Original commit: r351582

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351626 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-19 03:37:25 +00:00
Vedant Kumar 341781f38d [MergeFunc] Allow merging identical vararg functions using aliases
Thanks to Nikita Popov for pointing out this missed case.

This is a follow-up to r351411, which disabled function merging for
vararg functions outright due to a miscompile (see llvm.org/PR40345).

Differential Revision: https://reviews.llvm.org/D56865

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351624 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-19 02:46:22 +00:00
Vedant Kumar 3dfba4afc6 [HotColdSplit] Mark inherently cold functions as such
If an inherently cold function is found, mark it as cold. For now this
means applying the `cold` and `minsize` attributes.

As a drive-by, revisit and clean up the criteria for considering a
function for splitting. Add tests.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351623 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-19 02:38:47 +00:00
Vedant Kumar 8175d01f18 [CodeExtractor] Emit lifetime markers around reloads of outputs
CodeExtractor permits extracting a region of blocks from a function even
when values defined within the region are used outside of it.

This is typically done by creating an alloca in the original function
and reloading the alloca after a call to the extracted function.

Wrap the reload in lifetime start/end markers to promote stack coloring.

Suggested by Sergei Kachkov!

Differential Revision: https://reviews.llvm.org/D56045

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351621 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-19 02:37:59 +00:00
Roman Tereshin b63d21f450 Revert "Reapply "[CGP] Check for existing inttotpr before creating new one""
This reverts commit r351618.

Compiler RT + ASAN tests are failing for PowerPC. Not sure
how would I reproduce these on macOS, so reverting (again)
until I do.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351619 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-19 01:53:26 +00:00
Roman Tereshin f10dba2c63 Reapply "[CGP] Check for existing inttotpr before creating new one"
Original commit: r351582

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351618 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-19 01:41:03 +00:00
Roman Tereshin 2149e3fb04 Revert "[CGP] Check for existing inttotpr before creating new one"
This reverts commit r351582.

Bots are failing. Reverting this to fix and re-commit later.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351598 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-18 21:38:44 +00:00
Roman Tereshin 61b2398bad [CGP] Check for existing inttotpr before creating new one
Make sure CodeGenPrepare doesn't emit multiple inttoptr instructions of
the same integer value while sinking address computations, but rather
CSEs them on the fly: excessive inttoptr's confuse SCEV into thinking
that related pointers have nothing to do with each other.

This problem blocks LoadStoreVectorizer from vectorizing some of the
loads / stores in a downstream target.

Reviewed By: hfinkel

Differential Revision: https://reviews.llvm.org/D56838

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351582 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-18 20:13:42 +00:00
Vedant Kumar 7064dbae35 [HotColdSplit] Allow outlining with live outputs
Prior to r348205, extracting code regions with live output values was
disabled because of a miscompilation (PR39433). Lift the restriction as
PR39433 has been addressed.

Tested on LNT+externals, on a run of check-llvm in a stage2 build, and
with a full build of iOS (with hot/cold splitting enabled).

As a drive-by, remove an errant TODO.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351492 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-17 22:36:05 +00:00
Vedant Kumar 390962bc3e [HotColdSplit] Consider resume instructions to be cold
Resuming exception unwinding is roughly as unlikely as throwing an
exception.

Tested on LNT+externals (in particular, the C++ EH regression tests
provide end-to-end test coverage), as well as with a full build of iOS.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351491 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-17 22:35:47 +00:00
Vedant Kumar 93f2e218e0 [HotColdSplit] Relax requirement that the cold sink block be extractable
Relaxing this requirement creates opportunities to split code dominated
by an EH pad.

Tested on LNT+externals.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351483 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-17 21:42:36 +00:00
Vedant Kumar 6c24b6f7e2 [HotColdSplit] Simplify tests by lowering their splitting thresholds
This gets rid of the brittle/mysterious calls to @sink()/@sideeffect()
peppered throughout the test cases. They are no longer needed to force
splitting to occur.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351480 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-17 21:29:34 +00:00
Wei Mi dffaa92302 [SampleFDO] Skip profile reading when flattened profile used in ThinLTO postlink
If the sample profile has no inlining hierachy information included, we call
the sample profile is flattened. For flattened profile, in ThinLTO postlink
phase, SampleProfileLoader's hot function inlining and profile annotation will
do nothing, so it is better to save the effort to read in the profile and run
the sample profile loader pass. It is helpful for reducing compile time when
the flattened profile is huge.

Differential Revision: https://reviews.llvm.org/D54819


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351476 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-17 20:48:34 +00:00
Reid Kleckner dbe36707c0 [InstCombine] Don't sink dynamic allocas
Summary:
InstCombine's sinking algorithm only thinks about memory. It doesn't
think about non-memory constraints like stack object lifetime. It can
sink dynamic allocas across a stacksave call, which may be used with
stackrestore, which can incorrectly reduce the lifetime of the dynamic
alloca.

Fixes PR40365

Reviewers: hfinkel, efriedma

Subscribers: hiraditya, llvm-commits

Differential Revision: https://reviews.llvm.org/D56872

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351475 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-17 20:46:53 +00:00
Max Kazantsev a3ca8ce0e5 [LoopSimplifyCFG] Form LCSSA when a parent loop becomes a sibling
During the transforms in LoopSimplifyCFG, when we remove a dead exiting edge, the
parent loop may stop being reachable from the child loop, and therefore they become
siblings. If the former child loop had uses of some values from its former parent loop,
now such uses will require LCSSA Phis, even if they weren't needed before. So we must
form LCSSA for all loops that stopped being ancestors of the current loop in this case.

Differential Revision: https://reviews.llvm.org/D56144
Reviewed By: fedor.sergeev


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351434 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-17 12:51:10 +00:00
Max Kazantsev 5865df5baa [LoopSimplifyCFG] Fix order of deletion of complex dead subloops
Function `DeleteDeadBlock` requires that all predecessors of a block
being deleted have already been deleted, with the exception of a
single-block loop. When we use it for removal of dead subloops that
contain more than one block, we may not fulfull this requirement and
fail an assertion.

This patch replaces invocation of `DeleteDeadBlock` with a generalized
version `DeleteDeadBlocks` that is able to deal with multiple dead blocks,
even if they contain some cycles.

Differential Revision: https://reviews.llvm.org/D56121
Reviewed By: fedor.sergeev


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351433 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-17 12:25:40 +00:00
Matt Arsenault aba210299a Allow FP types for atomicrmw xchg
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351427 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-17 10:49:01 +00:00
Vedant Kumar f782a152e6 [MergeFunc] Prevent silent miscompile of vararg functions
The function merging pass miscompiles identical vararg functions. The
forwarding thunk it emits doesn't forward the full variable-length list
of arguments. Disable merging for vararg functions for now.

I've filed llvm.org/PR40345 to track the issue.

rdar://47326238

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351411 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-17 02:15:05 +00:00
Vedant Kumar c6f4c7e8bc [FunctionComparator] Consider tail call kinds
Essentially, do not treat `call` and `musttail call` as the same thing.

As a drive-by, fold CallInst and InvokeInst handling together using the
CallSite helper.

Differential Revision: https://reviews.llvm.org/D56815

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351405 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-17 00:29:14 +00:00
Wei Mi 22cdd42712 [PGO] Make pgo related options in opt more consistent.
Currently we have pgo options defined in PassManagerBuilder.cpp only for
instrument pgo, but not for sample pgo. We also have pgo options defined
in NewPMDriver.cpp in opt only for new pass manager and for all kinds of
pgo. They have some inconsistency.

To make the options more consistent and make tests writing easier, the
patch let old pass manager to share the same pgo options with new pass
manager in opt, and removes the options in PassManagerBuilder.cpp.

Differential Revision: https://reviews.llvm.org/D56749


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351392 91177308-0d34-0410-b5e6-96231b3b80d8
2019-01-16 23:19:02 +00:00