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