forked from OSchip/llvm-project
02320eee6b
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 |
||
---|---|---|
.. | ||
add-metadata-pre-post-loops.ll | ||
bad-loop-structure.ll | ||
bad_expander.ll | ||
bug-loop-varying-upper-limit.ll | ||
bug-mismatched-types.ll | ||
clamp.ll | ||
conjunctive-checks.ll | ||
correct-loop-info.ll | ||
decrementing-loop.ll | ||
empty_ranges.ll | ||
eq_ne.ll | ||
low-becount.ll | ||
multiple-access-no-preloop.ll | ||
non_known_positive_end.ll | ||
not-likely-taken.ll | ||
only-lower-check.ll | ||
only-upper-check.ll | ||
optimistic_scev.ll | ||
pre_post_loops.ll | ||
range_intersect_miscompile.ll | ||
ranges_of_different_types.ll | ||
rc-negative-bound.ll | ||
single-access-no-preloop.ll | ||
single-access-with-preloop.ll | ||
skip-profitability-checks.ll | ||
stride_more_than_1.ll | ||
unhandled.ll | ||
unsigned_comparisons_ugt.ll | ||
unsigned_comparisons_ult.ll | ||
variable-loop-bounds.ll | ||
with-parent-loops.ll |