[InstructionSimplify] icmp (X+Y), (X+Z) simplification
authorSjoerd Meijer <sjoerd.meijer@arm.com>
Wed, 21 Oct 2020 10:06:10 +0000 (11:06 +0100)
committerSjoerd Meijer <sjoerd.meijer@arm.com>
Thu, 22 Oct 2020 07:55:52 +0000 (08:55 +0100)
commit51d7df3fa1c3ebd65f72c021074b7aeb43dac8c3
treeb45f4f9e540fd3852cb10ed07d4c5234ed5e6785
parentb0c12474ed16738faee42af6f727806517fb8b83
[InstructionSimplify] icmp (X+Y), (X+Z) simplification

This improves simplifications for pattern `icmp (X+Y), (X+Z)` -> `icmp Y,Z`
if only one of the operands has NSW set, e.g.:

    icmp slt (x + 0), (x +nsw 1)

We can still safely rewrite this to:

    icmp slt 0, 1

because we know that the LHS can't overflow if the RHS has NSW set and
C1 < C2 && C1 >= 0, or C2 < C1 && C1 <= 0

This simplification is useful because ScalarEvolutionExpander which is used to
generate code for SCEVs in different loop optimisers is not always able to put
back NSW flags across control-flow, thus inhibiting CFG simplifications.

Differential Revision: https://reviews.llvm.org/D89317
llvm/lib/Analysis/InstructionSimplify.cpp
llvm/test/Transforms/InstSimplify/compare.ll