[ARM] More MVE compare vector splat combines for ANDs
[llvm-complete.git] / test / Transforms / NewGVN / metadata-nonnull.ll
bloba09e86800abb9af43c4b7eedc5f2113ae8c038e2
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
3 ; RUN: opt %s -newgvn -S | FileCheck %s
4 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
5 target triple = "x86_64-unknown-linux-gnu"
7 define i8* @test1(i8** %v0, i8** %v1) {
8 ; CHECK-LABEL: @test1(
9 ; CHECK-NEXT:  top:
10 ; CHECK-NEXT:    [[V2:%.*]] = load i8*, i8** [[V0:%[a-z0-9]+]], !nonnull !0
11 ; CHECK-NEXT:    store i8* [[V2]], i8** [[V1:%.*]]
12 ; CHECK-NEXT:    ret i8* [[V2]]
14 top:
15   %v2 = load i8*, i8** %v0, !nonnull !0
16   store i8* %v2, i8** %v1
17   %v3 = load i8*, i8** %v1
18   ret i8* %v3
21 ; FIXME: could propagate nonnull to first load?
22 define i8* @test2(i8** %v0, i8** %v1) {
23 ; CHECK-LABEL: @test2(
24 ; CHECK-NEXT:  top:
25 ; CHECK-NEXT:    [[V2:%.*]] = load i8*, i8** [[V0:%[a-z0-9]+]]
26 ; CHECK-NOT:     !nonnull
27 ; CHECK-NEXT:    store i8* [[V2]], i8** [[V1:%.*]]
28 ; CHECK-NEXT:    ret i8* [[V2]]
30 top:
31   %v2 = load i8*, i8** %v0
32   store i8* %v2, i8** %v1
33   %v3 = load i8*, i8** %v1, !nonnull !0
34   ret i8* %v3
37 declare void @use1(i8* %a) readonly
39 define i8* @test3(i8** %v0) {
40 ; CHECK-LABEL: @test3(
41 ; CHECK-NEXT:  top:
42 ; CHECK-NEXT:    [[V1:%.*]] = load i8*, i8** [[V0:%[a-z0-9]+]]
43 ; CHECK-NOT:     !nonnull
44 ; CHECK-NEXT:    call void @use1(i8* [[V1]])
45 ; CHECK-NEXT:    br i1 undef, label [[BB1:%.*]], label [[BB2:%.*]]
46 ; CHECK:       bb1:
47 ; CHECK-NEXT:    ret i8* [[V1]]
48 ; CHECK:       bb2:
49 ; CHECK-NEXT:    ret i8* [[V1]]
51 top:
52   %v1 = load i8*, i8** %v0
53   call void @use1(i8* %v1)
54   br i1 undef, label %bb1, label %bb2
56 bb1:
57   %v2 = load i8*, i8** %v0, !nonnull !0
58   ret i8* %v2
60 bb2:
61   %v3 = load i8*, i8** %v0
62   ret i8* %v3
65 define i8* @test4(i8** %v0) {
66 ; CHECK-LABEL: @test4(
67 ; CHECK-NEXT:  top:
68 ; CHECK-NEXT:    [[V1:%.*]] = load i8*, i8** [[V0:%[a-z0-9]+]]
69 ; CHECK-NOT:     !nonnull
70 ; CHECK-NEXT:    call void @use1(i8* [[V1]])
71 ; CHECK-NEXT:    br i1 undef, label [[BB1:%.*]], label [[BB2:%.*]]
72 ; CHECK:       bb1:
73 ; CHECK-NEXT:    ret i8* [[V1]]
74 ; CHECK:       bb2:
75 ; CHECK-NEXT:    ret i8* [[V1]]
77 top:
78   %v1 = load i8*, i8** %v0
79   call void @use1(i8* %v1)
80   br i1 undef, label %bb1, label %bb2
82 bb1:
83   %v2 = load i8*, i8** %v0
84   ret i8* %v2
86 bb2:
87   %v3 = load i8*, i8** %v0, !nonnull !0
88   ret i8* %v3
91 define i8* @test5(i8** %v0) {
92 ; CHECK-LABEL: @test5(
93 ; CHECK-NEXT:  top:
94 ; CHECK-NEXT:    [[V1:%.*]] = load i8*, i8** [[V0:%[a-z0-9]+]], !nonnull !0
95 ; CHECK-NEXT:    call void @use1(i8* [[V1]])
96 ; CHECK-NEXT:    br i1 undef, label [[BB1:%.*]], label [[BB2:%.*]]
97 ; CHECK:       bb1:
98 ; CHECK-NEXT:    ret i8* [[V1]]
99 ; CHECK:       bb2:
100 ; CHECK-NEXT:    ret i8* [[V1]]
102 top:
103   %v1 = load i8*, i8** %v0, !nonnull !0
104   call void @use1(i8* %v1)
105   br i1 undef, label %bb1, label %bb2
107 bb1:
108   %v2 = load i8*, i8** %v0
109   ret i8* %v2
111 bb2:
112   %v3 = load i8*, i8** %v0
113   ret i8* %v3
116 define i8* @test6(i8** %v0, i8** %v1) {
117 ; CHECK-LABEL: @test6(
118 ; CHECK-NEXT:  top:
119 ; CHECK-NEXT:    br i1 undef, label [[BB1:%.*]], label [[BB2:%.*]]
120 ; CHECK:       bb1:
121 ; CHECK-NEXT:    [[V2:%.*]] = load i8*, i8** [[V0:%[a-z0-9]+]], !nonnull !0
122 ; CHECK-NEXT:    store i8* [[V2]], i8** [[V1:%.*]]
123 ; CHECK-NEXT:    ret i8* [[V2]]
124 ; CHECK:       bb2:
125 ; CHECK-NEXT:    [[V4:%.*]] = load i8*, i8** [[V0]]
126 ; CHECK-NOT:     !nonnull
127 ; CHECK-NEXT:    store i8* [[V4]], i8** [[V1]]
128 ; CHECK-NOT:     !nonnull
129 ; CHECK-NEXT:    ret i8* [[V4]]
131 top:
132   br i1 undef, label %bb1, label %bb2
134 bb1:
135   %v2 = load i8*, i8** %v0, !nonnull !0
136   store i8* %v2, i8** %v1
137   %v3 = load i8*, i8** %v1
138   ret i8* %v3
140 bb2:
141   %v4 = load i8*, i8** %v0
142   store i8* %v4, i8** %v1
143   %v5 = load i8*, i8** %v1, !nonnull !0
144   ret i8* %v5
147 declare void @use2(i8* %a)
149 define i8* @test7(i8** %v0) {
150 ; CHECK-LABEL: @test7(
151 ; CHECK-NEXT:  top:
152 ; CHECK-NEXT:    [[V1:%.*]] = load i8*, i8** [[V0:%[a-z0-9]+]], !nonnull !0
153 ; CHECK-NEXT:    call void @use2(i8* [[V1]])
154 ; CHECK-NEXT:    br i1 undef, label [[BB1:%.*]], label [[BB2:%.*]]
155 ; CHECK:       bb1:
156 ; CHECK-NEXT:    [[V2:%.*]] = load i8*, i8** [[V0]]
157 ; CHECK-NOT:     !nonnull
158 ; CHECK-NEXT:    ret i8* [[V2]]
159 ; CHECK:       bb2:
160 ; CHECK-NEXT:    [[V3:%.*]] = load i8*, i8** [[V0]]
161 ; CHECK-NOT:     !nonnull
162 ; CHECK-NEXT:    ret i8* [[V3]]
164 top:
165   %v1 = load i8*, i8** %v0, !nonnull !0
166   call void @use2(i8* %v1)
167   br i1 undef, label %bb1, label %bb2
169 bb1:
170   %v2 = load i8*, i8** %v0
171   ret i8* %v2
173 bb2:
174   %v3 = load i8*, i8** %v0
175   ret i8* %v3
178 !0 = !{}