Skip to content

Commit 50866e8

Browse files
authored
Revert "[AMDGPU] Avoid resource propagation for recursion through multiple functions" (#112013)
Reverts #111004
1 parent b96ebee commit 50866e8

File tree

3 files changed

+7
-294
lines changed

3 files changed

+7
-294
lines changed

llvm/lib/Target/AMDGPU/AMDGPUMCResourceInfo.cpp

Lines changed: 7 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -91,77 +91,13 @@ MCSymbol *MCResourceInfo::getMaxSGPRSymbol(MCContext &OutContext) {
9191
return OutContext.getOrCreateSymbol("amdgpu.max_num_sgpr");
9292
}
9393

94-
// The (partially complete) expression should have no recursion in it. After
95-
// all, we're trying to avoid recursion using this codepath. Returns true if
96-
// Sym is found within Expr without recursing on Expr, false otherwise.
97-
static bool findSymbolInExpr(MCSymbol *Sym, const MCExpr *Expr,
98-
SmallVectorImpl<const MCExpr *> &Exprs,
99-
SmallPtrSetImpl<const MCExpr *> &Visited) {
100-
// Assert if any of the expressions is already visited (i.e., there is
101-
// existing recursion).
102-
if (!Visited.insert(Expr).second)
103-
llvm_unreachable("already visited expression");
104-
105-
switch (Expr->getKind()) {
106-
default:
107-
return false;
108-
case MCExpr::ExprKind::SymbolRef: {
109-
const MCSymbolRefExpr *SymRefExpr = cast<MCSymbolRefExpr>(Expr);
110-
const MCSymbol &SymRef = SymRefExpr->getSymbol();
111-
if (Sym == &SymRef)
112-
return true;
113-
if (SymRef.isVariable())
114-
Exprs.push_back(SymRef.getVariableValue(/*isUsed=*/false));
115-
return false;
116-
}
117-
case MCExpr::ExprKind::Binary: {
118-
const MCBinaryExpr *BExpr = cast<MCBinaryExpr>(Expr);
119-
Exprs.push_back(BExpr->getLHS());
120-
Exprs.push_back(BExpr->getRHS());
121-
return false;
122-
}
123-
case MCExpr::ExprKind::Unary: {
124-
const MCUnaryExpr *UExpr = cast<MCUnaryExpr>(Expr);
125-
Exprs.push_back(UExpr->getSubExpr());
126-
return false;
127-
}
128-
case MCExpr::ExprKind::Target: {
129-
const AMDGPUMCExpr *AGVK = cast<AMDGPUMCExpr>(Expr);
130-
for (const MCExpr *E : AGVK->getArgs())
131-
Exprs.push_back(E);
132-
return false;
133-
}
134-
}
135-
}
136-
137-
// Symbols whose values eventually are used through their defines (i.e.,
138-
// recursive) must be avoided. Do a walk over Expr to see if Sym will occur in
139-
// it. The Expr is an MCExpr given through a callee's equivalent MCSymbol so if
140-
// no recursion is found Sym can be safely assigned to a (sub-)expr which
141-
// contains the symbol Expr is associated with. Returns true if Sym exists
142-
// in Expr or its sub-expressions, false otherwise.
143-
static bool foundRecursiveSymbolDef(MCSymbol *Sym, const MCExpr *Expr) {
144-
SmallVector<const MCExpr *, 8> WorkList;
145-
SmallPtrSet<const MCExpr *, 8> Visited;
146-
WorkList.push_back(Expr);
147-
148-
while (!WorkList.empty()) {
149-
const MCExpr *CurExpr = WorkList.pop_back_val();
150-
if (findSymbolInExpr(Sym, CurExpr, WorkList, Visited))
151-
return true;
152-
}
153-
154-
return false;
155-
}
156-
15794
void MCResourceInfo::assignResourceInfoExpr(
15895
int64_t LocalValue, ResourceInfoKind RIK, AMDGPUMCExpr::VariantKind Kind,
15996
const MachineFunction &MF, const SmallVectorImpl<const Function *> &Callees,
16097
MCContext &OutContext) {
16198
const MCConstantExpr *LocalConstExpr =
16299
MCConstantExpr::create(LocalValue, OutContext);
163100
const MCExpr *SymVal = LocalConstExpr;
164-
MCSymbol *Sym = getSymbol(MF.getName(), RIK, OutContext);
165101
if (!Callees.empty()) {
166102
SmallVector<const MCExpr *, 8> ArgExprs;
167103
// Avoid recursive symbol assignment.
@@ -174,17 +110,11 @@ void MCResourceInfo::assignResourceInfoExpr(
174110
if (!Seen.insert(Callee).second)
175111
continue;
176112
MCSymbol *CalleeValSym = getSymbol(Callee->getName(), RIK, OutContext);
177-
bool CalleeIsVar = CalleeValSym->isVariable();
178-
if (!CalleeIsVar ||
179-
(CalleeIsVar &&
180-
!foundRecursiveSymbolDef(
181-
Sym, CalleeValSym->getVariableValue(/*IsUsed=*/false)))) {
182-
ArgExprs.push_back(MCSymbolRefExpr::create(CalleeValSym, OutContext));
183-
}
113+
ArgExprs.push_back(MCSymbolRefExpr::create(CalleeValSym, OutContext));
184114
}
185-
if (ArgExprs.size() > 1)
186-
SymVal = AMDGPUMCExpr::create(Kind, ArgExprs, OutContext);
115+
SymVal = AMDGPUMCExpr::create(Kind, ArgExprs, OutContext);
187116
}
117+
MCSymbol *Sym = getSymbol(MF.getName(), RIK, OutContext);
188118
Sym->setVariableValue(SymVal);
189119
}
190120

@@ -225,7 +155,6 @@ void MCResourceInfo::gatherResourceInfo(
225155
// The expression for private segment size should be: FRI.PrivateSegmentSize
226156
// + max(FRI.Callees, FRI.CalleeSegmentSize)
227157
SmallVector<const MCExpr *, 8> ArgExprs;
228-
MCSymbol *Sym = getSymbol(MF.getName(), RIK_PrivateSegSize, OutContext);
229158
if (FRI.CalleeSegmentSize)
230159
ArgExprs.push_back(
231160
MCConstantExpr::create(FRI.CalleeSegmentSize, OutContext));
@@ -236,15 +165,9 @@ void MCResourceInfo::gatherResourceInfo(
236165
if (!Seen.insert(Callee).second)
237166
continue;
238167
if (!Callee->isDeclaration()) {
239-
MCSymbol *CalleeValSym =
168+
MCSymbol *calleeValSym =
240169
getSymbol(Callee->getName(), RIK_PrivateSegSize, OutContext);
241-
bool CalleeIsVar = CalleeValSym->isVariable();
242-
if (!CalleeIsVar ||
243-
(CalleeIsVar &&
244-
!foundRecursiveSymbolDef(
245-
Sym, CalleeValSym->getVariableValue(/*IsUsed=*/false)))) {
246-
ArgExprs.push_back(MCSymbolRefExpr::create(CalleeValSym, OutContext));
247-
}
170+
ArgExprs.push_back(MCSymbolRefExpr::create(calleeValSym, OutContext));
248171
}
249172
}
250173
const MCExpr *localConstExpr =
@@ -255,7 +178,8 @@ void MCResourceInfo::gatherResourceInfo(
255178
localConstExpr =
256179
MCBinaryExpr::createAdd(localConstExpr, transitiveExpr, OutContext);
257180
}
258-
Sym->setVariableValue(localConstExpr);
181+
getSymbol(MF.getName(), RIK_PrivateSegSize, OutContext)
182+
->setVariableValue(localConstExpr);
259183
}
260184

261185
auto SetToLocal = [&](int64_t LocalValue, ResourceInfoKind RIK) {

llvm/test/CodeGen/AMDGPU/function-resource-usage.ll

Lines changed: 0 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -481,132 +481,6 @@ define amdgpu_kernel void @usage_direct_recursion(i32 %n) #0 {
481481
ret void
482482
}
483483

484-
; GCN-LABEL: {{^}}multi_stage_recurse2:
485-
; GCN: .set multi_stage_recurse2.num_vgpr, max(41, multi_stage_recurse1.num_vgpr)
486-
; GCN: .set multi_stage_recurse2.num_agpr, max(0, multi_stage_recurse1.num_agpr)
487-
; GCN: .set multi_stage_recurse2.numbered_sgpr, max(34, multi_stage_recurse1.numbered_sgpr)
488-
; GCN: .set multi_stage_recurse2.private_seg_size, 16+(max(multi_stage_recurse1.private_seg_size))
489-
; GCN: .set multi_stage_recurse2.uses_vcc, or(1, multi_stage_recurse1.uses_vcc)
490-
; GCN: .set multi_stage_recurse2.uses_flat_scratch, or(0, multi_stage_recurse1.uses_flat_scratch)
491-
; GCN: .set multi_stage_recurse2.has_dyn_sized_stack, or(0, multi_stage_recurse1.has_dyn_sized_stack)
492-
; GCN: .set multi_stage_recurse2.has_recursion, or(1, multi_stage_recurse1.has_recursion)
493-
; GCN: .set multi_stage_recurse2.has_indirect_call, or(0, multi_stage_recurse1.has_indirect_call)
494-
; GCN: TotalNumSgprs: multi_stage_recurse2.numbered_sgpr+(extrasgprs(multi_stage_recurse2.uses_vcc, multi_stage_recurse2.uses_flat_scratch, 1))
495-
; GCN: NumVgprs: max(41, multi_stage_recurse1.num_vgpr)
496-
; GCN: ScratchSize: 16+(max(multi_stage_recurse1.private_seg_size))
497-
; GCN-LABEL: {{^}}multi_stage_recurse1:
498-
; GCN: .set multi_stage_recurse1.num_vgpr, 41
499-
; GCN: .set multi_stage_recurse1.num_agpr, 0
500-
; GCN: .set multi_stage_recurse1.numbered_sgpr, 34
501-
; GCN: .set multi_stage_recurse1.private_seg_size, 16
502-
; GCN: .set multi_stage_recurse1.uses_vcc, 1
503-
; GCN: .set multi_stage_recurse1.uses_flat_scratch, 0
504-
; GCN: .set multi_stage_recurse1.has_dyn_sized_stack, 0
505-
; GCN: .set multi_stage_recurse1.has_recursion, 1
506-
; GCN: .set multi_stage_recurse1.has_indirect_call, 0
507-
; GCN: TotalNumSgprs: 38
508-
; GCN: NumVgprs: 41
509-
; GCN: ScratchSize: 16
510-
define void @multi_stage_recurse1(i32 %val) #2 {
511-
call void @multi_stage_recurse2(i32 %val)
512-
ret void
513-
}
514-
define void @multi_stage_recurse2(i32 %val) #2 {
515-
call void @multi_stage_recurse1(i32 %val)
516-
ret void
517-
}
518-
519-
; GCN-LABEL: {{^}}usage_multi_stage_recurse:
520-
; GCN: .set usage_multi_stage_recurse.num_vgpr, max(32, multi_stage_recurse1.num_vgpr)
521-
; GCN: .set usage_multi_stage_recurse.num_agpr, max(0, multi_stage_recurse1.num_agpr)
522-
; GCN: .set usage_multi_stage_recurse.numbered_sgpr, max(33, multi_stage_recurse1.numbered_sgpr)
523-
; GCN: .set usage_multi_stage_recurse.private_seg_size, 0+(max(multi_stage_recurse1.private_seg_size))
524-
; GCN: .set usage_multi_stage_recurse.uses_vcc, or(1, multi_stage_recurse1.uses_vcc)
525-
; GCN: .set usage_multi_stage_recurse.uses_flat_scratch, or(1, multi_stage_recurse1.uses_flat_scratch)
526-
; GCN: .set usage_multi_stage_recurse.has_dyn_sized_stack, or(0, multi_stage_recurse1.has_dyn_sized_stack)
527-
; GCN: .set usage_multi_stage_recurse.has_recursion, or(1, multi_stage_recurse1.has_recursion)
528-
; GCN: .set usage_multi_stage_recurse.has_indirect_call, or(0, multi_stage_recurse1.has_indirect_call)
529-
; GCN: TotalNumSgprs: 40
530-
; GCN: NumVgprs: 41
531-
; GCN: ScratchSize: 16
532-
define amdgpu_kernel void @usage_multi_stage_recurse(i32 %n) #0 {
533-
call void @multi_stage_recurse1(i32 %n)
534-
ret void
535-
}
536-
537-
; GCN-LABEL: {{^}}multi_stage_recurse_noattr2:
538-
; GCN: .set multi_stage_recurse_noattr2.num_vgpr, max(41, multi_stage_recurse_noattr1.num_vgpr)
539-
; GCN: .set multi_stage_recurse_noattr2.num_agpr, max(0, multi_stage_recurse_noattr1.num_agpr)
540-
; GCN: .set multi_stage_recurse_noattr2.numbered_sgpr, max(34, multi_stage_recurse_noattr1.numbered_sgpr)
541-
; GCN: .set multi_stage_recurse_noattr2.private_seg_size, 16+(max(multi_stage_recurse_noattr1.private_seg_size))
542-
; GCN: .set multi_stage_recurse_noattr2.uses_vcc, or(1, multi_stage_recurse_noattr1.uses_vcc)
543-
; GCN: .set multi_stage_recurse_noattr2.uses_flat_scratch, or(0, multi_stage_recurse_noattr1.uses_flat_scratch)
544-
; GCN: .set multi_stage_recurse_noattr2.has_dyn_sized_stack, or(0, multi_stage_recurse_noattr1.has_dyn_sized_stack)
545-
; GCN: .set multi_stage_recurse_noattr2.has_recursion, or(0, multi_stage_recurse_noattr1.has_recursion)
546-
; GCN: .set multi_stage_recurse_noattr2.has_indirect_call, or(0, multi_stage_recurse_noattr1.has_indirect_call)
547-
; GCN: TotalNumSgprs: multi_stage_recurse_noattr2.numbered_sgpr+(extrasgprs(multi_stage_recurse_noattr2.uses_vcc, multi_stage_recurse_noattr2.uses_flat_scratch, 1))
548-
; GCN: NumVgprs: max(41, multi_stage_recurse_noattr1.num_vgpr)
549-
; GCN: ScratchSize: 16+(max(multi_stage_recurse_noattr1.private_seg_size))
550-
; GCN-LABEL: {{^}}multi_stage_recurse_noattr1:
551-
; GCN: .set multi_stage_recurse_noattr1.num_vgpr, 41
552-
; GCN: .set multi_stage_recurse_noattr1.num_agpr, 0
553-
; GCN: .set multi_stage_recurse_noattr1.numbered_sgpr, 34
554-
; GCN: .set multi_stage_recurse_noattr1.private_seg_size, 16
555-
; GCN: .set multi_stage_recurse_noattr1.uses_vcc, 1
556-
; GCN: .set multi_stage_recurse_noattr1.uses_flat_scratch, 0
557-
; GCN: .set multi_stage_recurse_noattr1.has_dyn_sized_stack, 0
558-
; GCN: .set multi_stage_recurse_noattr1.has_recursion, 0
559-
; GCN: .set multi_stage_recurse_noattr1.has_indirect_call, 0
560-
; GCN: TotalNumSgprs: 38
561-
; GCN: NumVgprs: 41
562-
; GCN: ScratchSize: 16
563-
define void @multi_stage_recurse_noattr1(i32 %val) #0 {
564-
call void @multi_stage_recurse_noattr2(i32 %val)
565-
ret void
566-
}
567-
define void @multi_stage_recurse_noattr2(i32 %val) #0 {
568-
call void @multi_stage_recurse_noattr1(i32 %val)
569-
ret void
570-
}
571-
572-
; GCN-LABEL: {{^}}usage_multi_stage_recurse_noattrs:
573-
; GCN: .set usage_multi_stage_recurse_noattrs.num_vgpr, max(32, multi_stage_recurse_noattr1.num_vgpr)
574-
; GCN: .set usage_multi_stage_recurse_noattrs.num_agpr, max(0, multi_stage_recurse_noattr1.num_agpr)
575-
; GCN: .set usage_multi_stage_recurse_noattrs.numbered_sgpr, max(33, multi_stage_recurse_noattr1.numbered_sgpr)
576-
; GCN: .set usage_multi_stage_recurse_noattrs.private_seg_size, 0+(max(multi_stage_recurse_noattr1.private_seg_size))
577-
; GCN: .set usage_multi_stage_recurse_noattrs.uses_vcc, or(1, multi_stage_recurse_noattr1.uses_vcc)
578-
; GCN: .set usage_multi_stage_recurse_noattrs.uses_flat_scratch, or(1, multi_stage_recurse_noattr1.uses_flat_scratch)
579-
; GCN: .set usage_multi_stage_recurse_noattrs.has_dyn_sized_stack, or(0, multi_stage_recurse_noattr1.has_dyn_sized_stack)
580-
; GCN: .set usage_multi_stage_recurse_noattrs.has_recursion, or(0, multi_stage_recurse_noattr1.has_recursion)
581-
; GCN: .set usage_multi_stage_recurse_noattrs.has_indirect_call, or(0, multi_stage_recurse_noattr1.has_indirect_call)
582-
; GCN: TotalNumSgprs: 40
583-
; GCN: NumVgprs: 41
584-
; GCN: ScratchSize: 16
585-
define amdgpu_kernel void @usage_multi_stage_recurse_noattrs(i32 %n) #0 {
586-
call void @multi_stage_recurse_noattr1(i32 %n)
587-
ret void
588-
}
589-
590-
; GCN-LABEL: {{^}}multi_call_with_multi_stage_recurse:
591-
; GCN: .set multi_call_with_multi_stage_recurse.num_vgpr, max(41, use_stack0.num_vgpr, use_stack1.num_vgpr, multi_stage_recurse1.num_vgpr)
592-
; GCN: .set multi_call_with_multi_stage_recurse.num_agpr, max(0, use_stack0.num_agpr, use_stack1.num_agpr, multi_stage_recurse1.num_agpr)
593-
; GCN: .set multi_call_with_multi_stage_recurse.numbered_sgpr, max(43, use_stack0.numbered_sgpr, use_stack1.numbered_sgpr, multi_stage_recurse1.numbered_sgpr)
594-
; GCN: .set multi_call_with_multi_stage_recurse.private_seg_size, 0+(max(use_stack0.private_seg_size, use_stack1.private_seg_size, multi_stage_recurse1.private_seg_size))
595-
; GCN: .set multi_call_with_multi_stage_recurse.uses_vcc, or(1, use_stack0.uses_vcc, use_stack1.uses_vcc, multi_stage_recurse1.uses_vcc)
596-
; GCN: .set multi_call_with_multi_stage_recurse.uses_flat_scratch, or(1, use_stack0.uses_flat_scratch, use_stack1.uses_flat_scratch, multi_stage_recurse1.uses_flat_scratch)
597-
; GCN: .set multi_call_with_multi_stage_recurse.has_dyn_sized_stack, or(0, use_stack0.has_dyn_sized_stack, use_stack1.has_dyn_sized_stack, multi_stage_recurse1.has_dyn_sized_stack)
598-
; GCN: .set multi_call_with_multi_stage_recurse.has_recursion, or(1, use_stack0.has_recursion, use_stack1.has_recursion, multi_stage_recurse1.has_recursion)
599-
; GCN: .set multi_call_with_multi_stage_recurse.has_indirect_call, or(0, use_stack0.has_indirect_call, use_stack1.has_indirect_call, multi_stage_recurse1.has_indirect_call)
600-
; GCN: TotalNumSgprs: 49
601-
; GCN: NumVgprs: 41
602-
; GCN: ScratchSize: 2052
603-
define amdgpu_kernel void @multi_call_with_multi_stage_recurse(i32 %n) #0 {
604-
call void @use_stack0()
605-
call void @use_stack1()
606-
call void @multi_stage_recurse1(i32 %n)
607-
ret void
608-
}
609-
610484
; Make sure there's no assert when a sgpr96 is used.
611485
; GCN-LABEL: {{^}}count_use_sgpr96_external_call
612486
; GCN: .set count_use_sgpr96_external_call.num_vgpr, max(32, amdgpu.max_num_vgpr)

llvm/test/CodeGen/AMDGPU/recursive-resource-usage-mcexpr.ll

Lines changed: 0 additions & 85 deletions
This file was deleted.

0 commit comments

Comments
 (0)