llvm/test/Transforms/GVN/pr12979.ll
Rafael Espindola 06c6791742 When gvn decides to replace an instruction with another, we have to patch the
replacement to make it at least as generic as the instruction being replaced.
This includes:
* dropping nsw/nuw flags
* getting the least restrictive tbaa and fpmath metadata
* merging ranges

Fixes PR12979.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@157958 91177308-0d34-0410-b5e6-96231b3b80d8
2012-06-04 22:44:21 +00:00

80 lines
1.8 KiB
LLVM

; RUN: opt %s -gvn -S -o - | FileCheck %s
define i32 @test1(i32 %x, i32 %y) {
; CHECK: @test1(i32 %x, i32 %y)
; CHECK: %add1 = add i32 %x, %y
; CHECK: %foo = add i32 %add1, %add1
%add1 = add nsw i32 %x, %y
%add2 = add i32 %x, %y
%foo = add i32 %add1, %add2
ret i32 %foo
}
define i32 @test2(i32 %x, i32 %y) {
; CHECK: @test2(i32 %x, i32 %y)
; CHECK: %add1 = add i32 %x, %y
; CHECK: %foo = add i32 %add1, %add1
%add1 = add nuw i32 %x, %y
%add2 = add i32 %x, %y
%foo = add i32 %add1, %add2
ret i32 %foo
}
define i32 @test3(i32 %x, i32 %y) {
; CHECK: @test3(i32 %x, i32 %y)
; CHECK: %add1 = add i32 %x, %y
; CHECK: %foo = add i32 %add1, %add1
%add1 = add nuw nsw i32 %x, %y
%add2 = add i32 %x, %y
%foo = add i32 %add1, %add2
ret i32 %foo
}
define i32 @test4(i32 %x, i32 %y) {
; CHECK: @test4(i32 %x, i32 %y)
; CHECK: %add1 = add nsw i32 %x, %y
; CHECK: %foo = add i32 %add1, %add1
%add1 = add nsw i32 %x, %y
%add2 = add nsw i32 %x, %y
%foo = add i32 %add1, %add2
ret i32 %foo
}
define i32 @test5(i32 %x, i32 %y) {
; CHECK: @test5(i32 %x, i32 %y)
; CHECK: %add1 = add i32 %x, %y
; CHECK: %foo = add i32 %add1, %add1
%add1 = add nuw i32 %x, %y
%add2 = add nsw i32 %x, %y
%foo = add i32 %add1, %add2
ret i32 %foo
}
define i32 @test6(i32 %x, i32 %y) {
; CHECK: @test6(i32 %x, i32 %y)
; CHECK: %add1 = add nsw i32 %x, %y
; CHECK: %foo = add i32 %add1, %add1
%add1 = add nuw nsw i32 %x, %y
%add2 = add nsw i32 %x, %y
%foo = add i32 %add1, %add2
ret i32 %foo
}
define i32 @test7(i32 %x, i32 %y) {
; CHECK: @test7(i32 %x, i32 %y)
; CHECK: %add1 = add i32 %x, %y
; CHECK-NOT: what_is_this
; CHECK: %foo = add i32 %add1, %add1
%add1 = add i32 %x, %y, !what_is_this !{}
%add2 = add i32 %x, %y
%foo = add i32 %add1, %add2
ret i32 %foo
}