mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-08 03:30:22 +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 =
|
||||
(AluInstCount + AvailablesAluCount() + Pending[IDAlu].size()) /
|
||||
(FetchInstCount + Available[IDFetch].size());
|
||||
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))
|
||||
if (ALUFetchRationEstimate == 0) {
|
||||
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) ||
|
||||
|
Loading…
Reference in New Issue
Block a user