Revert "[SCEV][NFC] Check NoWrap flags before lexicographical comparison of SCEVs"
authorRoman Tereshin <rtereshin@apple.com>
Mon, 27 Aug 2018 21:41:37 +0000 (21:41 +0000)
committerRoman Tereshin <rtereshin@apple.com>
Mon, 27 Aug 2018 21:41:37 +0000 (21:41 +0000)
commit02320eee6bd056c04655edd5cb83940662cc3237
treea3975989aae5f0b942070f6e0478f9b35a6b23da
parent4e039d64e26e242674a5fe324d3be11cfe56c096
Revert "[SCEV][NFC] Check NoWrap flags before lexicographical comparison of SCEVs"

This reverts r319889.

Unfortunately, wrapping flags are not a part of SCEV's identity (they
do not participate in computing a hash value or in equality
comparisons) and in fact they could be assigned after the fact w/o
rebuilding a SCEV.

Grep for const_cast's to see quite a few of examples, apparently all
for AddRec's at the moment.

So, if 2 expressions get built in 2 slightly different ways: one with
flags set in the beginning, the other with the flags attached later
on, we may end up with 2 expressions which are exactly the same but
have their operands swapped in one of the commutative N-ary
expressions, and at least one of them will have "sorted by complexity"
invariant broken.

2 identical SCEV's won't compare equal by pointer comparison as they
are supposed to.

A real-world reproducer is added as a regression test: the issue
described causes 2 identical SCEV expressions to have different order
of operands and therefore compare not equal, which in its turn
prevents LoadStoreVectorizer from vectorizing a pair of consecutive
loads.

On a larger example (the source of the test attached, which is a
bugpoint) I have seen even weirder behavior: adding a constant to an
existing SCEV changes the order of the existing terms, for instance,
getAddExpr(1, ((A * B) + (C * D))) returns (1 + (C * D) + (A * B)).

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

llvm-svn: 340777
llvm/lib/Analysis/ScalarEvolution.cpp
llvm/test/Transforms/IRCE/conjunctive-checks.ll
llvm/test/Transforms/IRCE/single-access-no-preloop.ll
llvm/test/Transforms/LoadStoreVectorizer/X86/compare-scev-by-complexity.ll [new file with mode: 0644]
llvm/test/Transforms/LoopVectorize/X86/pr35432.ll