xref: /llvm-project/llvm/test/Transforms/NewGVN/range.ll (revision f44c7dec67fee8a41450c8a46d9e944f88f82eb6)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals --version 2
2; RUN: opt -passes=newgvn -S < %s | FileCheck %s
3
4define i32 @test1(ptr %p) {
5; CHECK-LABEL: define i32 @test1
6; CHECK-SAME: (ptr [[P:%.*]]) {
7; CHECK-NEXT:    [[A:%.*]] = load i32, ptr [[P]], align 4, !range [[RNG0:![0-9]+]]
8; CHECK-NEXT:    [[C:%.*]] = add i32 [[A]], [[A]]
9; CHECK-NEXT:    ret i32 [[C]]
10;
11  %a = load i32, ptr %p, !range !0
12  %b = load i32, ptr %p, !range !0
13  %c = add i32 %a, %b
14  ret i32 %c
15}
16
17define i32 @test2(ptr %p) {
18; CHECK-LABEL: define i32 @test2
19; CHECK-SAME: (ptr [[P:%.*]]) {
20; CHECK-NEXT:    [[A:%.*]] = load i32, ptr [[P]], align 4
21; CHECK-NEXT:    [[C:%.*]] = add i32 [[A]], [[A]]
22; CHECK-NEXT:    ret i32 [[C]]
23;
24  %a = load i32, ptr %p, !range !0
25  %b = load i32, ptr %p
26  %c = add i32 %a, %b
27  ret i32 %c
28}
29
30define i32 @test3(ptr %p) {
31; CHECK-LABEL: define i32 @test3
32; CHECK-SAME: (ptr [[P:%.*]]) {
33; CHECK-NEXT:    [[A:%.*]] = load i32, ptr [[P]], align 4, !range [[RNG1:![0-9]+]]
34; CHECK-NEXT:    [[C:%.*]] = add i32 [[A]], [[A]]
35; CHECK-NEXT:    ret i32 [[C]]
36;
37  %a = load i32, ptr %p, !range !0
38  %b = load i32, ptr %p, !range !1
39  %c = add i32 %a, %b
40  ret i32 %c
41}
42
43define i32 @test4(ptr %p) {
44; CHECK-LABEL: define i32 @test4
45; CHECK-SAME: (ptr [[P:%.*]]) {
46; CHECK-NEXT:    [[A:%.*]] = load i32, ptr [[P]], align 4, !range [[RNG2:![0-9]+]]
47; CHECK-NEXT:    [[C:%.*]] = add i32 [[A]], [[A]]
48; CHECK-NEXT:    ret i32 [[C]]
49;
50  %a = load i32, ptr %p, !range !0
51  %b = load i32, ptr %p, !range !2
52  %c = add i32 %a, %b
53  ret i32 %c
54}
55
56define i32 @test5(ptr %p) {
57; CHECK-LABEL: define i32 @test5
58; CHECK-SAME: (ptr [[P:%.*]]) {
59; CHECK-NEXT:    [[A:%.*]] = load i32, ptr [[P]], align 4, !range [[RNG3:![0-9]+]]
60; CHECK-NEXT:    [[C:%.*]] = add i32 [[A]], [[A]]
61; CHECK-NEXT:    ret i32 [[C]]
62;
63  %a = load i32, ptr %p, !range !3
64  %b = load i32, ptr %p, !range !4
65  %c = add i32 %a, %b
66  ret i32 %c
67}
68
69define i32 @test6(ptr %p) {
70; CHECK-LABEL: define i32 @test6
71; CHECK-SAME: (ptr [[P:%.*]]) {
72; CHECK-NEXT:    [[A:%.*]] = load i32, ptr [[P]], align 4, !range [[RNG4:![0-9]+]]
73; CHECK-NEXT:    [[C:%.*]] = add i32 [[A]], [[A]]
74; CHECK-NEXT:    ret i32 [[C]]
75;
76  %a = load i32, ptr %p, !range !5
77  %b = load i32, ptr %p, !range !6
78  %c = add i32 %a, %b
79  ret i32 %c
80}
81
82define i32 @test7(ptr %p) {
83; CHECK-LABEL: define i32 @test7
84; CHECK-SAME: (ptr [[P:%.*]]) {
85; CHECK-NEXT:    [[A:%.*]] = load i32, ptr [[P]], align 4, !range [[RNG5:![0-9]+]]
86; CHECK-NEXT:    [[C:%.*]] = add i32 [[A]], [[A]]
87; CHECK-NEXT:    ret i32 [[C]]
88;
89  %a = load i32, ptr %p, !range !7
90  %b = load i32, ptr %p, !range !8
91  %c = add i32 %a, %b
92  ret i32 %c
93}
94
95define i32 @test8(ptr %p) {
96; CHECK-LABEL: define i32 @test8
97; CHECK-SAME: (ptr [[P:%.*]]) {
98; CHECK-NEXT:    [[A:%.*]] = load i32, ptr [[P]], align 4
99; CHECK-NEXT:    [[C:%.*]] = add i32 [[A]], [[A]]
100; CHECK-NEXT:    ret i32 [[C]]
101;
102  %a = load i32, ptr %p, !range !9
103  %b = load i32, ptr %p, !range !10
104  %c = add i32 %a, %b
105  ret i32 %c
106}
107
108
109!0 = !{i32 0, i32 2}
110!1 = !{i32 3, i32 5}
111!2 = !{i32 2, i32 5}
112!3 = !{i32 -5, i32 -2}
113!4 = !{i32 1, i32 5}
114!5 = !{i32 10, i32 1}
115!6 = !{i32 12, i32 16}
116!7 = !{i32 1, i32 2, i32 3, i32 4}
117!8 = !{i32 5, i32 1}
118!9 = !{i32 1, i32 5}
119!10 = !{i32 5, i32 1}
120;.
121; CHECK: [[RNG0]] = !{i32 0, i32 2}
122; CHECK: [[RNG1]] = !{i32 0, i32 2, i32 3, i32 5}
123; CHECK: [[RNG2]] = !{i32 0, i32 5}
124; CHECK: [[RNG3]] = !{i32 -5, i32 -2, i32 1, i32 5}
125; CHECK: [[RNG4]] = !{i32 10, i32 1}
126; CHECK: [[RNG5]] = !{i32 3, i32 4, i32 5, i32 2}
127;.
128