[PATCH] D144947: [SCEV] Preserve divisibility and min/max information in applyLoopGuards

Alon Kom via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 28 02:08:43 PST 2023


alonkom created this revision.
Herald added subscribers: javed.absar, hiraditya.
Herald added a project: All.
alonkom requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

applyLoopGuards doesn't always preserve information when there are multiple assumes.
This patch tries to deal with multiple assumes regarding a SCEV's divisibility and min/max values, and rewrite it into a SCEV that still preserves all of the information.
For example, let the trip count of the loop be TC. Consider the 3 following assumes:

1. __builtin_assume(TC % 8 == 0);
2. __builtin_assume(TC > 0);
3. __builtin_assume(TC < 100);

Before this patch, depending on the assume processing order applyLoopGuards could create the following SCEV:
max(min((8 * (TC / 8)) , 99), 1)

Looking at this SCEV, it doesn't preserve the divisibility by 8 information.

After this patch, depending on the assume processing order applyLoopGuards could create the following SCEV:
max(min((8 * (TC / 8)) , 96), 8)

By aligning up 1 to 8, and aligning down 99 to 96, the new SCEV still preserves all of the original assumes.


https://reviews.llvm.org/D144947

Files:
  llvm/lib/Analysis/ScalarEvolution.cpp
  llvm/test/Analysis/ScalarEvolution/trip-multiple-guard-info.ll
  llvm/unittests/Analysis/ScalarEvolutionTest.cpp

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D144947.501055.patch
Type: text/x-patch
Size: 16007 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230228/8b80b39b/attachment.bin>


More information about the llvm-commits mailing list