Commit Graph

16184 Commits

Author SHA1 Message Date
Sanjay Patel
bb4b1d9adf [InstCombine] use m_APInt to allow icmp X, C folds for splat constant vectors
isSignBitCheck could be changed to take a pointer param to avoid the 'UnusedBit' ugliness.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281231 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-12 16:25:41 +00:00
David Majnemer
5db0b906e8 [FunctionAttrs] Don't try to infer returned if it is already on an argument
Trying to infer the 'returned' attribute if an argument is already
'returned' can lead to verification failure: inference might determine
that a different argument is passed through which would result in two
different arguments marked as 'returned'.

This fixes PR30350.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281221 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-12 16:04:59 +00:00
Sanjay Patel
7e05343232 fix formatting; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281220 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-12 15:52:28 +00:00
Sanjay Patel
29b1dcd7fc [InstCombine] add helper function for foldICmpUsingKnownBits; NFCI
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281217 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-12 15:24:31 +00:00
Sanjay Patel
c04a5a1fc4 fix formatting/typos; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281214 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-12 14:25:46 +00:00
Chad Rosier
0c54a0640f [LoopInterchange] Improve debug output. NFC.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281212 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-12 13:24:47 +00:00
Sanjay Patel
52fed49da9 [InstCombine] add helper function for folding {and,or,xor} (cast X), C ; NFCI
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281187 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-12 00:16:23 +00:00
Duncan P. N. Exon Smith
c2fec44075 ScalarOpts: Use std::list for Candidates, NFC
There is nothing intrusive about the Candidate list; use std::list over
llvm::ilist for simplicity.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281177 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-11 21:29:34 +00:00
Duncan P. N. Exon Smith
6b6d496c5a ScalarOpts: Sort includes, NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281176 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-11 21:04:36 +00:00
James Molloy
05bbcbdafe [SimplifyCFG] Be even more conservative in SinkThenElseCodeToEnd
This should *actually* fix PR30244. This cranks up the workaround for PR30188 so that we never sink loads or stores of allocas.

The idea is that these should be removed by SROA/Mem2Reg, and any movement of them may well confuse SROA or just cause unwanted code churn. It's not ideal that the midend should be crippled like this, but that unwanted churn can really cause significant regressions in important workloads (tsan).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281162 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-11 09:00:03 +00:00
James Molloy
3daf6c830e [SimplifyCFG] Harden up the profitability heuristic for block splitting during sinking
Exposed by PR30244, we will split a block currently if we think we can sink at least one instruction. However this isn't right - the reason we split predecessors is so that we can sink instructions that otherwise couldn't be sunk because it isn't safe to do so - stores, for example.

So, change the heuristic to only split if it thinks it can sink at least one non-speculatable instruction.

Should fix PR30244.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281160 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-11 08:07:30 +00:00
Arnold Schwaighofer
17648b37ae InstCombine: Don't combine loads/stores from swifterror to a new type
This generates invalid IR: the only users of swifterror can be call
arguments, loads, and stores.

rdar://28242257

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281144 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-10 18:14:57 +00:00
Sanjay Patel
e117e50653 [InstCombine] clean up foldICmpBinOpEqualityWithConstant / foldICmpIntrinsicWithConstant ; NFC
1. Rename variables to be consistent with related/preceding code (may want to reorganize).
2. Fix comments/formatting.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281140 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-10 15:33:39 +00:00
Sanjay Patel
792a8eaf8c [InstCombine] rename and reorganize some icmp folding functions; NFC
Everything under foldICmpInstWithConstant() should now be working for
splat vectors via m_APInt matchers. Ie, I've removed all of the FIXMEs
that I added while cleaning that section up. Note that not all of the
associated FIXMEs in the regression tests are gone though, because some
of the tests require earlier folds that are still scalar-only. 


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281139 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-10 15:03:44 +00:00
Vitaly Buka
c4644d2241 [asan] Add flag to allow lifetime analysis of problematic allocas
Summary:
Could be useful for comparison when we suspect that alloca was skipped
because of this.

Reviewers: eugenis

Subscribers: llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281126 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-10 01:06:11 +00:00
Arnold Schwaighofer
8ad92ff220 Inliner: Don't mark swifterror allocas with lifetime markers
This would create a bitcast use which fails the verifier: swifterror values may
only be used by loads, stores, and as function arguments.

rdar://28233244

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281114 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-09 22:40:27 +00:00
Matt Arsenault
7474f828e2 LSV: Fix incorrectly increasing alignment
If the unaligned access has a dynamic offset, it may be odd which
would make the adjusted alignment incorrect to use.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281110 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-09 22:20:14 +00:00
Sanjay Patel
1a60ab87dc [InstCombine] use m_APInt to allow icmp ult X, C folds for splat constant vectors
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281107 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-09 21:59:37 +00:00
Gor Nishanov
6ff9c199ca [Coroutines] Part13: Handle single edge PHINodes across suspends
Summary:
If one of the uses of the value is a single edge PHINode, handle it.

Original:

    %val = something
    <suspend>
    %p = PHINode [%val]

After Spill + Part13:

    %val = something
    %slot = gep val.spill.slot
    store %val, %slot
    <suspend>
    %p = load %slot

Plus tiny fixes/changes:
   * use correct index for coro.free in CoroCleanup
   * fixup id parameter in coro.free to allow authoring coroutine in plain C with __builtins

Reviewers: majnemer

Subscribers: mehdi_amini, llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281020 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-09 05:39:00 +00:00
Dehao Chen
539e8b4532 Remove debug info when hoisting instruction from then/else branch.
Summary: The hoisted instruction is executed speculatively. It could affect the debugging experience as user would see gdb go into code that may not be expected to execute. It will also affect sample profile accuracy by assigning incorrect frequency to source within then/else branch.

Reviewers: davidxl, dblaikie, chandlerc, kcc, echristo

Subscribers: mehdi_amini, probinson, eric_niebler, andreadb, llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280995 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-08 21:53:33 +00:00
Matthew Simpson
97ea58ef28 [LV] Ensure proper handling of multi-use case when collecting uniforms
The test case included in r280979 wasn't checking what it was supposed to be
checking for the predicated store case. Fixing the test revealed that the
multi-use case (when a pointer is used by both vectorized and scalarized memory
accesses) wasn't being handled properly. We can't skip over
non-consecutive-like pointers since they may have looked consecutive-like with
a different memory access.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280992 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-08 21:38:26 +00:00
Matthew Simpson
99a1cd6e48 [LV] Don't mark pointers used by scalarized memory accesses uniform
Previously, all consecutive pointers were marked uniform after vectorization.
However, if a consecutive pointer is used by a memory access that is eventually
scalarized, the pointer won't remain uniform after all. An example is
predicated stores. Even though a predicated store may be consecutive, it will
still be scalarized, making it's pointer operand non-uniform.

This patch updates the logic in collectLoopUniforms to consider the cases where
a memory access may be scalarized. If a memory access may be scalarized, its
pointer operand is not marked uniform. The determination of whether a given
memory instruction will be scalarized or not has been moved into a common
function that is used by the vectorizer, cost model, and legality analysis.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280979 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-08 19:11:07 +00:00
Balaram Makam
b91e524cc6 [LoopDataPrefetch] Use range based for loop; NFCI
Switch to range based for loop.
No functional change, but more readable code.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280966 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-08 17:08:20 +00:00
Sanjay Patel
e0563b1a6c [InstCombine] return a vector-safe true/false constant
I introduced this potential bug by missing this diff in:
https://reviews.llvm.org/rL280873

...however, I'm not sure how to reach this code path with a regression test.
We may be able to remove this code and assume that the transform to a constant
is always handled by InstSimplify?



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280964 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-08 16:54:02 +00:00
Dehao Chen
035ff49cd1 revert r280427
Refactor replaceDominatedUsesWith to have a flag to control whether to replace uses in BB itself.

Summary: This is in preparation for LoopSink pass which calls replaceDominatedUsesWith to update after sinking.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280949 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-08 15:25:12 +00:00
Vitaly Buka
52bc7ab5ec [asan] Avoid lifetime analysis for allocas with can be in ambiguous state
Summary:
C allows to jump over variables declaration so lifetime.start can be
avoid before variable usage. To avoid false-positives on such rare cases
we detect them and remove from lifetime analysis.

PR27453
PR28267

Reviewers: eugenis

Subscribers: llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280907 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-08 06:27:58 +00:00
Michael Zolotukhin
e53b49a9ff Revert "[LoopUnroll] Properly update loop-info when cloning prologues and epilogues."
This reverts commit r280901.

This caused a bunch of failures, reverting it until I investigate them.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280905 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-08 03:51:30 +00:00
Michael Zolotukhin
d9fa49074a [LoopUnroll] Properly update loop-info when cloning prologues and epilogues.
Summary:
When cloning blocks for prologue/epilogue we need to replicate the loop
structure from the original loop. It wasn't a problem for the innermost
loops, but it led to an incorrect loop info when we unrolled a loop with
a child loop - in this case created prologue-loop had a child loop, but
loop info didn't reflect that.

This fixes PR28888.

Reviewers: chandlerc, sanjoy, hfinkel

Subscribers: llvm-commits, silvas

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280901 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-08 01:52:26 +00:00
Peter Collingbourne
1c13d2b2d2 IR: Remove Value::intersectOptionalDataWith, replace all calls with calls to Instruction::andIRFlags.
The two functions are functionally equivalent.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280884 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-07 23:39:04 +00:00
Vitaly Buka
f555e2686a Revert "[asan] Avoid lifetime analysis for allocas with can be in ambiguous state"
Fails on Windows.

This reverts commit r280880.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280883 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-07 23:37:15 +00:00
Vitaly Buka
f8002f1611 [asan] Avoid lifetime analysis for allocas with can be in ambiguous state
Summary:
C allows to jump over variables declaration so lifetime.start can be
avoid before variable usage. To avoid false-positives on such rare cases
we detect them and remove from lifetime analysis.

PR27453
PR28267

Reviewers: eugenis

Subscribers: llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280880 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-07 23:18:23 +00:00
Sanjay Patel
774d87e2ea [InstCombine] use m_APInt to allow icmp (and (sh X, Y), C2), C1 folds for splat constant vectors
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280873 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-07 22:33:03 +00:00
Hal Finkel
9e7800b23b [SimplifyCFG] Don't try to create metadata-valued PHIs
We can't create metadata-valued PHIs; don't try to do so when sinking.

I created a test case for this using the @llvm.type.test intrinsic, because it
takes a metadata parameter and does not have severe side effects (thus
SimplifyCFG is willing to otherwise sink it).

Previously, running the test case would crash with:

  Invalid use of metadata!
    %.sink = select i1 %flag, metadata <...>, metadata <0x4e45dc0>
  LLVM ERROR: Broken function found, compilation aborted!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280866 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-07 21:38:22 +00:00
Haicheng Wu
16d3f8855e [LoopUnroll] Correct a debug message. NFC.
Differential Revision: https://reviews.llvm.org/D24299

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280865 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-07 21:30:16 +00:00
Sanjay Patel
350a7a4120 [InstCombine] allow icmp (and X, C2), C1 folds for splat constant vectors
This is a revert of r280676 which was a revert of r280637;
ie, this is r280637 again. It was speculatively reverted to
help debug buildbot failures.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280861 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-07 20:50:44 +00:00
Chad Rosier
371bac0453 Typo. NFC.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280834 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-07 18:15:12 +00:00
Chad Rosier
452b6b26eb [LoopInterchange] Improve debug output. NFC.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280820 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-07 16:07:17 +00:00
Chad Rosier
e760d89ddf [LoopInterchange] Improve debug output. NFC.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280819 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-07 15:56:59 +00:00
Justin Lebar
600740bf18 [LSV] Use the original loads' names for the extractelement instructions.
Summary:
LSV replaces multiple adjacent loads with one vectorized load and a
bunch of extractelement instructions.  This patch makes the
extractelement instructions' names match those of the original loads,
for (hopefully) improved readability.

Reviewers: asbirlea, tstellarAMD

Subscribers: arsenm, mzolotukhin

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280818 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-07 15:49:48 +00:00
Andrea Di Biagio
2fdf2bfd1f [InstCombine][SSE4a] Fix assertion failure in the insertq/insertqi combining logic.
This fixes a similar issue to the one already fixed by r280804
(revieved in D24256). Revision 280804 fixed the problem with unsafe dyn_casts
in the extrq/extrqi combining logic. However, it turns out that even the
insertq/insertqi logic was affected by the same problem.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280807 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-07 12:47:53 +00:00
Andrea Di Biagio
fd11478c26 [InstCombine][SSE4a] Fix assertion failure caused by unsafe dyn_casts on the operands of extrq/extrqi intrinsic calls.
This patch fixes an assertion failure caused by unsafe dynamic casts on the
constant operands of sse4a intrinsic calls to extrq/extrqi

The combine logic that simplifies sse4a extrq/extrqi intrinsic calls currently
checks if the input operands are constants. Internally, that logic relies on
dyn_casts of values returned by calls to method Constant::getAggregateElement.
However, method getAggregateElemet may return nullptr if the constant element
cannot be retrieved. So, all the dyn_casts can potentially fail. This is what
happens for example if a constexpr value is passed in input to an extrq/extrqi
intrinsic call.

This patch fixes the problem by using a dyn_cast_or_null (instead of a simple
dyn_cast) on the result of each call to Constant::getAggregateElement.

Added reproducible test cases to x86-sse4a.ll.

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


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280804 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-07 12:03:03 +00:00
Renato Golin
17c896a4b9 Revert "[EfficiencySanitizer] Adds shadow memory parameters for 40-bit virtual memory address."
This reverts commit r280796, as it broke the AArch64 bots for no reason.

The tests were passing and we should try to keep them passing, so a proper
review should make that happen.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280802 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-07 10:54:42 +00:00
Sagar Thakur
51cc6bb2bb [EfficiencySanitizer] Adds shadow memory parameters for 40-bit virtual memory address.
Adding 40-bit shadow memory parameters because MIPS64 uses 40-bit virtual memory addresses.

Reviewed by bruening
Differential: D23801


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280796 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-07 09:45:37 +00:00
James Molloy
e50466a8d1 [SimplifyCFG] Followup fix to r280790
In failure cases it's not guaranteed that the PHI we're inspecting is actually in the successor block! In this case we need to bail out early, and never query getIncomingValueForBlock() as that will cause an assert.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280794 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-07 09:01:22 +00:00
James Molloy
80fedcb5bf [SimplifyCFG] Update workaround for PR30188 to also include loads
I should have realised this the first time around, but if we're avoiding sinking stores where the operands come from allocas so they don't create selects, we also have to do the same for loads because SROA will be just as defective looking at loads of selected addresses as stores.

Fixes PR30188 (again).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280792 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-07 08:40:20 +00:00
James Molloy
40fa86fff8 [SimplifyCFG] Check PHI uses more accurately
PR30292 showed a case where our PHI checking wasn't correct. We were checking that all values were used by the same PHI before deciding to sink, but we weren't checking that the incoming values for that PHI were what we expected. As a result, we had to bail out after block splitting which caused us to never reach a steady state in SimplifyCFG.

Fixes PR30292.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280790 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-07 08:15:54 +00:00
Nick Lewycky
36a0b39fae Fix typo in comment, NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280774 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-07 01:49:41 +00:00
Dehao Chen
543123173c Explicitly require DominatorTreeAnalysis pass for instsimplify pass.
Summary: DominatorTreeAnalysis is always required by instsimplify.

Reviewers: danielcdh, davidxl

Subscribers: llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280760 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-06 22:17:16 +00:00
Sanjay Patel
99f377bc53 fix formatting; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280727 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-06 18:16:31 +00:00
Adam Nemet
6050b768b6 [JumpThreading] Only write back branch-weight MDs for blocks that originally had PGO info
Currently the pass updates branch weights in the IR if the function has
any PGO info (entry frequency is set).  However we could still have
regions of the CFG that does not have branch weights collected (e.g. a
cold region).  In this case we'd use static estimates.  Since static
estimates for branches are determined independently, they are
inconsistent.  Updating them can "randomly" inflate block frequencies.

I've run into this in a completely cold loop of h264ref from
SPEC.  -Rpass-with-hotness showed the loop to be completely cold during
inlining (before JT) but completely hot during vectorization (after JT).

The new testcase demonstrate the problem.  We check array elements
against 1, 2 and 3 in a loop.  The check against 3 is the loop-exiting
check.  The block names should be self-explanatory.

In this example, jump threading incorrectly updates the weight of the
loop-exiting branch to 0, drastically inflating the frequency of the
loop (in the range of billions).

There is no run-time profile info for edges inside the loop, so branch
probabilities are estimated.  These are the resulting branch and block
frequencies for the loop body:

                check_1 (16)
            (8) /  |
            eq_1   | (8)
                \  |
                check_2 (16)
            (8) /  |
            eq_2   | (8)
                \  |
                check_3 (16)
            (1) /  |
       (loop exit) | (15)
                   |
              (back edge)

First we thread eq_1 -> check_2 to check_3.  Frequencies are updated to
remove the frequency of eq_1 from check_2 and then from the false edge
leaving check_2.  Changed frequencies are highlighted with * *:

                check_1 (16)
            (8) /  |
           eq_1~   | (8)
           /       |
          /     check_2 (*8*)
         /  (8) /  |
         \  eq_2   | (*0*)
          \     \  |
           ` --- check_3 (16)
            (1) /  |
       (loop exit) | (15)
                   |
              (back edge)

Next we thread eq_1 -> check_3 and eq_2 -> check_3 to check_1 as new
back edges.  Frequencies are updated to remove the frequency of eq_1 and
eq_3 from check_3 and then the false edge leaving check_3 (changed
frequencies are highlighted with * *):

                  check_1 (16)
              (8) /  |
             eq_1~   | (8)
             /       |
            /     check_2 (*8*)
           /  (8) /  |
          /-- eq_2~  | (*0*)
  (back edge)        |
                  check_3 (*0*)
            (*0*) /  |
         (loop exit) | (*0*)
                     |
                (back edge)

As a result, the loop exit edge ends up with 0 frequency which in turn makes
the loop header to have maximum frequency.

There are a few potential problems here:

1. The profile data seems odd.  There is a single profile sample of the
loop being entered.  On the other hand, there are no weights inside the
loop.

2. Based on static estimation we shouldn't set edges to "extreme"
values, i.e. extremely likely or unlikely.

3. We shouldn't create profile metadata that is calculated from static
estimation.  I am not sure what policy is but it seems to make sense to
treat profile metadata as something that is known to originate from
profiling.  Estimated probabilities should only be reflected in BPI/BFI.

Any one of these would probably fix the immediate problem.  I went for 3
because I think it's a good policy to have and added a FIXME about 2.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280713 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-06 16:08:33 +00:00