/* Description of target passes for IA-32 
   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)
 */

  INSERT_PASS_AFTER (pass_reload, 1, pass_insert_vzeroupper);
  INSERT_PASS_AFTER (pass_combine, 1, pass_stv, false /* timode_p */);
  /* Run the 64-bit STV pass before the CSE pass so that CONST0_RTX and
     CONSTM1_RTX generated by the STV pass can be CSEed.  */
  INSERT_PASS_BEFORE (pass_cse2, 1, pass_stv, true /* timode_p */);

  INSERT_PASS_BEFORE (pass_shorten_branches, 1, pass_insert_endbr_and_patchable_area);

  INSERT_PASS_AFTER (pass_combine, 1, pass_remove_partial_avx_dependency);
