1 ; RUN: opt -basicaa -gvn -S < %s | FileCheck %s 2 3 define i32 @test1(i32* %p) { 4 ; CHECK-LABEL: @test1(i32* %p) 5 ; CHECK: %a = load i32, i32* %p, !range !0 6 ; CHECK: %c = add i32 %a, %a 7 %a = load i32, i32* %p, !range !0 8 %b = load i32, i32* %p, !range !0 9 %c = add i32 %a, %b 10 ret i32 %c 11 } 12 13 define i32 @test2(i32* %p) { 14 ; CHECK-LABEL: @test2(i32* %p) 15 ; CHECK: %a = load i32, i32* %p 16 ; CHECK-NOT: range 17 ; CHECK: %c = add i32 %a, %a 18 %a = load i32, i32* %p, !range !0 19 %b = load i32, i32* %p 20 %c = add i32 %a, %b 21 ret i32 %c 22 } 23 24 define i32 @test3(i32* %p) { 25 ; CHECK-LABEL: @test3(i32* %p) 26 ; CHECK: %a = load i32, i32* %p, !range ![[DISJOINT_RANGE:[0-9]+]] 27 ; CHECK: %c = add i32 %a, %a 28 %a = load i32, i32* %p, !range !0 29 %b = load i32, i32* %p, !range !1 30 %c = add i32 %a, %b 31 ret i32 %c 32 } 33 34 define i32 @test4(i32* %p) { 35 ; CHECK-LABEL: @test4(i32* %p) 36 ; CHECK: %a = load i32, i32* %p, !range ![[MERGED_RANGE:[0-9]+]] 37 ; CHECK: %c = add i32 %a, %a 38 %a = load i32, i32* %p, !range !0 39 %b = load i32, i32* %p, !range !2 40 %c = add i32 %a, %b 41 ret i32 %c 42 } 43 44 define i32 @test5(i32* %p) { 45 ; CHECK-LABEL: @test5(i32* %p) 46 ; CHECK: %a = load i32, i32* %p, !range ![[MERGED_SIGNED_RANGE:[0-9]+]] 47 ; CHECK: %c = add i32 %a, %a 48 %a = load i32, i32* %p, !range !3 49 %b = load i32, i32* %p, !range !4 50 %c = add i32 %a, %b 51 ret i32 %c 52 } 53 54 define i32 @test6(i32* %p) { 55 ; CHECK-LABEL: @test6(i32* %p) 56 ; CHECK: %a = load i32, i32* %p, !range ![[MERGED_TEST6:[0-9]+]] 57 ; CHECK: %c = add i32 %a, %a 58 %a = load i32, i32* %p, !range !5 59 %b = load i32, i32* %p, !range !6 60 %c = add i32 %a, %b 61 ret i32 %c 62 } 63 64 define i32 @test7(i32* %p) { 65 ; CHECK-LABEL: @test7(i32* %p) 66 ; CHECK: %a = load i32, i32* %p, !range ![[MERGED_TEST7:[0-9]+]] 67 ; CHECK: %c = add i32 %a, %a 68 %a = load i32, i32* %p, !range !7 69 %b = load i32, i32* %p, !range !8 70 %c = add i32 %a, %b 71 ret i32 %c 72 } 73 74 define i32 @test8(i32* %p) { 75 ; CHECK-LABEL: @test8(i32* %p) 76 ; CHECK: %a = load i32, i32* %p 77 ; CHECK-NOT: range 78 ; CHECK: %c = add i32 %a, %a 79 %a = load i32, i32* %p, !range !9 80 %b = load i32, i32* %p, !range !10 81 %c = add i32 %a, %b 82 ret i32 %c 83 } 84 85 ; CHECK: ![[DISJOINT_RANGE]] = !{i32 0, i32 2, i32 3, i32 5} 86 ; CHECK: ![[MERGED_RANGE]] = !{i32 0, i32 5} 87 ; CHECK: ![[MERGED_SIGNED_RANGE]] = !{i32 -5, i32 -2, i32 1, i32 5} 88 ; CHECK: ![[MERGED_TEST6]] = !{i32 10, i32 1} 89 ; CHECK: ![[MERGED_TEST7]] = !{i32 3, i32 4, i32 5, i32 2} 90 91 !0 = !{i32 0, i32 2} 92 !1 = !{i32 3, i32 5} 93 !2 = !{i32 2, i32 5} 94 !3 = !{i32 -5, i32 -2} 95 !4 = !{i32 1, i32 5} 96 !5 = !{i32 10, i32 1} 97 !6 = !{i32 12, i32 16} 98 !7 = !{i32 1, i32 2, i32 3, i32 4} 99 !8 = !{i32 5, i32 1} 100 !9 = !{i32 1, i32 5} 101 !10 = !{i32 5, i32 1} 102