[all-commits] [llvm/llvm-project] 509fa8: [SCEV] recognize logical and/or pattern
Juneyoung Lee via All-commits
all-commits at lists.llvm.org
Thu Dec 31 11:38:19 PST 2020
Branch: refs/heads/main
Home: https://github.com/llvm/llvm-project
Commit: 509fa8e02e25a610574c0fc2cceea1d350c35a66
https://github.com/llvm/llvm-project/commit/509fa8e02e25a610574c0fc2cceea1d350c35a66
Author: Juneyoung Lee <aqjune at gmail.com>
Date: 2021-01-01 (Fri, 01 Jan 2021)
Changed paths:
M llvm/include/llvm/Analysis/ScalarEvolution.h
M llvm/lib/Analysis/ScalarEvolution.cpp
A llvm/test/Analysis/ScalarEvolution/exit-count-select.ll
A llvm/test/Analysis/ScalarEvolution/trip-count-andor-selectform.ll
Log Message:
-----------
[SCEV] recognize logical and/or pattern
This patch makes SCEV recognize 'select A, B, false' and 'select A, true, B'.
This is a performance improvement that will be helpful after unsound select -> and/or transformation is removed, as discussed in D93065.
SCEV's answers for the select form should be a bit more conservative than the equivalent `and A, B` / `or A, B`.
Take this example: https://alive2.llvm.org/ce/z/NsP9ue .
To check whether it is valid for SCEV's computeExitLimit to return min(n, m) as ExactNotTaken value, I put llvm.assume at tgt.
It fails because the exit limit becomes poison if n is zero and m is poison. This is problematic if e.g. the exit value of i is replaced with min(n, m).
If either n or m is constant, we can revive the analysis again. I added relevant tests and put alive2 links there.
If and is used instead, this is okay: https://alive2.llvm.org/ce/z/K9rbJk . Hence the existing analysis is sound.
Reviewed By: nikic
Differential Revision: https://reviews.llvm.org/D93882
More information about the All-commits
mailing list