llvm-6502/test/Transforms/GVN/range.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

102 lines
2.6 KiB
LLVM

; RUN: opt %s -basicaa -gvn -S -o - | FileCheck %s
define i32 @test1(i32* %p) {
; CHECK: @test1(i32* %p)
; CHECK: %a = load i32* %p, !range !0
; CHECK: %c = add i32 %a, %a
%a = load i32* %p, !range !0
%b = load i32* %p, !range !0
%c = add i32 %a, %b
ret i32 %c
}
define i32 @test2(i32* %p) {
; CHECK: @test2(i32* %p)
; CHECK: %a = load i32* %p
; CHECK-NOT: range
; CHECK: %c = add i32 %a, %a
%a = load i32* %p, !range !0
%b = load i32* %p
%c = add i32 %a, %b
ret i32 %c
}
define i32 @test3(i32* %p) {
; CHECK: @test3(i32* %p)
; CHECK: %a = load i32* %p, !range ![[DISJOINT_RANGE:[0-9]+]]
; CHECK: %c = add i32 %a, %a
%a = load i32* %p, !range !0
%b = load i32* %p, !range !1
%c = add i32 %a, %b
ret i32 %c
}
define i32 @test4(i32* %p) {
; CHECK: @test4(i32* %p)
; CHECK: %a = load i32* %p, !range ![[MERGED_RANGE:[0-9]+]]
; CHECK: %c = add i32 %a, %a
%a = load i32* %p, !range !0
%b = load i32* %p, !range !2
%c = add i32 %a, %b
ret i32 %c
}
define i32 @test5(i32* %p) {
; CHECK: @test5(i32* %p)
; CHECK: %a = load i32* %p, !range ![[MERGED_SIGNED_RANGE:[0-9]+]]
; CHECK: %c = add i32 %a, %a
%a = load i32* %p, !range !3
%b = load i32* %p, !range !4
%c = add i32 %a, %b
ret i32 %c
}
define i32 @test6(i32* %p) {
; CHECK: @test6(i32* %p)
; CHECK: %a = load i32* %p, !range ![[MERGED_TEST6:[0-9]+]]
; CHECK: %c = add i32 %a, %a
%a = load i32* %p, !range !5
%b = load i32* %p, !range !6
%c = add i32 %a, %b
ret i32 %c
}
define i32 @test7(i32* %p) {
; CHECK: @test7(i32* %p)
; CHECK: %a = load i32* %p, !range ![[MERGED_TEST7:[0-9]+]]
; CHECK: %c = add i32 %a, %a
%a = load i32* %p, !range !7
%b = load i32* %p, !range !8
%c = add i32 %a, %b
ret i32 %c
}
define i32 @test8(i32* %p) {
; CHECK: @test8(i32* %p)
; CHECK: %a = load i32* %p
; CHECK-NOT: range
; CHECK: %c = add i32 %a, %a
%a = load i32* %p, !range !9
%b = load i32* %p, !range !10
%c = add i32 %a, %b
ret i32 %c
}
; CHECK: ![[DISJOINT_RANGE]] = metadata !{i32 0, i32 2, i32 3, i32 5}
; CHECK: ![[MERGED_RANGE]] = metadata !{i32 0, i32 5}
; CHECK: ![[MERGED_SIGNED_RANGE]] = metadata !{i32 -3, i32 -2, i32 1, i32 2}
; CHECK: ![[MERGED_TEST6]] = metadata !{i32 10, i32 1}
; CHECK: ![[MERGED_TEST7]] = metadata !{i32 3, i32 4, i32 5, i32 2}
!0 = metadata !{i32 0, i32 2}
!1 = metadata !{i32 3, i32 5}
!2 = metadata !{i32 2, i32 5}
!3 = metadata !{i32 -3, i32 -2}
!4 = metadata !{i32 1, i32 2}
!5 = metadata !{i32 10, i32 1}
!6 = metadata !{i32 12, i32 13}
!7 = metadata !{i32 1, i32 2, i32 3, i32 4}
!8 = metadata !{i32 5, i32 1}
!9 = metadata !{i32 1, i32 5}
!10 = metadata !{i32 5, i32 1}