Cmp peephole optimization isn't always safe for signed arithmetics.
authorEvan Cheng <evan.cheng@apple.com>
Wed, 23 Mar 2011 22:52:04 +0000 (22:52 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Wed, 23 Mar 2011 22:52:04 +0000 (22:52 +0000)
commit2c339156289d8398bea09c2bb4b735d00d39bdb3
treebd93f3a2bae816c2cce86c73d05bbb958c31136a
parentb141099c14bfa86167b2137e8a9544c6ee805955
Cmp peephole optimization isn't always safe for signed arithmetics.

int tries = INT_MAX;
while (tries > 0) {
      tries--;
}

The check should be:
        subs    r4, #1
        cmp     r4, #0
        bgt     LBB0_1

The subs can set the overflow V bit when r4 is INT_MAX+1 (which loop
canonicalization apparently does in this case). cmp #0 would have cleared
it while not changing the N and Z bits. Since BGT is dependent on the V
bit, i.e. (N == V) && !Z, it is not safe to eliminate the cmp #0.

rdar://9172742

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@128179 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/ARM/ARMBaseInstrInfo.cpp
test/CodeGen/ARM/2011-03-23-PeepholeBug.ll [new file with mode: 0644]
test/CodeGen/ARM/long_shift.ll