[SCEV] Apply loop guards to divisibility tests
authorGil Rapaport <gil.rapaport@intel.com>
Fri, 11 Dec 2020 08:09:51 +0000 (10:09 +0200)
committerGil Rapaport <gil.rapaport@intel.com>
Tue, 2 Feb 2021 06:09:39 +0000 (08:09 +0200)
commitd475030dc28a85e649cdd3dd4e5941ec82227c26
tree4842bedc7ae9b5085412e09d62ca665ab2c41ee7
parent80f539526eec31f03aadd96753648686312b1ad1
[SCEV] Apply loop guards to divisibility tests

Extend applyLoopGuards() to take into account conditions/assumes proving some
value %v to be divisible by D by rewriting %v to (%v / D) * D. This lets the
loop unroller and the loop vectorizer identify more loops as not requiring
remainder loops.

Differential Revision: https://reviews.llvm.org/D95521
llvm/include/llvm/Analysis/ScalarEvolution.h
llvm/lib/Analysis/ScalarEvolution.cpp
llvm/lib/Transforms/Vectorize/LoopVectorize.cpp
llvm/test/Analysis/ScalarEvolution/trip-multiple-guard-info.ll
llvm/test/Transforms/LoopUnroll/runtime-unroll-assume-no-remainder.ll [new file with mode: 0644]
llvm/test/Transforms/LoopVectorize/dont-fold-tail-for-divisible-TC.ll