/* Description of target passes for rs6000
   Copyright (C) 2016-2021 Free Software Foundation, Inc.

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.

GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
for more details.

You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */

/*
   Macros that can be used in this file:
   INSERT_PASS_AFTER (PASS, INSTANCE, TGT_PASS)
   INSERT_PASS_BEFORE (PASS, INSTANCE, TGT_PASS)
   REPLACE_PASS (PASS, INSTANCE, TGT_PASS)
 */

  /* Pass to add the appropriate vector swaps on power8 little endian systems.
     The power8 does not have instructions that automaticaly do the byte swaps
     for loads and stores.  */
  INSERT_PASS_BEFORE (pass_cse, 1, pass_analyze_swaps);

  /* Pass to do the PCREL_OPT optimization that combines the load of an
     external symbol's address along with a single load or store using that
     address as a base register.  */
  INSERT_PASS_BEFORE (pass_sched2, 1, pass_pcrel_opt);
