GVN: merge overflow intrinsics with non-overflow instructions.
authorErik Verbruggen <erikjv@me.com>
Tue, 11 Mar 2014 09:36:48 +0000 (09:36 +0000)
committerErik Verbruggen <erikjv@me.com>
Tue, 11 Mar 2014 09:36:48 +0000 (09:36 +0000)
commitcf5240642bdf8c042ff03ff451970191ceed2289
tree8a9550c8c1df080cc0ffc094f6da04e5722d2891
parentd4b9957d1fc9d9b07cd4cfd16ff2ea097ad41bdc
GVN: merge overflow intrinsics with non-overflow instructions.

When an overflow intrinsic is followed by a non-overflow instruction,
replace the latter with an extract. For example:

  %sadd = tail call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 %a, i32 %b)
  %sadd3 = add i32 %a, %b

Here the add statement will be replaced by an extract.

When an overflow intrinsic follows a non-overflow instruction, a clone
of the intrinsic is inserted before the normal instruction, which makes
it the same as the previous case. Subsequent runs of GVN can then clean
up the duplicate instructions and insert the extract.

This fixes PR8817.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203553 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Transforms/Scalar/GVN.cpp
test/Transforms/GVN/overflow.ll [new file with mode: 0644]