mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-03-04 21:31:03 +00:00
Fix float division-by-zero in R600 scheduler.
This bug was reported by UBSan. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@217967 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
17e0ee5078
commit
8df2caebe2
@ -75,21 +75,25 @@ SUnit* R600SchedStrategy::pickNode(bool &IsTopNode) {
|
|||||||
float ALUFetchRationEstimate =
|
float ALUFetchRationEstimate =
|
||||||
(AluInstCount + AvailablesAluCount() + Pending[IDAlu].size()) /
|
(AluInstCount + AvailablesAluCount() + Pending[IDAlu].size()) /
|
||||||
(FetchInstCount + Available[IDFetch].size());
|
(FetchInstCount + Available[IDFetch].size());
|
||||||
unsigned NeededWF = 62.5f / ALUFetchRationEstimate;
|
if (ALUFetchRationEstimate == 0) {
|
||||||
DEBUG( dbgs() << NeededWF << " approx. Wavefronts Required\n" );
|
|
||||||
// We assume the local GPR requirements to be "dominated" by the requirement
|
|
||||||
// of the TEX clause (which consumes 128 bits regs) ; ALU inst before and
|
|
||||||
// after TEX are indeed likely to consume or generate values from/for the
|
|
||||||
// TEX clause.
|
|
||||||
// Available[IDFetch].size() * 2 : GPRs required in the Fetch clause
|
|
||||||
// We assume that fetch instructions are either TnXYZW = TEX TnXYZW (need
|
|
||||||
// one GPR) or TmXYZW = TnXYZW (need 2 GPR).
|
|
||||||
// (TODO : use RegisterPressure)
|
|
||||||
// If we are going too use too many GPR, we flush Fetch instruction to lower
|
|
||||||
// register pressure on 128 bits regs.
|
|
||||||
unsigned NearRegisterRequirement = 2 * Available[IDFetch].size();
|
|
||||||
if (NeededWF > getWFCountLimitedByGPR(NearRegisterRequirement))
|
|
||||||
AllowSwitchFromAlu = true;
|
AllowSwitchFromAlu = true;
|
||||||
|
} else {
|
||||||
|
unsigned NeededWF = 62.5f / ALUFetchRationEstimate;
|
||||||
|
DEBUG( dbgs() << NeededWF << " approx. Wavefronts Required\n" );
|
||||||
|
// We assume the local GPR requirements to be "dominated" by the requirement
|
||||||
|
// of the TEX clause (which consumes 128 bits regs) ; ALU inst before and
|
||||||
|
// after TEX are indeed likely to consume or generate values from/for the
|
||||||
|
// TEX clause.
|
||||||
|
// Available[IDFetch].size() * 2 : GPRs required in the Fetch clause
|
||||||
|
// We assume that fetch instructions are either TnXYZW = TEX TnXYZW (need
|
||||||
|
// one GPR) or TmXYZW = TnXYZW (need 2 GPR).
|
||||||
|
// (TODO : use RegisterPressure)
|
||||||
|
// If we are going too use too many GPR, we flush Fetch instruction to lower
|
||||||
|
// register pressure on 128 bits regs.
|
||||||
|
unsigned NearRegisterRequirement = 2 * Available[IDFetch].size();
|
||||||
|
if (NeededWF > getWFCountLimitedByGPR(NearRegisterRequirement))
|
||||||
|
AllowSwitchFromAlu = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!SU && ((AllowSwitchToAlu && CurInstKind != IDAlu) ||
|
if (!SU && ((AllowSwitchToAlu && CurInstKind != IDAlu) ||
|
||||||
|
Loading…
x
Reference in New Issue
Block a user