svn commit: r349954 - in stable: 11/contrib/llvm/include/llvm/Analysis 11/contrib/llvm/lib/Analysis 11/contrib/llvm/lib/Transforms/Scalar 12/contrib/llvm/include/llvm/Analysis 12/contrib/llvm/lib/A...

2019-07-12 Thread Dimitry Andric
Author: dim
Date: Fri Jul 12 19:43:59 2019
New Revision: 349954
URL: https://svnweb.freebsd.org/changeset/base/349954

Log:
  MFC r349583:
  
  Pull in r360968 from upstream llvm trunk (by Philip Reames):
  
Clarify comments on helpers used by LFTR [NFC]
  
I'm slowly wrapping my head around this code, and am making comment
improvements where I can.
  
  Pull in r360972 from upstream llvm trunk (by Philip Reames):
  
[LFTR] Factor out a helper function for readability purpose [NFC]
  
  Pull in r360976 from upstream llvm trunk (by Philip Reames):
  
[IndVars] Don't reimplement Loop::isLoopInvariant [NFC]
  
Using dominance vs a set membership check is indistinguishable from a
compile time perspective, and the two queries return equivelent
results.  Simplify code by using the existing function.
  
  Pull in r360978 from upstream llvm trunk (by Philip Reames):
  
[LFTR] Strengthen assertions in genLoopLimit [NFCI]
  
  Pull in r362292 from upstream llvm trunk (by Nikita Popov):
  
[IndVarSimplify] Fixup nowrap flags during LFTR (PR31181)
  
Fix for https://bugs.llvm.org/show_bug.cgi?id=31181 and partial fix
for LFTR poison handling issues in general.
  
When LFTR moves a condition from pre-inc to post-inc, it may now
depend on value that is poison due to nowrap flags. To avoid this, we
clear any nowrap flag that SCEV cannot prove for the post-inc addrec.
  
Additionally, LFTR may switch to a different IV that is dynamically
dead and as such may be arbitrarily poison. This patch will correct
nowrap flags in some but not all cases where this happens. This is
related to the adoption of IR nowrap flags for the pre-inc addrec.
(See some of the switch_to_different_iv tests, where flags are not
dropped or insufficiently dropped.)
  
Finally, there are likely similar issues with the handling of GEP
inbounds, but we don't have a test case for this yet.
  
Differential Revision: https://reviews.llvm.org/D60935
  
  Pull in r362971 from upstream llvm trunk (by Philip Reames):
  
Prepare for multi-exit LFTR [NFC]
  
This change does the plumbing to wire an ExitingBB parameter through
the LFTR implementation, and reorganizes the code to work in terms of
a set of individual loop exits. Most of it is fairly obvious, but
there's one key complexity which makes it worthy of consideration.
The actual multi-exit LFTR patch is in D62625 for context.
  
Specifically, it turns out the existing code uses the backedge taken
count from before a IV is widened. Oddly, we can end up with a
different (more expensive, but semantically equivelent) BE count for
the loop when requerying after widening.  For the nestedIV example
from elim-extend, we end up with the following BE counts:
BEFORE: (-2 + (-1 * %innercount) + %limit)
AFTER: (-1 + (sext i32 (-1 + %limit) to i64) + (-1 * (sext i32 %innercount 
to i64)))
  
This is the only test in tree which seems sensitive to this
difference. The actual result of using the wider BETC on this example
is that we actually produce slightly better code. :)
  
In review, we decided to accept that test change.  This patch is
structured to preserve the old behavior, but a separate change will
immediate follow with the behavior change.  (I wanted it separate for
problem attribution purposes.)
  
Differential Revision: https://reviews.llvm.org/D62880
  
  Pull in r362975 from upstream llvm trunk (by Philip Reames):
  
[LFTR] Use recomputed BE count
  
This was discussed as part of D62880.  The basic thought is that
computing BE taken count after widening should produce (on average)
an equally good backedge taken count as the one before widening.
Since there's only one test in the suite which is impacted by this
change, and it's essentially equivelent codegen, that seems to be a
reasonable assertion.  This change was separated from r362971 so that
if this turns out to be problematic, the triggering piece is obvious
and easily revertable.
  
For the nestedIV example from elim-extend.ll, we end up with the
following BE counts:
BEFORE: (-2 + (-1 * %innercount) + %limit)
AFTER: (-1 + (sext i32 (-1 + %limit) to i64) + (-1 * (sext i32 %innercount 
to i64)))
  
Note that before is an i32 type, and the after is an i64.  Truncating
the i64 produces the i32.
  
  Pull in r362980 from upstream llvm trunk (by Philip Reames):
  
Factor out a helper function for readability and reuse in a future
patch [NFC]
  
  Pull in r363613 from upstream llvm trunk (by Philip Reames):
  
Fix a bug w/inbounds invalidation in LFTR (recommit)
  
Recommit r363289 with a bug fix for crash identified in pr42279.
Issue was that a loop exit test does not have to be an icmp, leading
to a null dereference crash when new logic was exercised for that
case.  Test case previously committ

svn commit: r349954 - in stable: 11/contrib/llvm/include/llvm/Analysis 11/contrib/llvm/lib/Analysis 11/contrib/llvm/lib/Transforms/Scalar 12/contrib/llvm/include/llvm/Analysis 12/contrib/llvm/lib/A...

2019-07-12 Thread Dimitry Andric
Author: dim
Date: Fri Jul 12 19:43:59 2019
New Revision: 349954
URL: https://svnweb.freebsd.org/changeset/base/349954

Log:
  MFC r349583:
  
  Pull in r360968 from upstream llvm trunk (by Philip Reames):
  
Clarify comments on helpers used by LFTR [NFC]
  
I'm slowly wrapping my head around this code, and am making comment
improvements where I can.
  
  Pull in r360972 from upstream llvm trunk (by Philip Reames):
  
[LFTR] Factor out a helper function for readability purpose [NFC]
  
  Pull in r360976 from upstream llvm trunk (by Philip Reames):
  
[IndVars] Don't reimplement Loop::isLoopInvariant [NFC]
  
Using dominance vs a set membership check is indistinguishable from a
compile time perspective, and the two queries return equivelent
results.  Simplify code by using the existing function.
  
  Pull in r360978 from upstream llvm trunk (by Philip Reames):
  
[LFTR] Strengthen assertions in genLoopLimit [NFCI]
  
  Pull in r362292 from upstream llvm trunk (by Nikita Popov):
  
[IndVarSimplify] Fixup nowrap flags during LFTR (PR31181)
  
Fix for https://bugs.llvm.org/show_bug.cgi?id=31181 and partial fix
for LFTR poison handling issues in general.
  
When LFTR moves a condition from pre-inc to post-inc, it may now
depend on value that is poison due to nowrap flags. To avoid this, we
clear any nowrap flag that SCEV cannot prove for the post-inc addrec.
  
Additionally, LFTR may switch to a different IV that is dynamically
dead and as such may be arbitrarily poison. This patch will correct
nowrap flags in some but not all cases where this happens. This is
related to the adoption of IR nowrap flags for the pre-inc addrec.
(See some of the switch_to_different_iv tests, where flags are not
dropped or insufficiently dropped.)
  
Finally, there are likely similar issues with the handling of GEP
inbounds, but we don't have a test case for this yet.
  
Differential Revision: https://reviews.llvm.org/D60935
  
  Pull in r362971 from upstream llvm trunk (by Philip Reames):
  
Prepare for multi-exit LFTR [NFC]
  
This change does the plumbing to wire an ExitingBB parameter through
the LFTR implementation, and reorganizes the code to work in terms of
a set of individual loop exits. Most of it is fairly obvious, but
there's one key complexity which makes it worthy of consideration.
The actual multi-exit LFTR patch is in D62625 for context.
  
Specifically, it turns out the existing code uses the backedge taken
count from before a IV is widened. Oddly, we can end up with a
different (more expensive, but semantically equivelent) BE count for
the loop when requerying after widening.  For the nestedIV example
from elim-extend, we end up with the following BE counts:
BEFORE: (-2 + (-1 * %innercount) + %limit)
AFTER: (-1 + (sext i32 (-1 + %limit) to i64) + (-1 * (sext i32 %innercount 
to i64)))
  
This is the only test in tree which seems sensitive to this
difference. The actual result of using the wider BETC on this example
is that we actually produce slightly better code. :)
  
In review, we decided to accept that test change.  This patch is
structured to preserve the old behavior, but a separate change will
immediate follow with the behavior change.  (I wanted it separate for
problem attribution purposes.)
  
Differential Revision: https://reviews.llvm.org/D62880
  
  Pull in r362975 from upstream llvm trunk (by Philip Reames):
  
[LFTR] Use recomputed BE count
  
This was discussed as part of D62880.  The basic thought is that
computing BE taken count after widening should produce (on average)
an equally good backedge taken count as the one before widening.
Since there's only one test in the suite which is impacted by this
change, and it's essentially equivelent codegen, that seems to be a
reasonable assertion.  This change was separated from r362971 so that
if this turns out to be problematic, the triggering piece is obvious
and easily revertable.
  
For the nestedIV example from elim-extend.ll, we end up with the
following BE counts:
BEFORE: (-2 + (-1 * %innercount) + %limit)
AFTER: (-1 + (sext i32 (-1 + %limit) to i64) + (-1 * (sext i32 %innercount 
to i64)))
  
Note that before is an i32 type, and the after is an i64.  Truncating
the i64 produces the i32.
  
  Pull in r362980 from upstream llvm trunk (by Philip Reames):
  
Factor out a helper function for readability and reuse in a future
patch [NFC]
  
  Pull in r363613 from upstream llvm trunk (by Philip Reames):
  
Fix a bug w/inbounds invalidation in LFTR (recommit)
  
Recommit r363289 with a bug fix for crash identified in pr42279.
Issue was that a loop exit test does not have to be an icmp, leading
to a null dereference crash when new logic was exercised for that
case.  Test case previously committ