On Wed, 2016-08-17 at 11:54 -0700, Matt Turner wrote: > The basic block following a control flow structure like an infinite > loop > will be unreachable. Ignore any non-control-flow instructions in it > since they can have no effect on the program.
If the block is unreachable control-flow instructions inside the block are also irrelevant, is there any reason why you don't skip CF instructions too? > Avoids a segmentation fault in cfg_t::intersect(a, b) when called on > an > unreachable block. By avoiding ever putting code in an unreachable > block, we never attempt to optimize code in an unreachable block. Can't the problem persist if the unreachable block has any control-flow instructions? > --- > src/mesa/drivers/dri/i965/brw_cfg.cpp | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > diff --git a/src/mesa/drivers/dri/i965/brw_cfg.cpp > b/src/mesa/drivers/dri/i965/brw_cfg.cpp > index 53b32be..2fa4e3d 100644 > --- a/src/mesa/drivers/dri/i965/brw_cfg.cpp > +++ b/src/mesa/drivers/dri/i965/brw_cfg.cpp > @@ -312,6 +312,11 @@ cfg_t::cfg_t(exec_list *instructions) > break; > > default: > + if (cur->num != 0 && cur->parents.is_empty()) { > + ip--; > + continue; > + } > + > cur->instructions.push_tail(inst); > break; > } > @@ -319,6 +324,12 @@ cfg_t::cfg_t(exec_list *instructions) > > cur->end_ip = ip - 1; > > + /* If the last block was empty (because it was unreachable) drop > it. */ > + if (cur->instructions.is_empty()) { > + cur->link.remove(); > + num_blocks--; > + } > + > make_block_array(); > } > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev