Pull in r276136 from upstream llvm trunk (by Wei Mi):
authordim <dim@FreeBSD.org>
Wed, 25 Jan 2017 17:59:22 +0000 (17:59 +0000)
committerdim <dim@FreeBSD.org>
Wed, 25 Jan 2017 17:59:22 +0000 (17:59 +0000)
commita4247af222993b74d73e8036f369a9e9e0485990
treed049d58b19ac7e20f803e1136c18dcdd9ef1afcd
parent9ce2f865dd4e30ac5062687d45218ac2e6819b39
Pull in r276136 from upstream llvm trunk (by Wei Mi):

  Use ValueOffsetPair to enhance value reuse during SCEV expansion.

  In D12090, the ExprValueMap was added to reuse existing value during
  SCEV expansion. However, const folding and sext/zext distribution can
  make the reuse still difficult.

  A simplified case is: suppose we know S1 expands to V1 in
  ExprValueMap, and
    S1 = S2 + C_a
    S3 = S2 + C_b
  where C_a and C_b are different SCEVConstants. Then we'd like to
  expand S3 as V1 - C_a + C_b instead of expanding S2 literally. It is
  helpful when S2 is a complex SCEV expr and S2 has no entry in
  ExprValueMap, which is usually caused by the fact that S3 is
  generated from S1 after const folding.

  In order to do that, we represent ExprValueMap as a mapping from SCEV
  to ValueOffsetPair. We will save both S1->{V1, 0} and S2->{V1, C_a}
  into the ExprValueMap when we create SCEV for V1. When S3 is
  expanded, it will first expand S2 to V1 - C_a because of S2->{V1,
  C_a} in the map, then expand S3 to V1 - C_a + C_b.

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

This should fix assertion failures when building OpenCV >= 3.1.

PR: 215649
MFC after: 3 days
contrib/llvm/include/llvm/Analysis/ScalarEvolution.h
contrib/llvm/include/llvm/Analysis/ScalarEvolutionExpander.h
contrib/llvm/lib/Analysis/ScalarEvolution.cpp
contrib/llvm/lib/Analysis/ScalarEvolutionExpander.cpp