OSDN Git Service

Make ScalarEvolution::isKnownPredicate a little smarter
authorHal Finkel <hfinkel@anl.gov>
Wed, 19 Aug 2015 01:51:51 +0000 (01:51 +0000)
committerHal Finkel <hfinkel@anl.gov>
Wed, 19 Aug 2015 01:51:51 +0000 (01:51 +0000)
commit25fa0d406c5d953c4361baaf8290de40ce82513e
tree8eea32a475c586b191257db8d2ff2dfed2cf3830
parentb5d75790a5377f7a199f263d9b287c10d306c2ad
Make ScalarEvolution::isKnownPredicate a little smarter

Here we make ScalarEvolution::isKnownPredicate, indirectly, a little smarter.
Given some relational comparison operator OP, and two AddRec SCEVs, {I,+,S} OP
{J,+,T}, we can reduce this to the comparison I OP J when S == T, both AddRecs
are for the same loop, and both are known not to wrap.

As it turns out, because of the way that backedge-guard expressions can be
leveraged when computing known predicates, this allows indvars to simplify the
if-statement comparison in this loop:

  void foo (int *a, int *b, int n) {
    for (int i = 0; i < n; ++i) {
      if (i > n)
        a[i] = b[i] + 1;
    }
  }

which, somewhat surprisingly, we were not previously optimizing away.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@245400 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Analysis/ScalarEvolution.cpp
test/Transforms/IndVarSimplify/bec-cmp.ll [new file with mode: 0644]