xref: /llvm-project/llvm/test/Transforms/InstCombine/load-combine-metadata-dominance.ll (revision 3e992d81afc3925a8685eb15f794dd4a6ba3e97e)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals --version 2
2; RUN: opt -passes=instcombine -S < %s | FileCheck %s
3
4target datalayout = "e-m:e-p:64:64:64-i64:64-f80:128-n8:16:32:64-S128"
5
6; Check that nonnull metadata is not propagated from dominating load.
7define void @combine_metadata_dominance1(ptr %p) {
8; CHECK-LABEL: define void @combine_metadata_dominance1
9; CHECK-SAME: (ptr [[P:%.*]]) {
10; CHECK-NEXT:  entry:
11; CHECK-NEXT:    br label [[BB1:%.*]]
12; CHECK:       bb1:
13; CHECK-NEXT:    [[A:%.*]] = load ptr, ptr [[P]], align 8
14; CHECK-NEXT:    store i32 0, ptr [[A]], align 4
15; CHECK-NEXT:    ret void
16;
17entry:
18  %a = load ptr, ptr %p, !nonnull !0
19  br label %bb1
20
21bb1:
22  %b = load ptr, ptr %p
23  store i32 0, ptr %a
24  store i32 0, ptr %b
25  ret void
26}
27
28declare i32 @use(ptr, i32) readonly
29
30; Check that nonnull from the dominated load does not get propagated.
31; There are some cases where it would be safe to keep it.
32define void @combine_metadata_dominance2(ptr %p, i1 %c1) {
33; CHECK-LABEL: define void @combine_metadata_dominance2
34; CHECK-SAME: (ptr [[P:%.*]], i1 [[C1:%.*]]) {
35; CHECK-NEXT:  entry:
36; CHECK-NEXT:    br i1 [[C1]], label [[BB1:%.*]], label [[BB2:%.*]]
37; CHECK:       bb1:
38; CHECK-NEXT:    [[A:%.*]] = load ptr, ptr [[P]], align 8
39; CHECK-NEXT:    store i32 0, ptr [[A]], align 4
40; CHECK-NEXT:    ret void
41; CHECK:       bb2:
42; CHECK-NEXT:    ret void
43;
44entry:
45  %a = load ptr, ptr %p
46  br i1 %c1, label %bb1, label %bb2
47
48bb1:
49  %b = load ptr, ptr %p, !nonnull !0
50  store i32 0, ptr %a
51  store i32 0, ptr %b
52  ret void
53
54bb2:
55  ret void
56}
57
58define void @combine_metadata_dominance3(ptr %p) {
59; CHECK-LABEL: define void @combine_metadata_dominance3
60; CHECK-SAME: (ptr [[P:%.*]]) {
61; CHECK-NEXT:  entry:
62; CHECK-NEXT:    br label [[BB1:%.*]]
63; CHECK:       bb1:
64; CHECK-NEXT:    [[A:%.*]] = load ptr, ptr [[P]], align 8, !nonnull !0, !noundef !0
65; CHECK-NEXT:    store i32 0, ptr [[A]], align 4
66; CHECK-NEXT:    ret void
67;
68entry:
69  %a = load ptr, ptr %p, !nonnull !0, !noundef !1
70  br label %bb1
71
72bb1:
73  %b = load ptr, ptr %p
74  store i32 0, ptr %a
75  store i32 0, ptr %b
76  ret void
77}
78
79define void @combine_metadata_dominance4(ptr %p) {
80; CHECK-LABEL: define void @combine_metadata_dominance4
81; CHECK-SAME: (ptr [[P:%.*]]) {
82; CHECK-NEXT:  entry:
83; CHECK-NEXT:    br label [[BB1:%.*]]
84; CHECK:       bb1:
85; CHECK-NEXT:    [[A:%.*]] = load ptr, ptr [[P]], align 8
86; CHECK-NEXT:    store i32 0, ptr [[A]], align 4
87; CHECK-NEXT:    ret void
88;
89entry:
90  %a = load ptr, ptr %p, !nonnull !0
91  br label %bb1
92
93bb1:
94  %b = load ptr, ptr %p, !noundef !1
95  store i32 0, ptr %a
96  store i32 0, ptr %b
97  ret void
98}
99
100define void @combine_metadata_dominance5(ptr %p) {
101; CHECK-LABEL: define void @combine_metadata_dominance5
102; CHECK-SAME: (ptr [[P:%.*]]) {
103; CHECK-NEXT:  entry:
104; CHECK-NEXT:    br label [[BB1:%.*]]
105; CHECK:       bb1:
106; CHECK-NEXT:    [[A:%.*]] = load ptr, ptr [[P]], align 8, !align !1
107; CHECK-NEXT:    store i32 0, ptr [[A]], align 4
108; CHECK-NEXT:    ret void
109;
110entry:
111  %a = load ptr, ptr %p, !align !2
112  br label %bb1
113
114bb1:
115  %b = load ptr, ptr %p, !align !3
116  store i32 0, ptr %a
117  store i32 0, ptr %b
118  ret void
119}
120
121define void @combine_metadata_dominance6(ptr %p) {
122; CHECK-LABEL: define void @combine_metadata_dominance6
123; CHECK-SAME: (ptr [[P:%.*]]) {
124; CHECK-NEXT:  entry:
125; CHECK-NEXT:    br label [[BB1:%.*]]
126; CHECK:       bb1:
127; CHECK-NEXT:    [[A:%.*]] = load ptr, ptr [[P]], align 8, !align !2, !noundef !0
128; CHECK-NEXT:    store i32 0, ptr [[A]], align 4
129; CHECK-NEXT:    ret void
130;
131entry:
132  %a = load ptr, ptr %p, !align !2, !noundef !1
133  br label %bb1
134
135bb1:
136  %b = load ptr, ptr %p, !align !3
137  store i32 0, ptr %a
138  store i32 0, ptr %b
139  ret void
140}
141
142!0 = !{}
143!1 = !{}
144!2 = !{i64 8}
145!3 = !{i64 4}
146;.
147; CHECK: attributes #[[ATTR0:[0-9]+]] = { memory(read) }
148;.
149; CHECK: [[META0:![0-9]+]] = !{}
150; CHECK: [[META1:![0-9]+]] = !{i64 4}
151; CHECK: [[META2:![0-9]+]] = !{i64 8}
152;.
153