Skip to content

Commit bb27916

Browse files
authored
[LAA] Tweak debug output for UTC stability (#140764)
UpdateTestChecks has a make_analyzer_generalizer to replace pointer addressess from the debug output of LAA with a pattern, which is an acceptable solution when there is one RUN line. However, when there are multiple RUN lines with a common pattern, UTC fails to recognize common output due to mismatched pointer addresses. Instead of hacking UTC scrub the output before comparing the outputs from the different RUN lines, fix the issue once and for all by making LAA not output unstable pointer addresses in the first place. The removal of the now-dead make_analyzer_generalizer is left as a non-trivial exercise for a follow-up.
1 parent bdc1296 commit bb27916

29 files changed

+658
-482
lines changed

llvm/lib/Analysis/LoopAccessAnalysis.cpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -591,20 +591,29 @@ bool RuntimePointerChecking::needsChecking(unsigned I, unsigned J) const {
591591
return PointerI.AliasSetId == PointerJ.AliasSetId;
592592
}
593593

594+
/// Assign each RuntimeCheckingPtrGroup pointer an index for stable UTC output.
595+
static DenseMap<const RuntimeCheckingPtrGroup *, unsigned>
596+
getPtrToIdxMap(ArrayRef<RuntimeCheckingPtrGroup> CheckingGroups) {
597+
DenseMap<const RuntimeCheckingPtrGroup *, unsigned> PtrIndices;
598+
for (const auto &[Idx, CG] : enumerate(CheckingGroups))
599+
PtrIndices[&CG] = Idx;
600+
return PtrIndices;
601+
}
602+
594603
void RuntimePointerChecking::printChecks(
595604
raw_ostream &OS, const SmallVectorImpl<RuntimePointerCheck> &Checks,
596605
unsigned Depth) const {
597606
unsigned N = 0;
607+
auto PtrIndices = getPtrToIdxMap(CheckingGroups);
598608
for (const auto &[Check1, Check2] : Checks) {
599609
const auto &First = Check1->Members, &Second = Check2->Members;
600-
601610
OS.indent(Depth) << "Check " << N++ << ":\n";
602-
603-
OS.indent(Depth + 2) << "Comparing group (" << Check1 << "):\n";
611+
OS.indent(Depth + 2) << "Comparing group GRP" << PtrIndices.at(Check1)
612+
<< ":\n";
604613
for (unsigned K : First)
605614
OS.indent(Depth + 2) << *Pointers[K].PointerValue << "\n";
606-
607-
OS.indent(Depth + 2) << "Against group (" << Check2 << "):\n";
615+
OS.indent(Depth + 2) << "Against group GRP" << PtrIndices.at(Check2)
616+
<< ":\n";
608617
for (unsigned K : Second)
609618
OS.indent(Depth + 2) << *Pointers[K].PointerValue << "\n";
610619
}
@@ -616,8 +625,9 @@ void RuntimePointerChecking::print(raw_ostream &OS, unsigned Depth) const {
616625
printChecks(OS, Checks, Depth);
617626

618627
OS.indent(Depth) << "Grouped accesses:\n";
628+
auto PtrIndices = getPtrToIdxMap(CheckingGroups);
619629
for (const auto &CG : CheckingGroups) {
620-
OS.indent(Depth + 2) << "Group " << &CG << ":\n";
630+
OS.indent(Depth + 2) << "Group GRP" << PtrIndices.at(&CG) << ":\n";
621631
OS.indent(Depth + 4) << "(Low: " << *CG.Low << " High: " << *CG.High
622632
<< ")\n";
623633
for (unsigned Member : CG.Members) {

llvm/test/Analysis/LoopAccessAnalysis/different-access-types-rt-checks.ll

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,16 @@ define void @loads_of_same_pointer_with_different_sizes1(ptr %A, ptr %B, i64 %N)
1010
; CHECK-NEXT: Dependences:
1111
; CHECK-NEXT: Run-time memory checks:
1212
; CHECK-NEXT: Check 0:
13-
; CHECK-NEXT: Comparing group ([[GRP1:0x[0-9a-f]+]]):
13+
; CHECK-NEXT: Comparing group GRP0:
1414
; CHECK-NEXT: %gep.B = getelementptr inbounds i32, ptr %B, i64 %iv
15-
; CHECK-NEXT: Against group ([[GRP2:0x[0-9a-f]+]]):
15+
; CHECK-NEXT: Against group GRP1:
1616
; CHECK-NEXT: %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv
1717
; CHECK-NEXT: %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv
1818
; CHECK-NEXT: Grouped accesses:
19-
; CHECK-NEXT: Group [[GRP1]]:
19+
; CHECK-NEXT: Group GRP0:
2020
; CHECK-NEXT: (Low: %B High: ((4 * %N) + %B))
2121
; CHECK-NEXT: Member: {%B,+,4}<nuw><%loop>
22-
; CHECK-NEXT: Group [[GRP2]]:
22+
; CHECK-NEXT: Group GRP1:
2323
; CHECK-NEXT: (Low: %A High: (3 + %N + %A))
2424
; CHECK-NEXT: Member: {%A,+,1}<nuw><%loop>
2525
; CHECK-NEXT: Member: {%A,+,1}<nuw><%loop>
@@ -58,16 +58,16 @@ define void @loads_of_same_pointer_with_different_sizes2(ptr %A, ptr %B, i64 %N)
5858
; CHECK-NEXT: Dependences:
5959
; CHECK-NEXT: Run-time memory checks:
6060
; CHECK-NEXT: Check 0:
61-
; CHECK-NEXT: Comparing group ([[GRP3:0x[0-9a-f]+]]):
61+
; CHECK-NEXT: Comparing group GRP0:
6262
; CHECK-NEXT: %gep.B = getelementptr inbounds i32, ptr %B, i64 %iv
63-
; CHECK-NEXT: Against group ([[GRP4:0x[0-9a-f]+]]):
63+
; CHECK-NEXT: Against group GRP1:
6464
; CHECK-NEXT: %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv
6565
; CHECK-NEXT: %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv
6666
; CHECK-NEXT: Grouped accesses:
67-
; CHECK-NEXT: Group [[GRP3]]:
67+
; CHECK-NEXT: Group GRP0:
6868
; CHECK-NEXT: (Low: %B High: ((4 * %N) + %B))
6969
; CHECK-NEXT: Member: {%B,+,4}<nuw><%loop>
70-
; CHECK-NEXT: Group [[GRP4]]:
70+
; CHECK-NEXT: Group GRP1:
7171
; CHECK-NEXT: (Low: %A High: (3 + %N + %A))
7272
; CHECK-NEXT: Member: {%A,+,1}<nuw><%loop>
7373
; CHECK-NEXT: Member: {%A,+,1}<nuw><%loop>
@@ -106,41 +106,41 @@ define void @loads_of_same_pointer_with_different_sizes_retry_with_runtime_check
106106
; CHECK-NEXT: Dependences:
107107
; CHECK-NEXT: Run-time memory checks:
108108
; CHECK-NEXT: Check 0:
109-
; CHECK-NEXT: Comparing group ([[GRP5:0x[0-9a-f]+]]):
109+
; CHECK-NEXT: Comparing group GRP0:
110110
; CHECK-NEXT: %gep.B.iv = getelementptr inbounds i32, ptr %B, i64 %iv
111-
; CHECK-NEXT: Against group ([[GRP6:0x[0-9a-f]+]]):
111+
; CHECK-NEXT: Against group GRP1:
112112
; CHECK-NEXT: %gep.B.inc = getelementptr inbounds i32, ptr %B, i64 %inc
113113
; CHECK-NEXT: Check 1:
114-
; CHECK-NEXT: Comparing group ([[GRP5]]):
114+
; CHECK-NEXT: Comparing group GRP0:
115115
; CHECK-NEXT: %gep.B.iv = getelementptr inbounds i32, ptr %B, i64 %iv
116-
; CHECK-NEXT: Against group ([[GRP7:0x[0-9a-f]+]]):
116+
; CHECK-NEXT: Against group GRP2:
117117
; CHECK-NEXT: %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv
118118
; CHECK-NEXT: Check 2:
119-
; CHECK-NEXT: Comparing group ([[GRP5]]):
119+
; CHECK-NEXT: Comparing group GRP0:
120120
; CHECK-NEXT: %gep.B.iv = getelementptr inbounds i32, ptr %B, i64 %iv
121-
; CHECK-NEXT: Against group ([[GRP8:0x[0-9a-f]+]]):
121+
; CHECK-NEXT: Against group GRP3:
122122
; CHECK-NEXT: %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv
123123
; CHECK-NEXT: Check 3:
124-
; CHECK-NEXT: Comparing group ([[GRP6]]):
124+
; CHECK-NEXT: Comparing group GRP1:
125125
; CHECK-NEXT: %gep.B.inc = getelementptr inbounds i32, ptr %B, i64 %inc
126-
; CHECK-NEXT: Against group ([[GRP7]]):
126+
; CHECK-NEXT: Against group GRP2:
127127
; CHECK-NEXT: %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv
128128
; CHECK-NEXT: Check 4:
129-
; CHECK-NEXT: Comparing group ([[GRP6]]):
129+
; CHECK-NEXT: Comparing group GRP1:
130130
; CHECK-NEXT: %gep.B.inc = getelementptr inbounds i32, ptr %B, i64 %inc
131-
; CHECK-NEXT: Against group ([[GRP8]]):
131+
; CHECK-NEXT: Against group GRP3:
132132
; CHECK-NEXT: %gep.A = getelementptr inbounds i8, ptr %A, i64 %iv
133133
; CHECK-NEXT: Grouped accesses:
134-
; CHECK-NEXT: Group [[GRP5]]:
134+
; CHECK-NEXT: Group GRP0:
135135
; CHECK-NEXT: (Low: %B High: ((4 * %N) + %B))
136136
; CHECK-NEXT: Member: {%B,+,4}<nuw><%loop>
137-
; CHECK-NEXT: Group [[GRP6]]:
137+
; CHECK-NEXT: Group GRP1:
138138
; CHECK-NEXT: (Low: ((4 * %off) + %B) High: ((4 * %N) + (4 * %off) + %B))
139139
; CHECK-NEXT: Member: {((4 * %off) + %B),+,4}<%loop>
140-
; CHECK-NEXT: Group [[GRP7]]:
140+
; CHECK-NEXT: Group GRP2:
141141
; CHECK-NEXT: (Low: %A High: (%N + %A))
142142
; CHECK-NEXT: Member: {%A,+,1}<nuw><%loop>
143-
; CHECK-NEXT: Group [[GRP8]]:
143+
; CHECK-NEXT: Group GRP3:
144144
; CHECK-NEXT: (Low: %A High: (3 + %N + %A))
145145
; CHECK-NEXT: Member: {%A,+,1}<nuw><%loop>
146146
; CHECK-EMPTY:

llvm/test/Analysis/LoopAccessAnalysis/early-exit-runtime-checks.ll

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ define void @all_exits_dominate_latch_countable_exits_at_most_500_iterations_kno
88
; CHECK-NEXT: Dependences:
99
; CHECK-NEXT: Run-time memory checks:
1010
; CHECK-NEXT: Check 0:
11-
; CHECK-NEXT: Comparing group ([[GRP1:0x[0-9a-f]+]]):
11+
; CHECK-NEXT: Comparing group GRP0:
1212
; CHECK-NEXT: %gep.B = getelementptr inbounds i32, ptr %B, i64 %iv
13-
; CHECK-NEXT: Against group ([[GRP2:0x[0-9a-f]+]]):
13+
; CHECK-NEXT: Against group GRP1:
1414
; CHECK-NEXT: %gep.A = getelementptr inbounds i32, ptr %A, i64 %iv
1515
; CHECK-NEXT: Grouped accesses:
16-
; CHECK-NEXT: Group [[GRP1]]:
16+
; CHECK-NEXT: Group GRP0:
1717
; CHECK-NEXT: (Low: %B High: (2000 + %B)<nuw>)
1818
; CHECK-NEXT: Member: {%B,+,4}<nuw><%loop.header>
19-
; CHECK-NEXT: Group [[GRP2]]:
19+
; CHECK-NEXT: Group GRP1:
2020
; CHECK-NEXT: (Low: %A High: (2000 + %A)<nuw>)
2121
; CHECK-NEXT: Member: {%A,+,4}<nuw><%loop.header>
2222
; CHECK-EMPTY:
@@ -66,15 +66,15 @@ define void @all_exits_dominate_latch_countable_exits_at_most_500_iterations_not
6666
; CHECK-NEXT: Dependences:
6767
; CHECK-NEXT: Run-time memory checks:
6868
; CHECK-NEXT: Check 0:
69-
; CHECK-NEXT: Comparing group ([[GRP3:0x[0-9a-f]+]]):
69+
; CHECK-NEXT: Comparing group GRP0:
7070
; CHECK-NEXT: %gep.B = getelementptr inbounds i32, ptr %B, i64 %iv
71-
; CHECK-NEXT: Against group ([[GRP4:0x[0-9a-f]+]]):
71+
; CHECK-NEXT: Against group GRP1:
7272
; CHECK-NEXT: %gep.A = getelementptr inbounds i32, ptr %A, i64 %iv
7373
; CHECK-NEXT: Grouped accesses:
74-
; CHECK-NEXT: Group [[GRP3]]:
74+
; CHECK-NEXT: Group GRP0:
7575
; CHECK-NEXT: (Low: %B High: (2000 + %B))
7676
; CHECK-NEXT: Member: {%B,+,4}<nuw><%loop.header>
77-
; CHECK-NEXT: Group [[GRP4]]:
77+
; CHECK-NEXT: Group GRP1:
7878
; CHECK-NEXT: (Low: %A High: (2000 + %A))
7979
; CHECK-NEXT: Member: {%A,+,4}<nuw><%loop.header>
8080
; CHECK-EMPTY:
@@ -124,15 +124,15 @@ define i32 @all_exits_dominate_latch_countable_exits_at_most_1000_iterations_kno
124124
; CHECK-NEXT: Dependences:
125125
; CHECK-NEXT: Run-time memory checks:
126126
; CHECK-NEXT: Check 0:
127-
; CHECK-NEXT: Comparing group ([[GRP5:0x[0-9a-f]+]]):
127+
; CHECK-NEXT: Comparing group GRP0:
128128
; CHECK-NEXT: %gep.B = getelementptr inbounds i32, ptr %B, i64 %iv
129-
; CHECK-NEXT: Against group ([[GRP6:0x[0-9a-f]+]]):
129+
; CHECK-NEXT: Against group GRP1:
130130
; CHECK-NEXT: %gep.A = getelementptr inbounds i32, ptr %A, i64 %iv
131131
; CHECK-NEXT: Grouped accesses:
132-
; CHECK-NEXT: Group [[GRP5]]:
132+
; CHECK-NEXT: Group GRP0:
133133
; CHECK-NEXT: (Low: %B High: (4004 + %B))
134134
; CHECK-NEXT: Member: {%B,+,4}<nuw><%loop.header>
135-
; CHECK-NEXT: Group [[GRP6]]:
135+
; CHECK-NEXT: Group GRP1:
136136
; CHECK-NEXT: (Low: %A High: (4004 + %A))
137137
; CHECK-NEXT: Member: {%A,+,4}<nuw><%loop.header>
138138
; CHECK-EMPTY:
@@ -182,15 +182,15 @@ define i32 @all_exits_dominate_latch_countable_exits_at_most_1000_iterations_not
182182
; CHECK-NEXT: Dependences:
183183
; CHECK-NEXT: Run-time memory checks:
184184
; CHECK-NEXT: Check 0:
185-
; CHECK-NEXT: Comparing group ([[GRP7:0x[0-9a-f]+]]):
185+
; CHECK-NEXT: Comparing group GRP0:
186186
; CHECK-NEXT: %gep.B = getelementptr inbounds i32, ptr %B, i64 %iv
187-
; CHECK-NEXT: Against group ([[GRP8:0x[0-9a-f]+]]):
187+
; CHECK-NEXT: Against group GRP1:
188188
; CHECK-NEXT: %gep.A = getelementptr inbounds i32, ptr %A, i64 %iv
189189
; CHECK-NEXT: Grouped accesses:
190-
; CHECK-NEXT: Group [[GRP7]]:
190+
; CHECK-NEXT: Group GRP0:
191191
; CHECK-NEXT: (Low: %B High: (4004 + %B))
192192
; CHECK-NEXT: Member: {%B,+,4}<nuw><%loop.header>
193-
; CHECK-NEXT: Group [[GRP8]]:
193+
; CHECK-NEXT: Group GRP1:
194194
; CHECK-NEXT: (Low: %A High: (4004 + %A))
195195
; CHECK-NEXT: Member: {%A,+,4}<nuw><%loop.header>
196196
; CHECK-EMPTY:
@@ -284,15 +284,15 @@ define i32 @b3_does_not_dominate_latch_known_deref(ptr dereferenceable(4000) %A,
284284
; CHECK-NEXT: Dependences:
285285
; CHECK-NEXT: Run-time memory checks:
286286
; CHECK-NEXT: Check 0:
287-
; CHECK-NEXT: Comparing group ([[GRP9:0x[0-9a-f]+]]):
287+
; CHECK-NEXT: Comparing group GRP0:
288288
; CHECK-NEXT: %gep.B = getelementptr inbounds i32, ptr %B, i64 %iv
289-
; CHECK-NEXT: Against group ([[GRP10:0x[0-9a-f]+]]):
289+
; CHECK-NEXT: Against group GRP1:
290290
; CHECK-NEXT: %gep.A = getelementptr inbounds i32, ptr %A, i64 %iv
291291
; CHECK-NEXT: Grouped accesses:
292-
; CHECK-NEXT: Group [[GRP9]]:
292+
; CHECK-NEXT: Group GRP0:
293293
; CHECK-NEXT: (Low: %B High: (4004 + %B))
294294
; CHECK-NEXT: Member: {%B,+,4}<nuw><%loop.header>
295-
; CHECK-NEXT: Group [[GRP10]]:
295+
; CHECK-NEXT: Group GRP1:
296296
; CHECK-NEXT: (Low: %A High: (4004 + %A))
297297
; CHECK-NEXT: Member: {%A,+,4}<nuw><%loop.header>
298298
; CHECK-EMPTY:
@@ -339,15 +339,15 @@ define i32 @b3_does_not_dominate_latch_not_known_deref(ptr %A, ptr %B) {
339339
; CHECK-NEXT: Dependences:
340340
; CHECK-NEXT: Run-time memory checks:
341341
; CHECK-NEXT: Check 0:
342-
; CHECK-NEXT: Comparing group ([[GRP11:0x[0-9a-f]+]]):
342+
; CHECK-NEXT: Comparing group GRP0:
343343
; CHECK-NEXT: %gep.B = getelementptr inbounds i32, ptr %B, i64 %iv
344-
; CHECK-NEXT: Against group ([[GRP12:0x[0-9a-f]+]]):
344+
; CHECK-NEXT: Against group GRP1:
345345
; CHECK-NEXT: %gep.A = getelementptr inbounds i32, ptr %A, i64 %iv
346346
; CHECK-NEXT: Grouped accesses:
347-
; CHECK-NEXT: Group [[GRP11]]:
347+
; CHECK-NEXT: Group GRP0:
348348
; CHECK-NEXT: (Low: %B High: (4004 + %B))
349349
; CHECK-NEXT: Member: {%B,+,4}<nuw><%loop.header>
350-
; CHECK-NEXT: Group [[GRP12]]:
350+
; CHECK-NEXT: Group GRP1:
351351
; CHECK-NEXT: (Low: %A High: (4004 + %A))
352352
; CHECK-NEXT: Member: {%A,+,4}<nuw><%loop.header>
353353
; CHECK-EMPTY:

llvm/test/Analysis/LoopAccessAnalysis/evaluate-at-symbolic-max-backedge-taken-count-may-wrap.ll

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@ define void @runtime_checks_with_symbolic_max_btc_neg_1(ptr %P, ptr %S, i32 %x,
1111
; CHECK-NEXT: Dependences:
1212
; CHECK-NEXT: Run-time memory checks:
1313
; CHECK-NEXT: Check 0:
14-
; CHECK-NEXT: Comparing group ([[GRP1:0x[0-9a-f]+]]):
14+
; CHECK-NEXT: Comparing group GRP0:
1515
; CHECK-NEXT: %gep.iv = getelementptr inbounds i32, ptr %P, i32 %iv
16-
; CHECK-NEXT: Against group ([[GRP2:0x[0-9a-f]+]]):
16+
; CHECK-NEXT: Against group GRP1:
1717
; CHECK-NEXT: ptr %S
1818
; CHECK-NEXT: Grouped accesses:
19-
; CHECK-NEXT: Group [[GRP1]]:
19+
; CHECK-NEXT: Group GRP0:
2020
; CHECK-NEXT: (Low: ((4 * %y) + %P) High: ((4 * %y) + %P))
2121
; CHECK-NEXT: Member: {((4 * %y) + %P),+,4}<%loop>
22-
; CHECK-NEXT: Group [[GRP2]]:
22+
; CHECK-NEXT: Group GRP1:
2323
; CHECK-NEXT: (Low: %S High: (4 + %S))
2424
; CHECK-NEXT: Member: %S
2525
; CHECK-EMPTY:
@@ -52,15 +52,15 @@ define void @runtime_check_with_symbolic_max_btc_neg_2(ptr %P, ptr %S, i32 %x, i
5252
; CHECK-NEXT: Dependences:
5353
; CHECK-NEXT: Run-time memory checks:
5454
; CHECK-NEXT: Check 0:
55-
; CHECK-NEXT: Comparing group ([[GRP3:0x[0-9a-f]+]]):
55+
; CHECK-NEXT: Comparing group GRP0:
5656
; CHECK-NEXT: %gep.iv = getelementptr inbounds i32, ptr %P, i32 %iv
57-
; CHECK-NEXT: Against group ([[GRP4:0x[0-9a-f]+]]):
57+
; CHECK-NEXT: Against group GRP1:
5858
; CHECK-NEXT: ptr %S
5959
; CHECK-NEXT: Grouped accesses:
60-
; CHECK-NEXT: Group [[GRP3]]:
60+
; CHECK-NEXT: Group GRP0:
6161
; CHECK-NEXT: (Low: ((4 * %y) + %P) High: (-4 + (4 * %y) + %P))
6262
; CHECK-NEXT: Member: {((4 * %y) + %P),+,4}<%loop>
63-
; CHECK-NEXT: Group [[GRP4]]:
63+
; CHECK-NEXT: Group GRP1:
6464
; CHECK-NEXT: (Low: %S High: (4 + %S))
6565
; CHECK-NEXT: Member: %S
6666
; CHECK-EMPTY:
@@ -146,15 +146,15 @@ define void @runtime_check_with_symbolic_max_wraps_to_positive_offset(ptr %P, pt
146146
; CHECK-NEXT: Dependences:
147147
; CHECK-NEXT: Run-time memory checks:
148148
; CHECK-NEXT: Check 0:
149-
; CHECK-NEXT: Comparing group ([[GRP5:0x[0-9a-f]+]]):
149+
; CHECK-NEXT: Comparing group GRP0:
150150
; CHECK-NEXT: %gep.iv = getelementptr inbounds i16, ptr %P, i32 %iv
151-
; CHECK-NEXT: Against group ([[GRP6:0x[0-9a-f]+]]):
151+
; CHECK-NEXT: Against group GRP1:
152152
; CHECK-NEXT: ptr %S
153153
; CHECK-NEXT: Grouped accesses:
154-
; CHECK-NEXT: Group [[GRP5]]:
154+
; CHECK-NEXT: Group GRP0:
155155
; CHECK-NEXT: (Low: ((2 * %y) + %P) High: (2 + (2 * %y) + %P))
156156
; CHECK-NEXT: Member: {((2 * %y) + %P),+,2}<%loop>
157-
; CHECK-NEXT: Group [[GRP6]]:
157+
; CHECK-NEXT: Group GRP1:
158158
; CHECK-NEXT: (Low: %S High: (4 + %S))
159159
; CHECK-NEXT: Member: %S
160160
; CHECK-EMPTY:

0 commit comments

Comments
 (0)