xref: /llvm-project/llvm/test/Transforms/NewGVN/metadata-simplify.ll (revision 229640343e400394b315c6798c7c19e8a9bd188c)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2
3; The tests in this file check that we do not simplify based on metadata that is
4; not available on all code paths.
5
6; RUN: opt < %s -S -passes=newgvn | FileCheck %s
7
8define i1 @test1(ptr %arg, i1 %arg2) {
9; CHECK-LABEL: @test1(
10; CHECK-NEXT:    br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
11; CHECK:       bb1:
12; CHECK-NEXT:    [[LOAD1:%.*]] = load ptr, ptr [[ARG:%.*]], align 8, !nonnull [[META0:![0-9]+]]
13; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq ptr [[LOAD1]], null
14; CHECK-NEXT:    ret i1 [[CMP1]]
15; CHECK:       bb2:
16; CHECK-NEXT:    [[LOAD2:%.*]] = load ptr, ptr [[ARG]], align 8
17; CHECK-NEXT:    [[CMP2:%.*]] = icmp eq ptr [[LOAD2]], null
18; CHECK-NEXT:    ret i1 [[CMP2]]
19;
20  br i1 %arg2, label %bb1, label %bb2
21
22bb1:
23  %load1 = load ptr, ptr %arg, !nonnull !0
24  %cmp1 = icmp eq ptr %load1, null
25  ret i1 %cmp1
26
27bb2:
28  %load2 = load ptr, ptr %arg
29  %cmp2 = icmp eq ptr %load2, null
30  ret i1 %cmp2
31}
32
33define i1 @test2(ptr %arg, i1 %arg2) {
34; CHECK-LABEL: @test2(
35; CHECK-NEXT:    br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
36; CHECK:       bb1:
37; CHECK-NEXT:    [[LOAD1:%.*]] = load ptr, ptr [[ARG:%.*]], align 8
38; CHECK-NEXT:    [[CMP1:%.*]] = icmp eq ptr [[LOAD1]], null
39; CHECK-NEXT:    ret i1 [[CMP1]]
40; CHECK:       bb2:
41; CHECK-NEXT:    [[LOAD2:%.*]] = load ptr, ptr [[ARG]], align 8, !nonnull [[META0]]
42; CHECK-NEXT:    [[CMP2:%.*]] = icmp eq ptr [[LOAD2]], null
43; CHECK-NEXT:    ret i1 [[CMP2]]
44;
45  br i1 %arg2, label %bb1, label %bb2
46
47bb1:
48  %load1 = load ptr, ptr %arg
49  %cmp1 = icmp eq ptr %load1, null
50  ret i1 %cmp1
51
52bb2:
53  %load2 = load ptr, ptr %arg, !nonnull !0
54  %cmp2 = icmp eq ptr %load2, null
55  ret i1 %cmp2
56}
57
58
59define i1 @test3(ptr %ptr, i1 %arg2) {
60; CHECK-LABEL: @test3(
61; CHECK-NEXT:    br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
62; CHECK:       bb1:
63; CHECK-NEXT:    [[LOAD1:%.*]] = load i32, ptr [[PTR:%.*]], align 4, !range [[RNG1:![0-9]+]]
64; CHECK-NEXT:    [[CMP1:%.*]] = icmp ne i32 [[LOAD1]], 999
65; CHECK-NEXT:    ret i1 [[CMP1]]
66; CHECK:       bb2:
67; CHECK-NEXT:    [[LOAD2:%.*]] = load i32, ptr [[PTR]], align 4
68; CHECK-NEXT:    [[CMP2:%.*]] = icmp ne i32 [[LOAD2]], 999
69; CHECK-NEXT:    ret i1 [[CMP2]]
70;
71  br i1 %arg2, label %bb1, label %bb2
72
73bb1:
74  %load1 = load i32, ptr %ptr, !range !1
75  %cmp1 = icmp ne i32 %load1, 999
76  ret i1 %cmp1
77
78bb2:
79  %load2 = load i32, ptr %ptr
80  %cmp2 = icmp ne i32 %load2, 999
81  ret i1 %cmp2
82}
83
84define i1 @test4(ptr %ptr, i1 %arg2) {
85; CHECK-LABEL: @test4(
86; CHECK-NEXT:    br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
87; CHECK:       bb1:
88; CHECK-NEXT:    [[LOAD1:%.*]] = load i32, ptr [[PTR:%.*]], align 4
89; CHECK-NEXT:    [[CMP1:%.*]] = icmp ne i32 [[LOAD1]], 999
90; CHECK-NEXT:    ret i1 [[CMP1]]
91; CHECK:       bb2:
92; CHECK-NEXT:    [[LOAD2:%.*]] = load i32, ptr [[PTR]], align 4, !range [[RNG1]]
93; CHECK-NEXT:    [[CMP2:%.*]] = icmp ne i32 [[LOAD2]], 999
94; CHECK-NEXT:    ret i1 [[CMP2]]
95;
96  br i1 %arg2, label %bb1, label %bb2
97
98bb1:
99  %load1 = load i32, ptr %ptr
100  %cmp1 = icmp ne i32 %load1, 999
101  ret i1 %cmp1
102
103bb2:
104  %load2 = load i32, ptr %ptr, !range !1
105  %cmp2 = icmp ne i32 %load2, 999
106  ret i1 %cmp2
107}
108
109define i1 @test5(ptr %ptr, i1 %arg2) {
110; CHECK-LABEL: @test5(
111; CHECK-NEXT:    br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
112; CHECK:       bb1:
113; CHECK-NEXT:    [[LOAD1:%.*]] = load i32, ptr [[PTR:%.*]], align 4, !range [[RNG1]]
114; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[LOAD1]], 999
115; CHECK-NEXT:    ret i1 [[CMP1]]
116; CHECK:       bb2:
117; CHECK-NEXT:    [[LOAD2:%.*]] = load i32, ptr [[PTR]], align 4
118; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i32 [[LOAD2]], 999
119; CHECK-NEXT:    ret i1 [[CMP2]]
120;
121  br i1 %arg2, label %bb1, label %bb2
122
123bb1:
124  %load1 = load i32, ptr %ptr, !range !1
125  %cmp1 = icmp slt i32 %load1, 999
126  ret i1 %cmp1
127
128bb2:
129  %load2 = load i32, ptr %ptr
130  %cmp2 = icmp slt i32 %load2, 999
131  ret i1 %cmp2
132}
133
134define i1 @test6(ptr %ptr, i1 %arg2) {
135; CHECK-LABEL: @test6(
136; CHECK-NEXT:    br i1 [[ARG2:%.*]], label [[BB1:%.*]], label [[BB2:%.*]]
137; CHECK:       bb1:
138; CHECK-NEXT:    [[LOAD1:%.*]] = load i32, ptr [[PTR:%.*]], align 4
139; CHECK-NEXT:    [[CMP1:%.*]] = icmp slt i32 [[LOAD1]], 999
140; CHECK-NEXT:    ret i1 [[CMP1]]
141; CHECK:       bb2:
142; CHECK-NEXT:    [[LOAD2:%.*]] = load i32, ptr [[PTR]], align 4, !range [[RNG1]]
143; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i32 [[LOAD2]], 999
144; CHECK-NEXT:    ret i1 [[CMP2]]
145;
146  br i1 %arg2, label %bb1, label %bb2
147
148bb1:
149  %load1 = load i32, ptr %ptr
150  %cmp1 = icmp slt i32 %load1, 999
151  ret i1 %cmp1
152
153bb2:
154  %load2 = load i32, ptr %ptr, !range !1
155  %cmp2 = icmp slt i32 %load2, 999
156  ret i1 %cmp2
157}
158
159!0 = !{}
160!1 = !{ i32 10, i32 20 }
161