Cannot really review this myself, but: Tested-by: Tomeu Vizoso <tomeu.viz...@collabora.com>
Thanks! On Wed, 27 Feb 2019 at 06:49, Alyssa Rosenzweig <aly...@rosenzweig.io> wrote: > > If a selected unit causes a data hazard, the whole block gets cut short. > So, we preview for data hazards _while_ selecting units. > > Signed-off-by: Alyssa Rosenzweig <aly...@rosenzweig.io> > --- > .../panfrost/midgard/midgard_compile.c | 25 ++++++++++++------- > 1 file changed, 16 insertions(+), 9 deletions(-) > > diff --git a/src/gallium/drivers/panfrost/midgard/midgard_compile.c > b/src/gallium/drivers/panfrost/midgard/midgard_compile.c > index e37037ac737..f9bd611f789 100644 > --- a/src/gallium/drivers/panfrost/midgard/midgard_compile.c > +++ b/src/gallium/drivers/panfrost/midgard/midgard_compile.c > @@ -2060,6 +2060,20 @@ can_run_concurrent_ssa(midgard_instruction *first, > midgard_instruction *second) > return true; > } > > +static bool > +midgard_has_hazard( > + midgard_instruction **segment, unsigned segment_size, > + midgard_instruction *ains) > +{ > + for (int s = 0; s < segment_size; ++s) > + if (!can_run_concurrent_ssa(segment[s], ains)) > + return true; > + > + return false; > + > + > +} > + > /* Schedules, but does not emit, a single basic block. After scheduling, the > * final tag and size of the block are known, which are necessary for > branching > * */ > @@ -2159,7 +2173,7 @@ schedule_bundle(compiler_context *ctx, midgard_block > *block, midgard_instruction > else > break; > } else { > - if ((units & UNIT_SADD) && > !(control & UNIT_SADD)) > + if ((units & UNIT_SADD) && > !(control & UNIT_SADD) && !midgard_has_hazard(segment, segment_size, ains)) > unit = UNIT_SADD; > else if (units & UNIT_SMUL) > unit = ((units & > UNIT_VMUL) && !(control & UNIT_VMUL)) ? UNIT_VMUL : UNIT_SMUL; > @@ -2180,14 +2194,7 @@ schedule_bundle(compiler_context *ctx, midgard_block > *block, midgard_instruction > if (last_unit < UNIT_VADD && unit >= UNIT_VADD) > segment_size = 0; > > - /* Check for data hazards */ > - int has_hazard = false; > - > - for (int s = 0; s < segment_size; ++s) > - if (!can_run_concurrent_ssa(segment[s], > ains)) > - has_hazard = true; > - > - if (has_hazard) > + if (midgard_has_hazard(segment, segment_size, ains)) > break; > > /* We're good to go -- emit the instruction */ > -- > 2.20.1 > > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/mesa-dev _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev