xref: /llvm-project/llvm/test/Transforms/Attributor/value-simplify-pointer-info-struct.ll (revision cd3a4c31bc9694d160de54c6a4daa53e152cb463)
1477e8e10SJohannes Doerfert; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes --check-globals
223dafbb1SJohannes Doerfert; RUN: opt -aa-pipeline=basic-aa -passes=attributor -attributor-manifest-internal  -attributor-annotate-decl-cs  -S < %s | FileCheck %s --check-prefixes=CHECK,TUNIT
356be9123SJohannes Doerfert; RUN: opt -aa-pipeline=basic-aa -passes=attributor-cgscc -attributor-manifest-internal  -attributor-annotate-decl-cs -S < %s | FileCheck %s --check-prefixes=CHECK,CGSCC
4477e8e10SJohannes Doerfert;
5477e8e10SJohannes Doerferttarget datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
6477e8e10SJohannes Doerfert
7e1873614SJohannes Doerfert%struct.S = type { i32, double, ptr, i32 }
8477e8e10SJohannes Doerfert
9477e8e10SJohannes Doerfert;    struct S {
10477e8e10SJohannes Doerfert;      int a;
11477e8e10SJohannes Doerfert;      double b;
12477e8e10SJohannes Doerfert;      struct S* c;
13e1873614SJohannes Doerfert;      int written;
14477e8e10SJohannes Doerfert;    };
15477e8e10SJohannes Doerfert;
16477e8e10SJohannes Doerfert;    static const struct S GlobalS = {42, 3.14, 0};
17477e8e10SJohannes Doerfert;
18477e8e10SJohannes Doerfert;    int testOneFieldGlobalS() {
19477e8e10SJohannes Doerfert;      int r = 0;
20477e8e10SJohannes Doerfert;      if (GlobalS.a != 42)
21477e8e10SJohannes Doerfert;        r += 1;
22477e8e10SJohannes Doerfert;      if (GlobalS.b == 3.14)
23477e8e10SJohannes Doerfert;        r += 2;
24477e8e10SJohannes Doerfert;      if (GlobalS.c)
25477e8e10SJohannes Doerfert;        r += 4;
26477e8e10SJohannes Doerfert;      return r;
27477e8e10SJohannes Doerfert;    }
28477e8e10SJohannes Doerfert;
29e1873614SJohannes Doerfert@GlobalS = internal constant %struct.S { i32 42, double 3.140000e+00, ptr null, i32 0 }, align 8
30477e8e10SJohannes Doerfert
3193e51fa4SJohannes Doerfertdeclare void @harmless_use(ptr nocapture readonly) nofree norecurse nosync nounwind readnone willreturn nocallback
3293e51fa4SJohannes Doerfert
33477e8e10SJohannes Doerfert;.
34*cd3a4c31SJohannes Doerfert; CHECK: @GlobalS = internal constant %struct.S { i32 42, double 3.140000e+00, ptr null, i32 0 }, align 8
35477e8e10SJohannes Doerfert;.
36e1873614SJohannes Doerfertdefine i32 @testOneFieldGlobalS(i32 %cmpx) {
37dbbe9b37SJohannes Doerfert; CHECK: Function Attrs: mustprogress nofree norecurse nounwind willreturn memory(none)
38477e8e10SJohannes Doerfert; CHECK-LABEL: define {{[^@]+}}@testOneFieldGlobalS
39e1873614SJohannes Doerfert; CHECK-SAME: (i32 [[CMPX:%.*]]) #[[ATTR1:[0-9]+]] {
40477e8e10SJohannes Doerfert; CHECK-NEXT:  entry:
41e1873614SJohannes Doerfert; CHECK-NEXT:    [[RMW:%.*]] = atomicrmw add ptr getelementptr inbounds ([[STRUCT_S:%.*]], ptr @GlobalS, i32 0, i32 3), i32 1 monotonic, align 4
42e1873614SJohannes Doerfert; CHECK-NEXT:    [[CXI:%.*]] = cmpxchg ptr getelementptr inbounds ([[STRUCT_S]], ptr @GlobalS, i32 0, i32 3), i32 [[CMPX]], i32 7 acq_rel monotonic, align 4
43477e8e10SJohannes Doerfert; CHECK-NEXT:    br label [[IF_END:%.*]]
44477e8e10SJohannes Doerfert; CHECK:       if.then:
45477e8e10SJohannes Doerfert; CHECK-NEXT:    unreachable
46477e8e10SJohannes Doerfert; CHECK:       if.end:
47477e8e10SJohannes Doerfert; CHECK-NEXT:    br label [[IF_THEN2:%.*]]
48477e8e10SJohannes Doerfert; CHECK:       if.then2:
49477e8e10SJohannes Doerfert; CHECK-NEXT:    [[ADD3:%.*]] = add nsw i32 0, 2
50477e8e10SJohannes Doerfert; CHECK-NEXT:    br label [[IF_END4:%.*]]
51477e8e10SJohannes Doerfert; CHECK:       if.end4:
52477e8e10SJohannes Doerfert; CHECK-NEXT:    br label [[IF_END7:%.*]]
53477e8e10SJohannes Doerfert; CHECK:       if.then5:
54477e8e10SJohannes Doerfert; CHECK-NEXT:    unreachable
55477e8e10SJohannes Doerfert; CHECK:       if.end7:
56477e8e10SJohannes Doerfert; CHECK-NEXT:    ret i32 2
57477e8e10SJohannes Doerfert;
58477e8e10SJohannes Doerfertentry:
59477e8e10SJohannes Doerfert  %i = load i32, ptr @GlobalS, align 8
6093e51fa4SJohannes Doerfert  call void @harmless_use(ptr @GlobalS)
61e1873614SJohannes Doerfert  %rmw = atomicrmw add ptr getelementptr inbounds (%struct.S, ptr @GlobalS, i32 0, i32 3), i32 1 monotonic, align 4
62e1873614SJohannes Doerfert  %cxi = cmpxchg ptr getelementptr inbounds (%struct.S, ptr @GlobalS, i32 0, i32 3), i32 %cmpx, i32 7 acq_rel monotonic
63477e8e10SJohannes Doerfert  %cmp = icmp ne i32 %i, 42
64477e8e10SJohannes Doerfert  br i1 %cmp, label %if.then, label %if.end
65477e8e10SJohannes Doerfert
66477e8e10SJohannes Doerfertif.then:                                          ; preds = %entry
67477e8e10SJohannes Doerfert  %add = add nsw i32 0, 1
68477e8e10SJohannes Doerfert  br label %if.end
69477e8e10SJohannes Doerfert
70477e8e10SJohannes Doerfertif.end:                                           ; preds = %if.then, %entry
71477e8e10SJohannes Doerfert  %r.0 = phi i32 [ %add, %if.then ], [ 0, %entry ]
72477e8e10SJohannes Doerfert  %i1 = load double, ptr getelementptr inbounds (%struct.S, ptr @GlobalS, i32 0, i32 1), align 8
73477e8e10SJohannes Doerfert  %cmp1 = fcmp oeq double %i1, 3.140000e+00
74477e8e10SJohannes Doerfert  br i1 %cmp1, label %if.then2, label %if.end4
75477e8e10SJohannes Doerfert
76477e8e10SJohannes Doerfertif.then2:                                         ; preds = %if.end
77477e8e10SJohannes Doerfert  %add3 = add nsw i32 %r.0, 2
78477e8e10SJohannes Doerfert  br label %if.end4
79477e8e10SJohannes Doerfert
80477e8e10SJohannes Doerfertif.end4:                                          ; preds = %if.then2, %if.end
81477e8e10SJohannes Doerfert  %r.1 = phi i32 [ %add3, %if.then2 ], [ %r.0, %if.end ]
82477e8e10SJohannes Doerfert  %i2 = load ptr, ptr getelementptr inbounds (%struct.S, ptr @GlobalS, i32 0, i32 2), align 8
83477e8e10SJohannes Doerfert  %tobool = icmp ne ptr %i2, null
84477e8e10SJohannes Doerfert  br i1 %tobool, label %if.then5, label %if.end7
85477e8e10SJohannes Doerfert
86477e8e10SJohannes Doerfertif.then5:                                         ; preds = %if.end4
87477e8e10SJohannes Doerfert  %add6 = add nsw i32 %r.1, 4
88477e8e10SJohannes Doerfert  br label %if.end7
89477e8e10SJohannes Doerfert
90477e8e10SJohannes Doerfertif.end7:                                          ; preds = %if.then5, %if.end4
91477e8e10SJohannes Doerfert  %r.2 = phi i32 [ %add6, %if.then5 ], [ %r.1, %if.end4 ]
92477e8e10SJohannes Doerfert  ret i32 %r.2
93477e8e10SJohannes Doerfert}
94477e8e10SJohannes Doerfert
95477e8e10SJohannes Doerfertdefine i32 @testOneFieldGlobalS_type_mismatch() {
96dbbe9b37SJohannes Doerfert; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
97477e8e10SJohannes Doerfert; CHECK-LABEL: define {{[^@]+}}@testOneFieldGlobalS_type_mismatch
98e1873614SJohannes Doerfert; CHECK-SAME: () #[[ATTR2:[0-9]+]] {
99477e8e10SJohannes Doerfert; CHECK-NEXT:  entry:
100874c0327SNikita Popov; CHECK-NEXT:    br label [[IF_THEN:%.*]]
101477e8e10SJohannes Doerfert; CHECK:       if.then:
102477e8e10SJohannes Doerfert; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 0, 1
103874c0327SNikita Popov; CHECK-NEXT:    br label [[IF_END:%.*]]
104477e8e10SJohannes Doerfert; CHECK:       if.end:
105874c0327SNikita Popov; CHECK-NEXT:    br label [[IF_END4:%.*]]
106477e8e10SJohannes Doerfert; CHECK:       if.then2:
107874c0327SNikita Popov; CHECK-NEXT:    unreachable
108477e8e10SJohannes Doerfert; CHECK:       if.end4:
109477e8e10SJohannes Doerfert; CHECK-NEXT:    br label [[IF_END7:%.*]]
110477e8e10SJohannes Doerfert; CHECK:       if.then5:
111477e8e10SJohannes Doerfert; CHECK-NEXT:    unreachable
112477e8e10SJohannes Doerfert; CHECK:       if.end7:
113874c0327SNikita Popov; CHECK-NEXT:    ret i32 1
114477e8e10SJohannes Doerfert;
115477e8e10SJohannes Doerfertentry:
116477e8e10SJohannes Doerfert  %i = load double, ptr @GlobalS, align 8
117477e8e10SJohannes Doerfert  %ic = fptosi double %i to i32
118477e8e10SJohannes Doerfert  %cmp = icmp ne i32 %ic, 42
119477e8e10SJohannes Doerfert  br i1 %cmp, label %if.then, label %if.end
120477e8e10SJohannes Doerfert
121477e8e10SJohannes Doerfertif.then:                                          ; preds = %entry
122477e8e10SJohannes Doerfert  %add = add nsw i32 0, 1
123477e8e10SJohannes Doerfert  br label %if.end
124477e8e10SJohannes Doerfert
125477e8e10SJohannes Doerfertif.end:                                           ; preds = %if.then, %entry
126477e8e10SJohannes Doerfert  %r.0 = phi i32 [ %add, %if.then ], [ 0, %entry ]
127477e8e10SJohannes Doerfert  %i1 = load i64, ptr getelementptr inbounds (%struct.S, ptr @GlobalS, i32 0, i32 1), align 8
128477e8e10SJohannes Doerfert  %i1c = sitofp i64 %i1 to double
129477e8e10SJohannes Doerfert  %cmp1 = fcmp oeq double %i1c, 3.140000e+00
130477e8e10SJohannes Doerfert  br i1 %cmp1, label %if.then2, label %if.end4
131477e8e10SJohannes Doerfert
132477e8e10SJohannes Doerfertif.then2:                                         ; preds = %if.end
133477e8e10SJohannes Doerfert  %add3 = add nsw i32 %r.0, 2
134477e8e10SJohannes Doerfert  br label %if.end4
135477e8e10SJohannes Doerfert
136477e8e10SJohannes Doerfertif.end4:                                          ; preds = %if.then2, %if.end
137477e8e10SJohannes Doerfert  %r.1 = phi i32 [ %add3, %if.then2 ], [ %r.0, %if.end ]
138477e8e10SJohannes Doerfert  %i2 = load i64, ptr getelementptr inbounds (%struct.S, ptr @GlobalS, i32 0, i32 2), align 8
139477e8e10SJohannes Doerfert  %i2c = inttoptr i64 %i2 to ptr
140477e8e10SJohannes Doerfert  %tobool = icmp ne ptr %i2c, null
141477e8e10SJohannes Doerfert  br i1 %tobool, label %if.then5, label %if.end7
142477e8e10SJohannes Doerfert
143477e8e10SJohannes Doerfertif.then5:                                         ; preds = %if.end4
144477e8e10SJohannes Doerfert  %add6 = add nsw i32 %r.1, 4
145477e8e10SJohannes Doerfert  br label %if.end7
146477e8e10SJohannes Doerfert
147477e8e10SJohannes Doerfertif.end7:                                          ; preds = %if.then5, %if.end4
148477e8e10SJohannes Doerfert  %r.2 = phi i32 [ %add6, %if.then5 ], [ %r.1, %if.end4 ]
149477e8e10SJohannes Doerfert  ret i32 %r.2
150477e8e10SJohannes Doerfert}
151477e8e10SJohannes Doerfert
152477e8e10SJohannes Doerfertdefine i32 @testOneFieldGlobalS_byte_offset_wrong() {
153dbbe9b37SJohannes Doerfert; CHECK: Function Attrs: mustprogress nofree norecurse nosync nounwind willreturn memory(none)
154477e8e10SJohannes Doerfert; CHECK-LABEL: define {{[^@]+}}@testOneFieldGlobalS_byte_offset_wrong
155e1873614SJohannes Doerfert; CHECK-SAME: () #[[ATTR2]] {
156477e8e10SJohannes Doerfert; CHECK-NEXT:  entry:
157874c0327SNikita Popov; CHECK-NEXT:    br label [[IF_THEN:%.*]]
158477e8e10SJohannes Doerfert; CHECK:       if.then:
159477e8e10SJohannes Doerfert; CHECK-NEXT:    [[ADD:%.*]] = add nsw i32 0, 1
160874c0327SNikita Popov; CHECK-NEXT:    br label [[IF_END:%.*]]
161477e8e10SJohannes Doerfert; CHECK:       if.end:
162477e8e10SJohannes Doerfert; CHECK-NEXT:    [[I1:%.*]] = load double, ptr getelementptr (double, ptr @GlobalS, i32 3), align 8
163477e8e10SJohannes Doerfert; CHECK-NEXT:    [[CMP1:%.*]] = fcmp oeq double [[I1]], 3.140000e+00
164477e8e10SJohannes Doerfert; CHECK-NEXT:    br i1 [[CMP1]], label [[IF_THEN2:%.*]], label [[IF_END4:%.*]]
165477e8e10SJohannes Doerfert; CHECK:       if.then2:
166874c0327SNikita Popov; CHECK-NEXT:    [[ADD3:%.*]] = add nsw i32 1, 2
167477e8e10SJohannes Doerfert; CHECK-NEXT:    br label [[IF_END4]]
168477e8e10SJohannes Doerfert; CHECK:       if.end4:
169874c0327SNikita Popov; CHECK-NEXT:    [[R_1:%.*]] = phi i32 [ [[ADD3]], [[IF_THEN2]] ], [ 1, [[IF_END]] ]
170874c0327SNikita Popov; CHECK-NEXT:    br label [[IF_END7:%.*]]
17102a4fcecSJohannes Doerfert; CHECK:       if.then5:
17202a4fcecSJohannes Doerfert; CHECK-NEXT:    unreachable
173477e8e10SJohannes Doerfert; CHECK:       if.end7:
17402a4fcecSJohannes Doerfert; CHECK-NEXT:    ret i32 [[R_1]]
175477e8e10SJohannes Doerfert;
176477e8e10SJohannes Doerfertentry:
177477e8e10SJohannes Doerfert  %i = load i32, ptr getelementptr (i32, ptr @GlobalS, i32 1), align 8
178477e8e10SJohannes Doerfert  %cmp = icmp ne i32 %i, 42
179477e8e10SJohannes Doerfert  br i1 %cmp, label %if.then, label %if.end
180477e8e10SJohannes Doerfert
181477e8e10SJohannes Doerfertif.then:                                          ; preds = %entry
182477e8e10SJohannes Doerfert  %add = add nsw i32 0, 1
183477e8e10SJohannes Doerfert  br label %if.end
184477e8e10SJohannes Doerfert
185477e8e10SJohannes Doerfertif.end:                                           ; preds = %if.then, %entry
186477e8e10SJohannes Doerfert  %r.0 = phi i32 [ %add, %if.then ], [ 0, %entry ]
187477e8e10SJohannes Doerfert  %i1 = load double, ptr getelementptr (double, ptr @GlobalS, i32 3), align 8
188477e8e10SJohannes Doerfert  %cmp1 = fcmp oeq double %i1, 3.140000e+00
189477e8e10SJohannes Doerfert  br i1 %cmp1, label %if.then2, label %if.end4
190477e8e10SJohannes Doerfert
191477e8e10SJohannes Doerfertif.then2:                                         ; preds = %if.end
192477e8e10SJohannes Doerfert  %add3 = add nsw i32 %r.0, 2
193477e8e10SJohannes Doerfert  br label %if.end4
194477e8e10SJohannes Doerfert
195477e8e10SJohannes Doerfertif.end4:                                          ; preds = %if.then2, %if.end
196477e8e10SJohannes Doerfert  %r.1 = phi i32 [ %add3, %if.then2 ], [ %r.0, %if.end ]
19702a4fcecSJohannes Doerfert  %i2 = load ptr, ptr getelementptr (ptr, ptr @GlobalS, i32 2), align 8
198477e8e10SJohannes Doerfert  %tobool = icmp ne ptr %i2, null
199477e8e10SJohannes Doerfert  br i1 %tobool, label %if.then5, label %if.end7
200477e8e10SJohannes Doerfert
201477e8e10SJohannes Doerfertif.then5:                                         ; preds = %if.end4
202477e8e10SJohannes Doerfert  %add6 = add nsw i32 %r.1, 4
203477e8e10SJohannes Doerfert  br label %if.end7
204477e8e10SJohannes Doerfert
205477e8e10SJohannes Doerfertif.end7:                                          ; preds = %if.then5, %if.end4
206477e8e10SJohannes Doerfert  %r.2 = phi i32 [ %add6, %if.then5 ], [ %r.1, %if.end4 ]
207477e8e10SJohannes Doerfert  ret i32 %r.2
208477e8e10SJohannes Doerfert}
209477e8e10SJohannes Doerfert;.
210304f1d59SNikita Popov; CHECK: attributes #[[ATTR0:[0-9]+]] = { nocallback nofree norecurse nosync nounwind willreturn memory(none) }
211dbbe9b37SJohannes Doerfert; CHECK: attributes #[[ATTR1]] = { mustprogress nofree norecurse nounwind willreturn memory(none) }
212dbbe9b37SJohannes Doerfert; CHECK: attributes #[[ATTR2]] = { mustprogress nofree norecurse nosync nounwind willreturn memory(none) }
213477e8e10SJohannes Doerfert;.
21423333bb6SJohannes Doerfert;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
21556be9123SJohannes Doerfert; CGSCC: {{.*}}
21656be9123SJohannes Doerfert; TUNIT: {{.*}}
217