Skip to content

Commit 0c64e1b

Browse files
martin-finkmelver
authored andcommitted
[SelectionDAG] Add pcsections recursively on SDNode values
When adding pcsections to SDNodes, recursively add them to all values of the node as well. Reviewed By: melver Differential Revision: https://reviews.llvm.org/D141048
1 parent 719a728 commit 0c64e1b

File tree

4 files changed

+258
-63
lines changed

4 files changed

+258
-63
lines changed

llvm/include/llvm/CodeGen/SelectionDAG.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2263,7 +2263,8 @@ class SelectionDAG {
22632263
}
22642264
/// Set PCSections to be associated with Node.
22652265
void addPCSections(const SDNode *Node, MDNode *MD) {
2266-
SDEI[Node].PCSections = MD;
2266+
SmallPtrSet<const llvm::SDNode *, 32> Visited;
2267+
addPCSections(Node, MD, Visited);
22672268
}
22682269
/// Return PCSections associated with Node, or nullptr if none exists.
22692270
MDNode *getPCSections(const SDNode *Node) const {
@@ -2341,6 +2342,10 @@ class SelectionDAG {
23412342
SDNode *FindNodeOrInsertPos(const FoldingSetNodeID &ID, const SDLoc &DL,
23422343
void *&InsertPos);
23432344

2345+
/// Recursively set PCSections to be associated with Node and all its values.
2346+
void addPCSections(const SDNode *Node, MDNode *MD,
2347+
SmallPtrSet<const llvm::SDNode *, 32> &Visited);
2348+
23442349
/// Maps to auto-CSE operations.
23452350
std::vector<CondCodeSDNode*> CondCodeNodes;
23462351

llvm/lib/CodeGen/SelectionDAG/SelectionDAG.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1363,6 +1363,19 @@ SDNode *SelectionDAG::FindNodeOrInsertPos(const FoldingSetNodeID &ID,
13631363
return N;
13641364
}
13651365

1366+
void SelectionDAG::addPCSections(
1367+
const SDNode *Node, MDNode *MD,
1368+
SmallPtrSet<const llvm::SDNode *, 32> &Visited) {
1369+
// If we've been here before, return now.
1370+
if (!Visited.insert(Node).second)
1371+
return;
1372+
1373+
SDEI[Node].PCSections = MD;
1374+
1375+
for (const SDValue &Op : Node->op_values())
1376+
addPCSections(Op.getNode(), MD, Visited);
1377+
}
1378+
13661379
void SelectionDAG::clear() {
13671380
allnodes_clear();
13681381
OperandRecycler.clear(OperandAllocator);

llvm/test/CodeGen/AArch64/pcsections.ll

Lines changed: 154 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
; RUN: llc -O1 < %s | FileCheck %s --check-prefixes=CHECK,CHECK-OPT,DEFCM
33
; RUN: llc -O2 < %s | FileCheck %s --check-prefixes=CHECK,CHECK-OPT,DEFCM
44
; RUN: llc -O3 < %s | FileCheck %s --check-prefixes=CHECK,CHECK-OPT,DEFCM
5-
; RUN: llc -O1 -code-model=large < %s | FileCheck %s --check-prefixes=CHECK,CHECK-OPT,LARGE
5+
; RUN: llc -O1 -code-model=large < %s | FileCheck %s --check-prefixes=CHECK,LARGE
66

77
target triple = "aarch64-unknown-linux-gnu"
88

@@ -14,41 +14,108 @@ define i64 @multiple() !pcsections !0 {
1414
; CHECK: .Lfunc_begin0:
1515
; CHECK: // %bb.0: // %entry
1616
; CHECK: .Lpcsection0:
17+
; --
18+
; LARGE-NEXT: movz
19+
; LARGE: .Lpcsection1:
20+
; LARGE-NEXT: movk
21+
; LARGE: .Lpcsection2:
22+
; LARGE-NEXT: movk
23+
; LARGE: .Lpcsection3:
24+
; LARGE-NEXT: movk
25+
; LARGE: .Lpcsection4:
26+
; --
1727
; CHECK-NEXT: ldr
1828
; CHECK-NEXT: ret
1929
; CHECK: .section section_no_aux,"awo",@progbits,.text
20-
; CHECK-NEXT: .Lpcsection_base0:
30+
; --
31+
; DEFCM-NEXT: .Lpcsection_base0:
2132
; DEFCM-NEXT: .word .Lfunc_begin0-.Lpcsection_base0
22-
; LARGE-NEXT: .xword .Lfunc_begin0-.Lpcsection_base0
23-
; CHECK-NEXT: .word .Lfunc_end0-.Lfunc_begin0
24-
; CHECK-NEXT: .section section_aux_42,"awo",@progbits,.text
25-
; CHECK-NEXT: .Lpcsection_base1:
33+
; DEFCM-NEXT: .word .Lfunc_end0-.Lfunc_begin0
34+
; DEFCM-NEXT: .section section_aux_42,"awo",@progbits,.text
35+
; DEFCM-NEXT: .Lpcsection_base1:
2636
; DEFCM-NEXT: .word .Lpcsection0-.Lpcsection_base1
27-
; LARGE-NEXT: .xword .Lpcsection0-.Lpcsection_base1
28-
; CHECK-NEXT: .word 42
29-
; CHECK-NEXT: .section section_aux_21264,"awo",@progbits,.text
30-
; CHECK-NEXT: .Lpcsection_base2:
37+
; DEFCM-NEXT: .word 42
38+
; DEFCM-NEXT: .section section_aux_21264,"awo",@progbits,.text
39+
; DEFCM-NEXT: .Lpcsection_base2:
3140
; DEFCM-NEXT: .word .Lpcsection0-.Lpcsection_base2
32-
; LARGE-NEXT: .xword .Lpcsection0-.Lpcsection_base2
33-
; CHECK-NEXT: .word 21264
34-
; CHECK-NEXT: .text
41+
; DEFCM-NEXT: .word 21264
42+
; --
43+
; LARGE-NEXT: .Lpcsection_base0:
44+
; LARGE-NEXT: .xword .Lfunc_begin0-.Lpcsection_base0
45+
; LARGE-NEXT: .word .Lfunc_end0-.Lfunc_begin0
46+
; LARGE-NEXT: .section section_aux_42,"awo",@progbits,.text
47+
; LARGE-NEXT: .Lpcsection_base1:
48+
; LARGE-NEXT: .xword .Lpcsection0-.Lpcsection_base1
49+
; LARGE-NEXT: .Lpcsection_base2:
50+
; LARGE-NEXT: .xword .Lpcsection1-.Lpcsection_base2
51+
; LARGE-NEXT: .Lpcsection_base3:
52+
; LARGE-NEXT: .xword .Lpcsection2-.Lpcsection_base3
53+
; LARGE-NEXT: .Lpcsection_base4:
54+
; LARGE-NEXT: .xword .Lpcsection3-.Lpcsection_base4
55+
; LARGE-NEXT: .Lpcsection_base5:
56+
; LARGE-NEXT: .xword .Lpcsection4-.Lpcsection_base5
57+
; LARGE-NEXT: .word 42
58+
; LARGE-NEXT: .section section_aux_21264,"awo",@progbits,.text
59+
; LARGE-NEXT: .Lpcsection_base6:
60+
; LARGE-NEXT: .xword .Lpcsection0-.Lpcsection_base6
61+
; LARGE-NEXT: .Lpcsection_base7:
62+
; LARGE-NEXT: .xword .Lpcsection1-.Lpcsection_base7
63+
; LARGE-NEXT: .Lpcsection_base8:
64+
; LARGE-NEXT: .xword .Lpcsection2-.Lpcsection_base8
65+
; LARGE-NEXT: .Lpcsection_base9:
66+
; LARGE-NEXT: .xword .Lpcsection3-.Lpcsection_base9
67+
; LARGE-NEXT: .Lpcsection_base10:
68+
; LARGE-NEXT: .xword .Lpcsection4-.Lpcsection_base10
69+
; LARGE-NEXT: .word 21264
70+
; --
71+
; CHECK-NEXT: .text
3572
entry:
3673
%0 = load i64, ptr @bar, align 8, !pcsections !1
3774
ret i64 %0
3875
}
3976

4077
define i64 @test_simple_atomic() {
4178
; CHECK-LABEL: test_simple_atomic:
42-
; CHECK: .Lpcsection1:
43-
; CHECK-NEXT: ldr
44-
; CHECK-NOT: .Lpcsection2
45-
; CHECK: ldr
79+
; --
80+
; DEFCM: .Lpcsection1:
81+
; DEFCM-NEXT: ldr
82+
; DEFCM-NOT: .Lpcsection2
83+
; DEFCM: ldr
84+
; --
85+
; LARGE: .Lpcsection5:
86+
; LARGE-NEXT: movz
87+
; LARGE-NEXT: movz
88+
; LARGE: .Lpcsection6:
89+
; LARGE-NEXT: movk
90+
; LARGE-NEXT: movk
91+
; LARGE: .Lpcsection7:
92+
; LARGE-NEXT: movk
93+
; LARGE-NEXT: movk
94+
; LARGE: .Lpcsection8:
95+
; LARGE-NEXT: movk
96+
; LARGE-NEXT: movk
97+
; LARGE: .Lpcsection9:
98+
; LARGE-NEXT: ldr
99+
; LARGE-NEXT: ldr
100+
; --
46101
; CHECK: add
47102
; CHECK-NEXT: ret
48103
; CHECK: .section section_no_aux,"awo",@progbits,.text
49-
; CHECK-NEXT: .Lpcsection_base3:
104+
; --
105+
; DEFCM-NEXT: .Lpcsection_base3:
50106
; DEFCM-NEXT: .word .Lpcsection1-.Lpcsection_base3
51-
; LARGE-NEXT: .xword .Lpcsection1-.Lpcsection_base3
107+
; --
108+
; LARGE-NEXT: .Lpcsection_base11:
109+
; LARGE-NEXT: .xword .Lpcsection5-.Lpcsection_base11
110+
; LARGE-NEXT: .Lpcsection_base12:
111+
; LARGE-NEXT: .xword .Lpcsection6-.Lpcsection_base12
112+
; LARGE-NEXT: .Lpcsection_base13:
113+
; LARGE-NEXT: .xword .Lpcsection7-.Lpcsection_base13
114+
; LARGE-NEXT: .Lpcsection_base14:
115+
; LARGE-NEXT: .xword .Lpcsection8-.Lpcsection_base14
116+
; LARGE-NEXT: .Lpcsection_base15:
117+
; LARGE-NEXT: .xword .Lpcsection9-.Lpcsection_base15
118+
; --
52119
; CHECK-NEXT: .text
53120
entry:
54121
%0 = load atomic i64, ptr @foo monotonic, align 8, !pcsections !0
@@ -84,23 +151,78 @@ define i64 @test_complex_atomic() {
84151
; CHECK-UNOPT: .Lpcsection13:
85152
; CHECK-UNOPT-NEXT: b
86153
; ---
154+
; LARGE: .Lpcsection10:
155+
; LARGE-NEXT: movz
156+
; LARGE-NEXT: .Lpcsection11:
157+
; LARGE-NEXT: movk
158+
; LARGE-NEXT: .Lpcsection12:
159+
; LARGE-NEXT: movk
160+
; LARGE-NEXT: .Lpcsection13:
161+
; LARGE-NEXT: movk
162+
; LARGE: .Lpcsection14:
163+
; LARGE-NEXT: ldxr
164+
; LARGE-NEXT: .Lpcsection15:
165+
; LARGE-NEXT: add
166+
; LARGE-NEXT: .Lpcsection16:
167+
; LARGE-NEXT: stxr
168+
; LARGE-NEXT: .Lpcsection17:
169+
; LARGE-NEXT: cbnz
170+
; ---
87171
; CHECK-NOT: .Lpcsection
88172
; CHECK: ldr
89173
; CHECK: ret
90174
; CHECK: .section section_no_aux,"awo",@progbits,.text
91-
; CHECK-NEXT: .Lpcsection_base4:
92-
; DEFCM-NEXT: .word .Lpcsection2-.Lpcsection_base4
93-
; LARGE-NEXT: .xword .Lpcsection2-.Lpcsection_base4
94-
; CHECK-NEXT: .Lpcsection_base5:
95-
; DEFCM-NEXT: .word .Lpcsection3-.Lpcsection_base5
96-
; LARGE-NEXT: .xword .Lpcsection3-.Lpcsection_base5
97-
; CHECK-NEXT: .Lpcsection_base6:
98-
; DEFCM-NEXT: .word .Lpcsection4-.Lpcsection_base6
99-
; LARGE-NEXT: .xword .Lpcsection4-.Lpcsection_base6
100-
; CHECK-NEXT: .Lpcsection_base7:
101-
; DEFCM-NEXT: .word .Lpcsection5-.Lpcsection_base7
102-
; LARGE-NEXT: .xword .Lpcsection5-.Lpcsection_base7
103-
; CHECK-UNOPT: .word .Lpcsection13-.Lpcsection_base15
175+
; ---
176+
; CHECK-OPT-NEXT: .Lpcsection_base4:
177+
; CHECK-OPT-NEXT: .word .Lpcsection2-.Lpcsection_base4
178+
; CHECK-OPT-NEXT: .Lpcsection_base5:
179+
; CHECK-OPT-NEXT: .word .Lpcsection3-.Lpcsection_base5
180+
; CHECK-OPT-NEXT: .Lpcsection_base6:
181+
; CHECK-OPT-NEXT: .word .Lpcsection4-.Lpcsection_base6
182+
; CHECK-OPT-NEXT: .Lpcsection_base7:
183+
; CHECK-OPT-NEXT: .word .Lpcsection5-.Lpcsection_base7
184+
; ---
185+
; CHECK-UNOPT-NEXT: .Lpcsection_base4:
186+
; CHECK-UNOPT-NEXT: .word .Lpcsection2-.Lpcsection_base4
187+
; CHECK-UNOPT-NEXT: .Lpcsection_base5:
188+
; CHECK-UNOPT-NEXT: .word .Lpcsection3-.Lpcsection_base5
189+
; CHECK-UNOPT-NEXT: .Lpcsection_base6:
190+
; CHECK-UNOPT-NEXT: .word .Lpcsection4-.Lpcsection_base6
191+
; CHECK-UNOPT-NEXT: .Lpcsection_base7:
192+
; CHECK-UNOPT-NEXT: .word .Lpcsection5-.Lpcsection_base7
193+
; CHECK-UNOPT-NEXT: .Lpcsection_base8:
194+
; CHECK-UNOPT-NEXT: .word .Lpcsection6-.Lpcsection_base8
195+
; CHECK-UNOPT-NEXT: .Lpcsection_base9:
196+
; CHECK-UNOPT-NEXT: .word .Lpcsection7-.Lpcsection_base9
197+
; CHECK-UNOPT-NEXT: .Lpcsection_base10:
198+
; CHECK-UNOPT-NEXT: .word .Lpcsection8-.Lpcsection_base10
199+
; CHECK-UNOPT-NEXT: .Lpcsection_base11:
200+
; CHECK-UNOPT-NEXT: .word .Lpcsection9-.Lpcsection_base11
201+
; CHECK-UNOPT-NEXT: .Lpcsection_base12:
202+
; CHECK-UNOPT-NEXT: .word .Lpcsection10-.Lpcsection_base12
203+
; CHECK-UNOPT-NEXT: .Lpcsection_base13:
204+
; CHECK-UNOPT-NEXT: .word .Lpcsection11-.Lpcsection_base13
205+
; CHECK-UNOPT-NEXT: .Lpcsection_base14:
206+
; CHECK-UNOPT-NEXT: .word .Lpcsection12-.Lpcsection_base14
207+
; CHECK-UNOPT-NEXT: .Lpcsection_base15:
208+
; CHECK-UNOPT-NEXT: .word .Lpcsection13-.Lpcsection_base15
209+
; ---
210+
; LARGE-NEXT: .Lpcsection_base16:
211+
; LARGE-NEXT: .xword .Lpcsection10-.Lpcsection_base16
212+
; LARGE-NEXT: .Lpcsection_base17:
213+
; LARGE-NEXT: .xword .Lpcsection11-.Lpcsection_base17
214+
; LARGE-NEXT: .Lpcsection_base18:
215+
; LARGE-NEXT: .xword .Lpcsection12-.Lpcsection_base18
216+
; LARGE-NEXT: .Lpcsection_base19:
217+
; LARGE-NEXT: .xword .Lpcsection13-.Lpcsection_base19
218+
; LARGE-NEXT: .Lpcsection_base20:
219+
; LARGE-NEXT: .xword .Lpcsection14-.Lpcsection_base20
220+
; LARGE-NEXT: .Lpcsection_base21:
221+
; LARGE-NEXT: .xword .Lpcsection15-.Lpcsection_base21
222+
; LARGE-NEXT: .Lpcsection_base22:
223+
; LARGE-NEXT: .xword .Lpcsection16-.Lpcsection_base22
224+
; LARGE-NEXT: .Lpcsection_base23:
225+
; LARGE-NEXT: .xword .Lpcsection17-.Lpcsection_base23
104226
; CHECK-NEXT: .text
105227
entry:
106228
%0 = atomicrmw add ptr @foo, i64 1 monotonic, align 8, !pcsections !0

0 commit comments

Comments
 (0)