Reapply [SCEV] Replace IsAvailableOnEntry with block disposition
authorNikita Popov <npopov@redhat.com>
Thu, 27 Apr 2023 13:11:02 +0000 (15:11 +0200)
committerNikita Popov <npopov@redhat.com>
Thu, 25 May 2023 08:02:18 +0000 (10:02 +0200)
commit0c23dc20bcfbe77b42fc3515c41432e4a2f5ce3f
tree21a089501dc09704f6e8ee7143cc4ffc6a43dfbf
parenta2f7352f3e809cb1b267e769d00ea84e4ef46bf0
Reapply [SCEV] Replace IsAvailableOnEntry with block disposition

This exposed an issue in SCEVExpander/LCSSA, which has been fixed
in D150681.

-----

As far as I understand, the IsAvailableOnEntry() function basically
implements the same functionality as the properlyDominates() block
disposition. The primary difference (apart from a weaker
implementation) seems to be in this comment at the top:

    // Checks if the SCEV S is available at BB.  S is considered available at BB
    // if S can be materialized at BB without introducing a fault.

However, I don't really understand why there would be such a
requirement. It's my understanding that SCEV explicitly does not
care about trapping udiv instructions itself, and it's the job of
SCEVExpander's isSafeToExpand() to make sure these don't get
expanded if they may trap.

Differential Revision: https://reviews.llvm.org/D149344
llvm/lib/Analysis/ScalarEvolution.cpp
llvm/test/Analysis/ScalarEvolution/logical-operations.ll