Richard Guenther wrote: > On Wed, 15 Aug 2012, Ulrich Weigand wrote: > > It seems flow_loops_find by itself is not quite enough, but everything > > necessary to use the loop structures seems to be encapsulated in > > loop_optimizer_init / loop_optimizer_finalize, which are already called > > by a number of optimization passes. When I do the same in the SPU > > md-reorg pass, loop_father seems to be set up OK. > > > > Does this look reasonable? > > Yes. You can use bb_loop_depth instead of loop_depth (bb->loop_father).
Ah, good point. Below the version I committed. Tested on spu-elf. Thanks, Ulrich ChangeLog: * config/spu/spu.c: Include "cfgloop.h". (spu_machine_dependent_reorg): Call loop_optimizer_init and loop_optimizer_finalize. Use bb_loop_depth instead of loop_depth. Directly compare loop_father values where appropriate. * config/spu/t-spu-elf (spu.o): Update dependencies. Index: gcc/config/spu/spu.c =================================================================== *** gcc/config/spu/spu.c (revision 190390) --- gcc/config/spu/spu.c (working copy) *************** *** 53,58 **** --- 53,59 ---- #include "timevar.h" #include "df.h" #include "dumpfile.h" + #include "cfgloop.h" /* Builtin types, data and prototypes. */ *************** spu_machine_dependent_reorg (void) *** 2458,2463 **** --- 2459,2468 ---- in_spu_reorg = 1; compute_bb_for_insn (); + /* (Re-)discover loops so that bb->loop_father can be used + in the analysis below. */ + loop_optimizer_init (AVOID_CFG_MODIFICATIONS); + compact_blocks (); spu_bb_info = *************** spu_machine_dependent_reorg (void) *** 2562,2575 **** fallthru block. This catches the cases when it is a simple loop or when there is an initial branch into the loop. */ if (prev && (loop_exit || simple_loop) ! && prev->loop_depth <= bb->loop_depth) prop = prev; /* If there is only one adjacent predecessor. Don't propagate ! outside this loop. This loop_depth test isn't perfect, but ! I'm not sure the loop_father member is valid at this point. */ else if (prev && single_pred_p (bb) ! && prev->loop_depth == bb->loop_depth) prop = prev; /* If this is the JOIN block of a simple IF-THEN then --- 2567,2579 ---- fallthru block. This catches the cases when it is a simple loop or when there is an initial branch into the loop. */ if (prev && (loop_exit || simple_loop) ! && bb_loop_depth (prev) <= bb_loop_depth (bb)) prop = prev; /* If there is only one adjacent predecessor. Don't propagate ! outside this loop. */ else if (prev && single_pred_p (bb) ! && prev->loop_father == bb->loop_father) prop = prev; /* If this is the JOIN block of a simple IF-THEN then *************** spu_machine_dependent_reorg (void) *** 2578,2584 **** && EDGE_COUNT (bb->preds) == 2 && EDGE_COUNT (prev->preds) == 1 && EDGE_PRED (prev, 0)->src == prev2 ! && prev2->loop_depth == bb->loop_depth && GET_CODE (branch_target) != REG) prop = prev; --- 2582,2588 ---- && EDGE_COUNT (bb->preds) == 2 && EDGE_COUNT (prev->preds) == 1 && EDGE_PRED (prev, 0)->src == prev2 ! && prev2->loop_father == bb->loop_father && GET_CODE (branch_target) != REG) prop = prev; *************** spu_machine_dependent_reorg (void) *** 2600,2606 **** if (dump_file) fprintf (dump_file, "propagate from %i to %i (loop depth %i) " "for %i (loop_exit %i simple_loop %i dist %i)\n", ! bb->index, prop->index, bb->loop_depth, INSN_UID (branch), loop_exit, simple_loop, branch_addr - INSN_ADDRESSES (INSN_UID (bbend))); --- 2604,2610 ---- if (dump_file) fprintf (dump_file, "propagate from %i to %i (loop depth %i) " "for %i (loop_exit %i simple_loop %i dist %i)\n", ! bb->index, prop->index, bb_loop_depth (bb), INSN_UID (branch), loop_exit, simple_loop, branch_addr - INSN_ADDRESSES (INSN_UID (bbend))); *************** spu_machine_dependent_reorg (void) *** 2657,2662 **** --- 2661,2668 ---- spu_var_tracking (); + loop_optimizer_finalize (); + free_bb_for_insn (); in_spu_reorg = 0; Index: gcc/config/spu/t-spu-elf =================================================================== *** gcc/config/spu/t-spu-elf (revision 190390) --- gcc/config/spu/t-spu-elf (working copy) *************** spu.o: $(CONFIG_H) $(SYSTEM_H) coretypes *** 23,29 **** real.h insn-config.h conditions.h insn-attr.h flags.h $(RECOG_H) \ $(OBSTACK_H) $(TREE_H) $(EXPR_H) $(OPTABS_H) except.h function.h \ output.h $(BASIC_BLOCK_H) $(GGC_H) $(HASHTAB_H) \ ! $(TM_P_H) $(TARGET_H) $(TARGET_DEF_H) langhooks.h reload.h \ $(srcdir)/config/spu/spu-protos.h \ $(srcdir)/config/spu/spu-builtins.def --- 23,29 ---- real.h insn-config.h conditions.h insn-attr.h flags.h $(RECOG_H) \ $(OBSTACK_H) $(TREE_H) $(EXPR_H) $(OPTABS_H) except.h function.h \ output.h $(BASIC_BLOCK_H) $(GGC_H) $(HASHTAB_H) \ ! $(TM_P_H) $(TARGET_H) $(TARGET_DEF_H) langhooks.h reload.h $(CFGLOOP_H) \ $(srcdir)/config/spu/spu-protos.h \ $(srcdir)/config/spu/spu-builtins.def -- Dr. Ulrich Weigand GNU Toolchain for Linux on System z and Cell BE ulrich.weig...@de.ibm.com