Skip to content

Commit 8a1736b

Browse files
authored
Merge branch 'main' into p/libc-trivial-hdef
2 parents 7dc45c0 + 90f733c commit 8a1736b

22 files changed

+1335
-290
lines changed

llvm/include/llvm/CodeGen/MachineFunctionAnalysis.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ class MachineFunctionAnalysis
4646
LLVM_ABI Result run(Function &F, FunctionAnalysisManager &FAM);
4747
};
4848

49+
class FreeMachineFunctionPass : public PassInfoMixin<FreeMachineFunctionPass> {
50+
public:
51+
PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM);
52+
};
53+
4954
} // namespace llvm
5055

5156
#endif // LLVM_CODEGEN_MachineFunctionAnalysis

llvm/include/llvm/IR/PassManager.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -491,6 +491,22 @@ template <typename IRUnitT, typename... ExtraArgTs> class AnalysisManager {
491491
/// invalidate them, unless they are preserved by the PreservedAnalyses set.
492492
void invalidate(IRUnitT &IR, const PreservedAnalyses &PA);
493493

494+
/// Directly clear a cached analysis for an IR unit.
495+
///
496+
/// Using invalidate() over this is preferred unless you are really
497+
/// sure you want to *only* clear this analysis without asking if it is
498+
/// invalid.
499+
template <typename AnalysisT> void clearAnalysis(IRUnitT &IR) {
500+
AnalysisResultListT &ResultsList = AnalysisResultLists[&IR];
501+
AnalysisKey *ID = AnalysisT::ID();
502+
503+
auto I =
504+
llvm::find_if(ResultsList, [&ID](auto &E) { return E.first == ID; });
505+
assert(I != ResultsList.end() && "Analysis must be available");
506+
ResultsList.erase(I);
507+
AnalysisResults.erase({ID, &IR});
508+
}
509+
494510
private:
495511
/// Look up a registered analysis pass.
496512
PassConceptT &lookUpPass(AnalysisKey *ID) {

llvm/include/llvm/Passes/CodeGenPassBuilder.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ template <typename DerivedT, typename TargetMachineT> class CodeGenPassBuilder {
281281

282282
FunctionPassManager FPM;
283283
FPM.addPass(createFunctionToMachineFunctionPassAdaptor(std::move(MFPM)));
284-
FPM.addPass(InvalidateAnalysisPass<MachineFunctionAnalysis>());
284+
FPM.addPass(FreeMachineFunctionPass());
285285
if (this->PB.AddInCGSCCOrder) {
286286
MPM.addPass(createModuleToPostOrderCGSCCPassAdaptor(
287287
createCGSCCToFunctionPassAdaptor(std::move(FPM))));

llvm/lib/CodeGen/MachineFunctionAnalysis.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,9 @@ MachineFunctionAnalysis::run(Function &F, FunctionAnalysisManager &FAM) {
4545

4646
return Result(std::move(MF));
4747
}
48+
49+
PreservedAnalyses FreeMachineFunctionPass::run(Function &F,
50+
FunctionAnalysisManager &FAM) {
51+
FAM.clearAnalysis<MachineFunctionAnalysis>(F);
52+
return PreservedAnalyses::all();
53+
}

llvm/lib/Passes/PassRegistry.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,7 @@ FUNCTION_PASS("extra-vector-passes",
434434
FUNCTION_PASS("fix-irreducible", FixIrreduciblePass())
435435
FUNCTION_PASS("flatten-cfg", FlattenCFGPass())
436436
FUNCTION_PASS("float2int", Float2IntPass())
437+
FUNCTION_PASS("free-machine-function", FreeMachineFunctionPass())
437438
FUNCTION_PASS("gc-lowering", GCLoweringPass())
438439
FUNCTION_PASS("guard-widening", GuardWideningPass())
439440
FUNCTION_PASS("gvn-hoist", GVNHoistPass())

llvm/lib/Target/AMDGPU/SIInstrInfo.cpp

Lines changed: 21 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -687,7 +687,8 @@ static void indirectCopyToAGPR(const SIInstrInfo &TII,
687687
if (!SafeToPropagate)
688688
break;
689689

690-
DefOp.setIsKill(false);
690+
for (auto I = Def; I != MI; ++I)
691+
I->clearRegisterKills(DefOp.getReg(), &RI);
691692
}
692693

693694
MachineInstrBuilder Builder =
@@ -1625,41 +1626,6 @@ static unsigned getVGPRSpillSaveOpcode(unsigned Size) {
16251626
}
16261627
}
16271628

1628-
static unsigned getAGPRSpillSaveOpcode(unsigned Size) {
1629-
switch (Size) {
1630-
case 4:
1631-
return AMDGPU::SI_SPILL_A32_SAVE;
1632-
case 8:
1633-
return AMDGPU::SI_SPILL_A64_SAVE;
1634-
case 12:
1635-
return AMDGPU::SI_SPILL_A96_SAVE;
1636-
case 16:
1637-
return AMDGPU::SI_SPILL_A128_SAVE;
1638-
case 20:
1639-
return AMDGPU::SI_SPILL_A160_SAVE;
1640-
case 24:
1641-
return AMDGPU::SI_SPILL_A192_SAVE;
1642-
case 28:
1643-
return AMDGPU::SI_SPILL_A224_SAVE;
1644-
case 32:
1645-
return AMDGPU::SI_SPILL_A256_SAVE;
1646-
case 36:
1647-
return AMDGPU::SI_SPILL_A288_SAVE;
1648-
case 40:
1649-
return AMDGPU::SI_SPILL_A320_SAVE;
1650-
case 44:
1651-
return AMDGPU::SI_SPILL_A352_SAVE;
1652-
case 48:
1653-
return AMDGPU::SI_SPILL_A384_SAVE;
1654-
case 64:
1655-
return AMDGPU::SI_SPILL_A512_SAVE;
1656-
case 128:
1657-
return AMDGPU::SI_SPILL_A1024_SAVE;
1658-
default:
1659-
llvm_unreachable("unknown register size");
1660-
}
1661-
}
1662-
16631629
static unsigned getAVSpillSaveOpcode(unsigned Size) {
16641630
switch (Size) {
16651631
case 4:
@@ -1707,22 +1673,20 @@ static unsigned getWWMRegSpillSaveOpcode(unsigned Size,
17071673
return AMDGPU::SI_SPILL_WWM_V32_SAVE;
17081674
}
17091675

1710-
static unsigned getVectorRegSpillSaveOpcode(Register Reg,
1711-
const TargetRegisterClass *RC,
1712-
unsigned Size,
1713-
const SIRegisterInfo &TRI,
1714-
const SIMachineFunctionInfo &MFI) {
1715-
bool IsVectorSuperClass = TRI.isVectorSuperClass(RC);
1676+
unsigned SIInstrInfo::getVectorRegSpillSaveOpcode(
1677+
Register Reg, const TargetRegisterClass *RC, unsigned Size,
1678+
const SIMachineFunctionInfo &MFI) const {
1679+
bool IsVectorSuperClass = RI.isVectorSuperClass(RC);
17161680

17171681
// Choose the right opcode if spilling a WWM register.
17181682
if (MFI.checkFlag(Reg, AMDGPU::VirtRegFlag::WWM_REG))
17191683
return getWWMRegSpillSaveOpcode(Size, IsVectorSuperClass);
17201684

1721-
if (IsVectorSuperClass)
1685+
// TODO: Check if AGPRs are available
1686+
if (ST.hasMAIInsts())
17221687
return getAVSpillSaveOpcode(Size);
17231688

1724-
return TRI.isAGPRClass(RC) ? getAGPRSpillSaveOpcode(Size)
1725-
: getVGPRSpillSaveOpcode(Size);
1689+
return getVGPRSpillSaveOpcode(Size);
17261690
}
17271691

17281692
void SIInstrInfo::storeRegToStackSlot(
@@ -1770,8 +1734,8 @@ void SIInstrInfo::storeRegToStackSlot(
17701734
return;
17711735
}
17721736

1773-
unsigned Opcode = getVectorRegSpillSaveOpcode(VReg ? VReg : SrcReg, RC,
1774-
SpillSize, RI, *MFI);
1737+
unsigned Opcode =
1738+
getVectorRegSpillSaveOpcode(VReg ? VReg : SrcReg, RC, SpillSize, *MFI);
17751739
MFI->setHasSpilledVGPRs();
17761740

17771741
BuildMI(MBB, MI, DL, get(Opcode))
@@ -1854,41 +1818,6 @@ static unsigned getVGPRSpillRestoreOpcode(unsigned Size) {
18541818
}
18551819
}
18561820

1857-
static unsigned getAGPRSpillRestoreOpcode(unsigned Size) {
1858-
switch (Size) {
1859-
case 4:
1860-
return AMDGPU::SI_SPILL_A32_RESTORE;
1861-
case 8:
1862-
return AMDGPU::SI_SPILL_A64_RESTORE;
1863-
case 12:
1864-
return AMDGPU::SI_SPILL_A96_RESTORE;
1865-
case 16:
1866-
return AMDGPU::SI_SPILL_A128_RESTORE;
1867-
case 20:
1868-
return AMDGPU::SI_SPILL_A160_RESTORE;
1869-
case 24:
1870-
return AMDGPU::SI_SPILL_A192_RESTORE;
1871-
case 28:
1872-
return AMDGPU::SI_SPILL_A224_RESTORE;
1873-
case 32:
1874-
return AMDGPU::SI_SPILL_A256_RESTORE;
1875-
case 36:
1876-
return AMDGPU::SI_SPILL_A288_RESTORE;
1877-
case 40:
1878-
return AMDGPU::SI_SPILL_A320_RESTORE;
1879-
case 44:
1880-
return AMDGPU::SI_SPILL_A352_RESTORE;
1881-
case 48:
1882-
return AMDGPU::SI_SPILL_A384_RESTORE;
1883-
case 64:
1884-
return AMDGPU::SI_SPILL_A512_RESTORE;
1885-
case 128:
1886-
return AMDGPU::SI_SPILL_A1024_RESTORE;
1887-
default:
1888-
llvm_unreachable("unknown register size");
1889-
}
1890-
}
1891-
18921821
static unsigned getAVSpillRestoreOpcode(unsigned Size) {
18931822
switch (Size) {
18941823
case 4:
@@ -1930,27 +1859,27 @@ static unsigned getWWMRegSpillRestoreOpcode(unsigned Size,
19301859
if (Size != 4)
19311860
llvm_unreachable("unknown wwm register spill size");
19321861

1933-
if (IsVectorSuperClass)
1862+
if (IsVectorSuperClass) // TODO: Always use this if there are AGPRs
19341863
return AMDGPU::SI_SPILL_WWM_AV32_RESTORE;
19351864

19361865
return AMDGPU::SI_SPILL_WWM_V32_RESTORE;
19371866
}
19381867

1939-
static unsigned
1940-
getVectorRegSpillRestoreOpcode(Register Reg, const TargetRegisterClass *RC,
1941-
unsigned Size, const SIRegisterInfo &TRI,
1942-
const SIMachineFunctionInfo &MFI) {
1943-
bool IsVectorSuperClass = TRI.isVectorSuperClass(RC);
1868+
unsigned SIInstrInfo::getVectorRegSpillRestoreOpcode(
1869+
Register Reg, const TargetRegisterClass *RC, unsigned Size,
1870+
const SIMachineFunctionInfo &MFI) const {
1871+
bool IsVectorSuperClass = RI.isVectorSuperClass(RC);
19441872

19451873
// Choose the right opcode if restoring a WWM register.
19461874
if (MFI.checkFlag(Reg, AMDGPU::VirtRegFlag::WWM_REG))
19471875
return getWWMRegSpillRestoreOpcode(Size, IsVectorSuperClass);
19481876

1949-
if (IsVectorSuperClass)
1877+
// TODO: Check if AGPRs are available
1878+
if (ST.hasMAIInsts())
19501879
return getAVSpillRestoreOpcode(Size);
19511880

1952-
return TRI.isAGPRClass(RC) ? getAGPRSpillRestoreOpcode(Size)
1953-
: getVGPRSpillRestoreOpcode(Size);
1881+
assert(!RI.isAGPRClass(RC));
1882+
return getVGPRSpillRestoreOpcode(Size);
19541883
}
19551884

19561885
void SIInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
@@ -1998,7 +1927,7 @@ void SIInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
19981927
}
19991928

20001929
unsigned Opcode = getVectorRegSpillRestoreOpcode(VReg ? VReg : DestReg, RC,
2001-
SpillSize, RI, *MFI);
1930+
SpillSize, *MFI);
20021931
BuildMI(MBB, MI, DL, get(Opcode), DestReg)
20031932
.addFrameIndex(FrameIndex) // vaddr
20041933
.addReg(MFI->getStackPtrOffsetReg()) // scratch_offset

llvm/lib/Target/AMDGPU/SIInstrInfo.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class LiveVariables;
3333
class MachineDominatorTree;
3434
class MachineRegisterInfo;
3535
class RegScavenger;
36+
class SIMachineFunctionInfo;
3637
class TargetRegisterClass;
3738
class ScheduleHazardRecognizer;
3839

@@ -287,6 +288,15 @@ class SIInstrInfo final : public AMDGPUGenInstrInfo {
287288
bool getConstValDefinedInReg(const MachineInstr &MI, const Register Reg,
288289
int64_t &ImmVal) const override;
289290

291+
unsigned getVectorRegSpillSaveOpcode(Register Reg,
292+
const TargetRegisterClass *RC,
293+
unsigned Size,
294+
const SIMachineFunctionInfo &MFI) const;
295+
unsigned
296+
getVectorRegSpillRestoreOpcode(Register Reg, const TargetRegisterClass *RC,
297+
unsigned Size,
298+
const SIMachineFunctionInfo &MFI) const;
299+
290300
void storeRegToStackSlot(
291301
MachineBasicBlock &MBB, MachineBasicBlock::iterator MI, Register SrcReg,
292302
bool isKill, int FrameIndex, const TargetRegisterClass *RC,

llvm/lib/Transforms/Utils/SimplifyCFG.cpp

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7493,7 +7493,7 @@ bool SimplifyCFGOpt::simplifyDuplicateSwitchArms(SwitchInst *SI,
74937493
SmallPtrSet<PHINode *, 8> Phis;
74947494
SmallPtrSet<BasicBlock *, 8> Seen;
74957495
DenseMap<PHINode *, SmallDenseMap<BasicBlock *, Value *, 8>> PhiPredIVs;
7496-
DenseMap<BasicBlock *, SmallVector<unsigned, 4>> BBToSuccessorIndexes;
7496+
DenseMap<BasicBlock *, SmallVector<unsigned, 32>> BBToSuccessorIndexes;
74977497
SmallVector<SwitchSuccWrapper> Cases;
74987498
Cases.reserve(SI->getNumSuccessors());
74997499

@@ -7505,27 +7505,31 @@ bool SimplifyCFGOpt::simplifyDuplicateSwitchArms(SwitchInst *SI,
75057505
if (BB->size() != 1)
75067506
continue;
75077507

7508-
// FIXME: This case needs some extra care because the terminators other than
7509-
// SI need to be updated. For now, consider only backedges to the SI.
7510-
if (BB->hasNPredecessorsOrMore(4) ||
7511-
BB->getUniquePredecessor() != SI->getParent())
7512-
continue;
7513-
75147508
// FIXME: Relax that the terminator is a BranchInst by checking for equality
75157509
// on other kinds of terminators. We decide to only support unconditional
75167510
// branches for now for compile time reasons.
75177511
auto *BI = dyn_cast<BranchInst>(BB->getTerminator());
75187512
if (!BI || BI->isConditional())
75197513
continue;
75207514

7521-
if (Seen.insert(BB).second) {
7522-
// Keep track of which PHIs we need as keys in PhiPredIVs below.
7523-
for (BasicBlock *Succ : BI->successors())
7524-
Phis.insert_range(llvm::make_pointer_range(Succ->phis()));
7525-
// Add the successor only if not previously visited.
7526-
Cases.emplace_back(SwitchSuccWrapper{BB, &PhiPredIVs});
7515+
if (!Seen.insert(BB).second) {
7516+
auto It = BBToSuccessorIndexes.find(BB);
7517+
if (It != BBToSuccessorIndexes.end())
7518+
It->second.emplace_back(I);
7519+
continue;
75277520
}
75287521

7522+
// FIXME: This case needs some extra care because the terminators other than
7523+
// SI need to be updated. For now, consider only backedges to the SI.
7524+
if (BB->getUniquePredecessor() != SI->getParent())
7525+
continue;
7526+
7527+
// Keep track of which PHIs we need as keys in PhiPredIVs below.
7528+
for (BasicBlock *Succ : BI->successors())
7529+
Phis.insert_range(llvm::make_pointer_range(Succ->phis()));
7530+
7531+
// Add the successor only if not previously visited.
7532+
Cases.emplace_back(SwitchSuccWrapper{BB, &PhiPredIVs});
75297533
BBToSuccessorIndexes[BB].emplace_back(I);
75307534
}
75317535

0 commit comments

Comments
 (0)