xref: /llvm-project/llvm/test/Transforms/InstCombine/invariant.group.ll (revision 2caaec65c04ea7d0e9568b7895b7a46d6100cb75)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=instcombine,early-cse -earlycse-debug-hash -S < %s | FileCheck %s
3
4define ptr @simplifyNullLaunder() {
5; CHECK-LABEL: @simplifyNullLaunder(
6; CHECK-NEXT:    ret ptr null
7;
8  %b2 = call ptr @llvm.launder.invariant.group.p0(ptr null)
9  ret ptr %b2
10}
11
12define ptr @dontSimplifyNullLaunderNoNullOpt() #0 {
13; CHECK-LABEL: @dontSimplifyNullLaunderNoNullOpt(
14; CHECK-NEXT:    [[B2:%.*]] = call ptr @llvm.launder.invariant.group.p0(ptr null)
15; CHECK-NEXT:    ret ptr [[B2]]
16;
17  %b2 = call ptr @llvm.launder.invariant.group.p0(ptr null)
18  ret ptr %b2
19}
20
21define ptr addrspace(42) @dontsimplifyNullLaunderForDifferentAddrspace() {
22; CHECK-LABEL: @dontsimplifyNullLaunderForDifferentAddrspace(
23; CHECK-NEXT:    [[B2:%.*]] = call ptr addrspace(42) @llvm.launder.invariant.group.p42(ptr addrspace(42) null)
24; CHECK-NEXT:    ret ptr addrspace(42) [[B2]]
25;
26  %b2 = call ptr addrspace(42) @llvm.launder.invariant.group.p42(ptr addrspace(42) null)
27  ret ptr addrspace(42) %b2
28}
29
30define ptr @simplifyUndefLaunder() {
31; CHECK-LABEL: @simplifyUndefLaunder(
32; CHECK-NEXT:    ret ptr undef
33;
34  %b2 = call ptr @llvm.launder.invariant.group.p0(ptr undef)
35  ret ptr %b2
36}
37
38define ptr addrspace(42) @simplifyUndefLaunder2() {
39; CHECK-LABEL: @simplifyUndefLaunder2(
40; CHECK-NEXT:    ret ptr addrspace(42) undef
41;
42  %b2 = call ptr addrspace(42) @llvm.launder.invariant.group.p42(ptr addrspace(42) undef)
43  ret ptr addrspace(42) %b2
44}
45
46define ptr @simplifyNullStrip() {
47; CHECK-LABEL: @simplifyNullStrip(
48; CHECK-NEXT:    ret ptr null
49;
50  %b2 = call ptr @llvm.strip.invariant.group.p0(ptr null)
51  ret ptr %b2
52}
53
54define ptr @dontSimplifyNullStripNonNullOpt() #0 {
55; CHECK-LABEL: @dontSimplifyNullStripNonNullOpt(
56; CHECK-NEXT:    [[B2:%.*]] = call ptr @llvm.strip.invariant.group.p0(ptr null)
57; CHECK-NEXT:    ret ptr [[B2]]
58;
59  %b2 = call ptr @llvm.strip.invariant.group.p0(ptr null)
60  ret ptr %b2
61}
62
63define ptr addrspace(42) @dontsimplifyNullStripForDifferentAddrspace() {
64; CHECK-LABEL: @dontsimplifyNullStripForDifferentAddrspace(
65; CHECK-NEXT:    [[B2:%.*]] = call ptr addrspace(42) @llvm.strip.invariant.group.p42(ptr addrspace(42) null)
66; CHECK-NEXT:    ret ptr addrspace(42) [[B2]]
67;
68  %b2 = call ptr addrspace(42) @llvm.strip.invariant.group.p42(ptr addrspace(42) null)
69  ret ptr addrspace(42) %b2
70}
71
72define ptr @simplifyUndefStrip() {
73; CHECK-LABEL: @simplifyUndefStrip(
74; CHECK-NEXT:    ret ptr undef
75;
76  %b2 = call ptr @llvm.strip.invariant.group.p0(ptr undef)
77  ret ptr %b2
78}
79
80define ptr addrspace(42) @simplifyUndefStrip2() {
81; CHECK-LABEL: @simplifyUndefStrip2(
82; CHECK-NEXT:    ret ptr addrspace(42) undef
83;
84  %b2 = call ptr addrspace(42) @llvm.strip.invariant.group.p42(ptr addrspace(42) undef)
85  ret ptr addrspace(42) %b2
86}
87
88define ptr @simplifyLaunderOfLaunder(ptr %a) {
89; CHECK-LABEL: @simplifyLaunderOfLaunder(
90; CHECK-NEXT:    [[A3:%.*]] = call ptr @llvm.launder.invariant.group.p0(ptr [[A:%.*]])
91; CHECK-NEXT:    ret ptr [[A3]]
92;
93  %a2 = call ptr @llvm.launder.invariant.group.p0(ptr %a)
94  %a3 = call ptr @llvm.launder.invariant.group.p0(ptr %a2)
95  ret ptr %a3
96}
97
98define ptr @simplifyStripOfLaunder(ptr %a) {
99; CHECK-LABEL: @simplifyStripOfLaunder(
100; CHECK-NEXT:    [[A3:%.*]] = call ptr @llvm.strip.invariant.group.p0(ptr [[A:%.*]])
101; CHECK-NEXT:    ret ptr [[A3]]
102;
103  %a2 = call ptr @llvm.launder.invariant.group.p0(ptr %a)
104  %a3 = call ptr @llvm.strip.invariant.group.p0(ptr %a2)
105  ret ptr %a3
106}
107
108define i1 @simplifyForCompare(ptr %a) {
109; CHECK-LABEL: @simplifyForCompare(
110; CHECK-NEXT:    [[A3:%.*]] = call ptr @llvm.strip.invariant.group.p0(ptr [[A:%.*]])
111; CHECK-NEXT:    ret i1 true
112;
113  %a2 = call ptr @llvm.launder.invariant.group.p0(ptr %a)
114
115  %a3 = call ptr @llvm.strip.invariant.group.p0(ptr %a2)
116  %b2 = call ptr @llvm.strip.invariant.group.p0(ptr %a)
117  %c = icmp eq ptr %a3, %b2
118  ret i1 %c
119}
120
121define ptr @skipWithDifferentTypes(ptr %a) {
122; CHECK-LABEL: @skipWithDifferentTypes(
123; CHECK-NEXT:    [[A3:%.*]] = call ptr @llvm.strip.invariant.group.p0(ptr [[A:%.*]])
124; CHECK-NEXT:    ret ptr [[A3]]
125;
126  %a2 = call ptr @llvm.launder.invariant.group.p0(ptr %a)
127
128  %a3 = call ptr @llvm.strip.invariant.group.p0(ptr %a2)
129  ret ptr %a3
130}
131
132define ptr addrspace(42) @skipWithDifferentTypesAddrspace(ptr addrspace(42) %a) {
133; CHECK-LABEL: @skipWithDifferentTypesAddrspace(
134; CHECK-NEXT:    [[A3:%.*]] = call ptr addrspace(42) @llvm.strip.invariant.group.p42(ptr addrspace(42) [[A:%.*]])
135; CHECK-NEXT:    ret ptr addrspace(42) [[A3]]
136;
137  %a2 = call ptr addrspace(42) @llvm.launder.invariant.group.p42(ptr addrspace(42) %a)
138
139  %a3 = call ptr addrspace(42) @llvm.strip.invariant.group.p42(ptr addrspace(42) %a2)
140  ret ptr addrspace(42) %a3
141}
142
143define ptr addrspace(42) @skipWithDifferentTypesDifferentAddrspace(ptr %a) {
144; CHECK-LABEL: @skipWithDifferentTypesDifferentAddrspace(
145; CHECK-NEXT:    [[TMP1:%.*]] = call ptr @llvm.strip.invariant.group.p0(ptr [[A:%.*]])
146; CHECK-NEXT:    [[A3:%.*]] = addrspacecast ptr [[TMP1]] to ptr addrspace(42)
147; CHECK-NEXT:    ret ptr addrspace(42) [[A3]]
148;
149  %cast = addrspacecast ptr %a to ptr addrspace(42)
150  %a2 = call ptr addrspace(42) @llvm.launder.invariant.group.p42(ptr addrspace(42) %cast)
151
152  %a3 = call ptr addrspace(42) @llvm.strip.invariant.group.p42(ptr addrspace(42) %a2)
153  ret ptr addrspace(42) %a3
154}
155
156define i1 @icmp_null_launder(ptr %a) {
157; CHECK-LABEL: @icmp_null_launder(
158; CHECK-NEXT:    [[R:%.*]] = icmp eq ptr [[A:%.*]], null
159; CHECK-NEXT:    ret i1 [[R]]
160;
161  %a2 = call ptr @llvm.launder.invariant.group.p0(ptr %a)
162  %r = icmp eq ptr %a2, null
163  ret i1 %r
164}
165
166define i1 @icmp_null_strip(ptr %a) {
167; CHECK-LABEL: @icmp_null_strip(
168; CHECK-NEXT:    [[R:%.*]] = icmp eq ptr [[A:%.*]], null
169; CHECK-NEXT:    ret i1 [[R]]
170;
171  %a2 = call ptr @llvm.strip.invariant.group.p0(ptr %a)
172  %r = icmp eq ptr %a2, null
173  ret i1 %r
174}
175
176define i1 @icmp_null_launder_valid_null(ptr %a) #0 {
177; CHECK-LABEL: @icmp_null_launder_valid_null(
178; CHECK-NEXT:    [[A2:%.*]] = call ptr @llvm.launder.invariant.group.p0(ptr [[A:%.*]])
179; CHECK-NEXT:    [[R:%.*]] = icmp eq ptr [[A2]], null
180; CHECK-NEXT:    ret i1 [[R]]
181;
182  %a2 = call ptr @llvm.launder.invariant.group.p0(ptr %a)
183  %r = icmp eq ptr %a2, null
184  ret i1 %r
185}
186
187define i1 @icmp_null_strip_valid_null(ptr %a) #0 {
188; CHECK-LABEL: @icmp_null_strip_valid_null(
189; CHECK-NEXT:    [[A2:%.*]] = call ptr @llvm.strip.invariant.group.p0(ptr [[A:%.*]])
190; CHECK-NEXT:    [[R:%.*]] = icmp eq ptr [[A2]], null
191; CHECK-NEXT:    ret i1 [[R]]
192;
193  %a2 = call ptr @llvm.strip.invariant.group.p0(ptr %a)
194  %r = icmp eq ptr %a2, null
195  ret i1 %r
196}
197
198; Check that null always becomes the RHS
199define i1 @icmp_null_launder_lhs(ptr %a) {
200; CHECK-LABEL: @icmp_null_launder_lhs(
201; CHECK-NEXT:    [[R:%.*]] = icmp eq ptr [[A:%.*]], null
202; CHECK-NEXT:    ret i1 [[R]]
203;
204  %a2 = call ptr @llvm.launder.invariant.group.p0(ptr %a)
205  %r = icmp eq ptr null, %a2
206  ret i1 %r
207}
208
209define i1 @icmp_null_launder_bitcasts(ptr %a) {
210; CHECK-LABEL: @icmp_null_launder_bitcasts(
211; CHECK-NEXT:    [[R:%.*]] = icmp eq ptr [[A:%.*]], null
212; CHECK-NEXT:    ret i1 [[R]]
213;
214  %a3 = call ptr @llvm.launder.invariant.group.p0(ptr %a)
215  %r = icmp eq ptr %a3, null
216  ret i1 %r
217}
218
219declare ptr @llvm.launder.invariant.group.p0(ptr)
220declare ptr addrspace(42) @llvm.launder.invariant.group.p42(ptr addrspace(42))
221declare ptr @llvm.strip.invariant.group.p0(ptr)
222declare ptr addrspace(42) @llvm.strip.invariant.group.p42(ptr addrspace(42))
223
224attributes #0 = { null_pointer_is_valid }
225