[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / llvm / test / Transforms / NewGVN / metadata-nonnull.ll
blob1291201658469d963a0221bf891afd3cffdb2d3d
1 ; RUN: opt %s -newgvn -S | FileCheck %s
2 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
3 target triple = "x86_64-unknown-linux-gnu"
5 define i8* @test1(i8** %v0, i8** %v1) {
6 ; CHECK-LABEL: @test1(
7 ; CHECK-NEXT:  top:
8 ; CHECK-NEXT:    [[V2:%.*]] = load i8*, i8** [[V0:%[a-z0-9]+]], align 8, !nonnull !0
9 ; CHECK-NEXT:    store i8* [[V2]], i8** [[V1:%.*]]
10 ; CHECK-NEXT:    ret i8* [[V2]]
12 top:
13   %v2 = load i8*, i8** %v0, !nonnull !0
14   store i8* %v2, i8** %v1
15   %v3 = load i8*, i8** %v1
16   ret i8* %v3
19 ; FIXME: could propagate nonnull to first load?
20 define i8* @test2(i8** %v0, i8** %v1) {
21 ; CHECK-LABEL: @test2(
22 ; CHECK-NEXT:  top:
23 ; CHECK-NEXT:    [[V2:%.*]] = load i8*, i8** [[V0:%[a-z0-9]+]]
24 ; CHECK-NOT:     !nonnull
25 ; CHECK-NEXT:    store i8* [[V2]], i8** [[V1:%.*]]
26 ; CHECK-NEXT:    ret i8* [[V2]]
28 top:
29   %v2 = load i8*, i8** %v0
30   store i8* %v2, i8** %v1
31   %v3 = load i8*, i8** %v1, !nonnull !0
32   ret i8* %v3
35 declare void @use1(i8* %a) readonly
37 define i8* @test3(i8** %v0) {
38 ; CHECK-LABEL: @test3(
39 ; CHECK-NEXT:  top:
40 ; CHECK-NEXT:    [[V1:%.*]] = load i8*, i8** [[V0:%[a-z0-9]+]]
41 ; CHECK-NOT:     !nonnull
42 ; CHECK-NEXT:    call void @use1(i8* [[V1]])
43 ; CHECK-NEXT:    br i1 undef, label [[BB1:%.*]], label [[BB2:%.*]]
44 ; CHECK:       bb1:
45 ; CHECK-NEXT:    ret i8* [[V1]]
46 ; CHECK:       bb2:
47 ; CHECK-NEXT:    ret i8* [[V1]]
49 top:
50   %v1 = load i8*, i8** %v0
51   call void @use1(i8* %v1)
52   br i1 undef, label %bb1, label %bb2
54 bb1:
55   %v2 = load i8*, i8** %v0, !nonnull !0
56   ret i8* %v2
58 bb2:
59   %v3 = load i8*, i8** %v0
60   ret i8* %v3
63 define i8* @test4(i8** %v0) {
64 ; CHECK-LABEL: @test4(
65 ; CHECK-NEXT:  top:
66 ; CHECK-NEXT:    [[V1:%.*]] = load i8*, i8** [[V0:%[a-z0-9]+]]
67 ; CHECK-NOT:     !nonnull
68 ; CHECK-NEXT:    call void @use1(i8* [[V1]])
69 ; CHECK-NEXT:    br i1 undef, label [[BB1:%.*]], label [[BB2:%.*]]
70 ; CHECK:       bb1:
71 ; CHECK-NEXT:    ret i8* [[V1]]
72 ; CHECK:       bb2:
73 ; CHECK-NEXT:    ret i8* [[V1]]
75 top:
76   %v1 = load i8*, i8** %v0
77   call void @use1(i8* %v1)
78   br i1 undef, label %bb1, label %bb2
80 bb1:
81   %v2 = load i8*, i8** %v0
82   ret i8* %v2
84 bb2:
85   %v3 = load i8*, i8** %v0, !nonnull !0
86   ret i8* %v3
89 define i8* @test5(i8** %v0) {
90 ; CHECK-LABEL: @test5(
91 ; CHECK-NEXT:  top:
92 ; CHECK-NEXT:    [[V1:%.*]] = load i8*, i8** [[V0:%[a-z0-9]+]], align 8, !nonnull !0
93 ; CHECK-NEXT:    call void @use1(i8* [[V1]])
94 ; CHECK-NEXT:    br i1 undef, label [[BB1:%.*]], label [[BB2:%.*]]
95 ; CHECK:       bb1:
96 ; CHECK-NEXT:    ret i8* [[V1]]
97 ; CHECK:       bb2:
98 ; CHECK-NEXT:    ret i8* [[V1]]
100 top:
101   %v1 = load i8*, i8** %v0, !nonnull !0
102   call void @use1(i8* %v1)
103   br i1 undef, label %bb1, label %bb2
105 bb1:
106   %v2 = load i8*, i8** %v0
107   ret i8* %v2
109 bb2:
110   %v3 = load i8*, i8** %v0
111   ret i8* %v3
114 define i8* @test6(i8** %v0, i8** %v1) {
115 ; CHECK-LABEL: @test6(
116 ; CHECK-NEXT:  top:
117 ; CHECK-NEXT:    br i1 undef, label [[BB1:%.*]], label [[BB2:%.*]]
118 ; CHECK:       bb1:
119 ; CHECK-NEXT:    [[V2:%.*]] = load i8*, i8** [[V0:%[a-z0-9]+]], align 8, !nonnull !0
120 ; CHECK-NEXT:    store i8* [[V2]], i8** [[V1:%.*]]
121 ; CHECK-NEXT:    ret i8* [[V2]]
122 ; CHECK:       bb2:
123 ; CHECK-NEXT:    [[V4:%.*]] = load i8*, i8** [[V0]]
124 ; CHECK-NOT:     !nonnull
125 ; CHECK-NEXT:    store i8* [[V4]], i8** [[V1]]
126 ; CHECK-NOT:     !nonnull
127 ; CHECK-NEXT:    ret i8* [[V4]]
129 top:
130   br i1 undef, label %bb1, label %bb2
132 bb1:
133   %v2 = load i8*, i8** %v0, !nonnull !0
134   store i8* %v2, i8** %v1
135   %v3 = load i8*, i8** %v1
136   ret i8* %v3
138 bb2:
139   %v4 = load i8*, i8** %v0
140   store i8* %v4, i8** %v1
141   %v5 = load i8*, i8** %v1, !nonnull !0
142   ret i8* %v5
145 declare void @use2(i8* %a)
147 define i8* @test7(i8** %v0) {
148 ; CHECK-LABEL: @test7(
149 ; CHECK-NEXT:  top:
150 ; CHECK-NEXT:    [[V1:%.*]] = load i8*, i8** [[V0:%[a-z0-9]+]], align 8, !nonnull !0
151 ; CHECK-NEXT:    call void @use2(i8* [[V1]])
152 ; CHECK-NEXT:    br i1 undef, label [[BB1:%.*]], label [[BB2:%.*]]
153 ; CHECK:       bb1:
154 ; CHECK-NEXT:    [[V2:%.*]] = load i8*, i8** [[V0]]
155 ; CHECK-NOT:     !nonnull
156 ; CHECK-NEXT:    ret i8* [[V2]]
157 ; CHECK:       bb2:
158 ; CHECK-NEXT:    [[V3:%.*]] = load i8*, i8** [[V0]]
159 ; CHECK-NOT:     !nonnull
160 ; CHECK-NEXT:    ret i8* [[V3]]
162 top:
163   %v1 = load i8*, i8** %v0, !nonnull !0
164   call void @use2(i8* %v1)
165   br i1 undef, label %bb1, label %bb2
167 bb1:
168   %v2 = load i8*, i8** %v0
169   ret i8* %v2
171 bb2:
172   %v3 = load i8*, i8** %v0
173   ret i8* %v3
176 !0 = !{}