Fix float division-by-zero in R600 scheduler.

This bug was reported by UBSan.

llvm-svn: 217967
This commit is contained in:
Alexey Samsonov 2014-09-17 17:47:21 +00:00
parent fb3e14375a
commit cce5701cdb
1 changed files with 18 additions and 14 deletions

View File

@ -75,6 +75,9 @@ SUnit* R600SchedStrategy::pickNode(bool &IsTopNode) {
float ALUFetchRationEstimate =
(AluInstCount + AvailablesAluCount() + Pending[IDAlu].size()) /
(FetchInstCount + Available[IDFetch].size());
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
@ -91,6 +94,7 @@ SUnit* R600SchedStrategy::pickNode(bool &IsTopNode) {
if (NeededWF > getWFCountLimitedByGPR(NearRegisterRequirement))
AllowSwitchFromAlu = true;
}
}
if (!SU && ((AllowSwitchToAlu && CurInstKind != IDAlu) ||
(!AllowSwitchFromAlu && CurInstKind == IDAlu))) {