[Clang] ensure mangled names are valid identifiers before being suggested in ifunc...
[llvm-project.git] / llvm / test / Transforms / InstCombine / load-combine-metadata-dominance.ll
blob13dfc4a59877a2e14dd61bdda6e2858836384b8c
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
4 target datalayout = "e-m:e-p:64:64:64-i64:64-f80:128-n8:16:32:64-S128"
6 ; Check that nonnull metadata is not propagated from dominating load.
7 define 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
17 entry:
18   %a = load ptr, ptr %p, !nonnull !0
19   br label %bb1
21 bb1:
22   %b = load ptr, ptr %p
23   store i32 0, ptr %a
24   store i32 0, ptr %b
25   ret void
28 declare i32 @use(ptr, i32) readonly
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.
32 define 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
44 entry:
45   %a = load ptr, ptr %p
46   br i1 %c1, label %bb1, label %bb2
48 bb1:
49   %b = load ptr, ptr %p, !nonnull !0
50   store i32 0, ptr %a
51   store i32 0, ptr %b
52   ret void
54 bb2:
55   ret void
58 define 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
68 entry:
69   %a = load ptr, ptr %p, !nonnull !0, !noundef !1
70   br label %bb1
72 bb1:
73   %b = load ptr, ptr %p
74   store i32 0, ptr %a
75   store i32 0, ptr %b
76   ret void
79 define 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
89 entry:
90   %a = load ptr, ptr %p, !nonnull !0
91   br label %bb1
93 bb1:
94   %b = load ptr, ptr %p, !noundef !1
95   store i32 0, ptr %a
96   store i32 0, ptr %b
97   ret void
100 define 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
110 entry:
111   %a = load ptr, ptr %p, !align !2
112   br label %bb1
114 bb1:
115   %b = load ptr, ptr %p, !align !3
116   store i32 0, ptr %a
117   store i32 0, ptr %b
118   ret void
121 define 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
131 entry:
132   %a = load ptr, ptr %p, !align !2, !noundef !1
133   br label %bb1
135 bb1:
136   %b = load ptr, ptr %p, !align !3
137   store i32 0, ptr %a
138   store i32 0, ptr %b
139   ret void
142 !0 = !{}
143 !1 = !{}
144 !2 = !{i64 8}
145 !3 = !{i64 4}
147 ; CHECK: attributes #[[ATTR0:[0-9]+]] = { memory(read) }
149 ; CHECK: [[META0:![0-9]+]] = !{}
150 ; CHECK: [[META1:![0-9]+]] = !{i64 4}
151 ; CHECK: [[META2:![0-9]+]] = !{i64 8}