https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68874

            Bug ID: 68874
           Summary: Allow pass groups to be cloned
           Product: gcc
           Version: 6.0
            Status: UNCONFIRMED
          Severity: enhancement
          Priority: P3
         Component: other
          Assignee: unassigned at gcc dot gnu.org
          Reporter: vries at gcc dot gnu.org
  Target Milestone: ---

A pass group in passes.def is declared like this:
...
  NEXT_PASS (pass_build_ssa_passes);
  PUSH_INSERT_PASSES_WITHIN (pass_build_ssa_passes)
      NEXT_PASS (pass_fixup_cfg);
      NEXT_PASS (pass_init_datastructures);
      NEXT_PASS (pass_build_ssa);
      NEXT_PASS (pass_ubsan);
      NEXT_PASS (pass_early_warn_uninitialized);
      NEXT_PASS (pass_nothrow);
  POP_INSERT_PASSES ()
...

Sometimes it's needed to split a pass group in two.

This could be done by cloning the pass group:
...
  NEXT_PASS (pass_build_ssa_passes);
  PUSH_INSERT_PASSES_WITHIN (pass_build_ssa_passes)
      NEXT_PASS (pass_fixup_cfg);
      NEXT_PASS (pass_init_datastructures);
      NEXT_PASS (pass_build_ssa);
  POP_INSERT_PASSES ()
  ...
  NEXT_PASS (pass_build_ssa_passes);
  PUSH_INSERT_PASSES_WITHIN (pass_build_ssa_passes)
      NEXT_PASS (pass_ubsan);
      NEXT_PASS (pass_early_warn_uninitialized);
      NEXT_PASS (pass_nothrow);
  POP_INSERT_PASSES ()
...

But atm, this is not supported, because PUSH_INSERT_PASSES_WITHIN hardcodes
that the pass instance is instance 1:
...
#define PUSH_INSERT_PASSES_WITHIN(PASS) \
  { \
    opt_pass **p = &(PASS ## _1)->sub;
...

So we have to revert to copy-pasting the pass group, appending 2 everywhere and
then using:
...
  NEXT_PASS (pass_build_ssa_passes);
  PUSH_INSERT_PASSES_WITHIN (pass_build_ssa_passes)
      NEXT_PASS (pass_fixup_cfg);
      NEXT_PASS (pass_init_datastructures);
      NEXT_PASS (pass_build_ssa);
  POP_INSERT_PASSES ()
  ...
  NEXT_PASS (pass_build_ssa_passes2);
  PUSH_INSERT_PASSES_WITHIN (pass_build_ssa_passes2)
      NEXT_PASS (pass_ubsan);
      NEXT_PASS (pass_early_warn_uninitialized);
      NEXT_PASS (pass_nothrow);
  POP_INSERT_PASSES ()
...

Reply via email to