[PATCH] Fix float division-by-zero in R600 scheduler
Tom Stellard
tom at stellard.net
Tue Sep 16 07:04:11 PDT 2014
On Mon, Sep 15, 2014 at 06:08:37PM +0000, Alexey Samsonov wrote:
> Hi vljn,
>
> Fix a float division by zero reported by UBSan. It was reported
> in the following test cases:
> LLVM :: CodeGen/R600/and.ll
> LLVM :: CodeGen/R600/fma.ll
> LLVM :: CodeGen/R600/xor.ll
> I'm not sure is actually an accepted value for ALUFetchRationEstimate,
> or we should add an assert and fix a bug elsewhere. Please take a look.
>
LGTM.
> http://reviews.llvm.org/D5359
>
> Files:
> lib/Target/R600/R600MachineScheduler.cpp
> Index: lib/Target/R600/R600MachineScheduler.cpp
> ===================================================================
> --- lib/Target/R600/R600MachineScheduler.cpp
> +++ lib/Target/R600/R600MachineScheduler.cpp
> @@ -75,21 +75,25 @@
> 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) ||
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list