https://gcc.gnu.org/g:d15703b27aa4924ca3438066ae0759e7379b3e0b

commit r17-2196-gd15703b27aa4924ca3438066ae0759e7379b3e0b
Author: wangjue <[email protected]>
Date:   Tue Jul 7 08:16:16 2026 -0600

    [PATCH v5] RISC-V: Add small loop unrolling support via 
-munroll-only-small-loops
    
    This patch introduces a conservative loop unrolling heuristic for the
    RISC-V backend, controlled by the new -munroll-only-small-loops option.
    
    When -munroll-only-small-loops is active, only small loops (those whose
    body does not exceed a per-tune instruction threshold) are unrolled, and
    the unroll factor is capped by a per-tune parameter, so that tight loops
    benefit from unrolling without exposing larger loops to its code-size and
    instruction-cache costs.
    
    Mirroring the i386 model, -funroll-loops and -munroll-only-small-loops are
    enabled by default at -O2 and above (for speed).  An explicit -funroll-loops
    (or -funroll-all-loops) turns -munroll-only-small-loops off, so a user who
    explicitly asks for unrolling still gets loops of any size unrolled.  The
    size threshold and the maximum unroll factor come from the -mtune tuning
    parameters.
    
    Since -funroll-loops is now enabled by default at -O2 and above, a number
    of pre-existing RISC-V tests that scan for a specific code sequence change
    their output once loops are unrolled.  As those tests do not aim to exercise
    unrolling, add -fno-unroll-loops to their options so they keep validating
    their intended property regardless of the unrolling decision.
    
    gcc/ChangeLog:
    
            * common/config/riscv/riscv-common.cc 
(riscv_option_optimization_table):
            Enable -funroll-loops and -munroll-only-small-loops at -O2 and 
above.
            * config/riscv/riscv.cc (struct riscv_tune_param): Add fields
            small_loop_unroll_ninsns and small_loop_unroll_factor.
            (xt_c9501_tune_info): Set them.
            (riscv_loop_unroll_adjust): New function.
            (riscv_option_override): Turn off -munroll-only-small-loops when
            -funroll-loops or -funroll-all-loops is explicitly given.
            (TARGET_LOOP_UNROLL_ADJUST): Define.
            * config/riscv/riscv.opt (munroll-only-small-loops): New option.
            * config/riscv/riscv.opt.urls: Regenerate.
            * doc/invoke.texi (RISC-V Options): Document 
-munroll-only-small-loops.
    
    gcc/testsuite/ChangeLog:
            * gcc.target/riscv/unroll-explicit.c: New test.
            * gcc.target/riscv/unroll-large-loop.c: New test.
            * gcc.target/riscv/unroll-pragma.c: New test.
            * gcc.target/riscv/unroll-small-loop-tune.c: New test.
            * gcc.target/riscv/unroll-small-loop.c: New test.
            * g++.dg/tree-prof/pr57451.C: Add -fno-unroll-loops.
            * g++.target/riscv/pr97682.C: Likewise.
            * gcc.dg/tree-ssa/pr117973-1.c: Likewise.
            * gcc.dg/vect/vect-alias-check-4.c: Likewise.
            * gcc.target/riscv/pr67731.c: Likewise.
            * gcc.target/riscv/rvv/autovec/pr113206-1.c: Likewise.
            * gcc.target/riscv/rvv/autovec/unop/math-nearbyint-0.c: Likewise.
            * gcc.target/riscv/rvv/autovec/vls-vlmax/vec_extract-1u.c: Likewise.
            * gcc.target/riscv/rvv/autovec/vls-vlmax/vec_extract-2u.c: Likewise.
            * gcc.target/riscv/rvv/autovec/vls-vlmax/vec_extract-3u.c: Likewise.
            * gcc.target/riscv/rvv/autovec/vls-vlmax/vec_extract-4u.c: Likewise.
            * gcc.target/riscv/rvv/autovec/vls/calling-convention-1.c: Likewise.
            * gcc.target/riscv/rvv/autovec/vls/calling-convention-2.c: Likewise.
            * gcc.target/riscv/rvv/autovec/vls/calling-convention-3.c: Likewise.
            * gcc.target/riscv/rvv/autovec/vls/calling-convention-4.c: Likewise.
            * gcc.target/riscv/rvv/autovec/vls/calling-convention-5.c: Likewise.
            * gcc.target/riscv/rvv/autovec/vls/calling-convention-6.c: Likewise.
            * gcc.target/riscv/rvv/autovec/vls/calling-convention-7.c: Likewise.
            * gcc.target/riscv/rvv/base/float-point-dynamic-frm-39.c: Likewise.
            * gcc.target/riscv/rvv/base/float-point-dynamic-frm-41.c: Likewise.
            * gcc.target/riscv/rvv/base/float-point-dynamic-frm-45.c: Likewise.
            * gcc.target/riscv/rvv/base/float-point-dynamic-frm-46.c: Likewise.
            * gcc.target/riscv/rvv/base/float-point-dynamic-frm-48.c: Likewise.
            * gcc.target/riscv/rvv/base/float-point-dynamic-frm-49.c: Likewise.
            * gcc.target/riscv/rvv/base/float-point-dynamic-frm-50.c: Likewise.
            * gcc.target/riscv/rvv/base/float-point-dynamic-frm-52.c: Likewise.
            * gcc.target/riscv/rvv/base/float-point-dynamic-frm-56.c: Likewise.
            * gcc.target/riscv/rvv/base/float-point-dynamic-frm-59.c: Likewise.
            * gcc.target/riscv/rvv/base/float-point-dynamic-frm-60.c: Likewise.
            * gcc.target/riscv/rvv/base/float-point-dynamic-frm-61.c: Likewise.
            * gcc.target/riscv/rvv/base/float-point-dynamic-frm-62.c: Likewise.
            * gcc.target/riscv/rvv/base/float-point-dynamic-frm-64.c: Likewise.
            * gcc.target/riscv/rvv/base/float-point-dynamic-frm-65.c: Likewise.
            * gcc.target/riscv/rvv/base/float-point-dynamic-frm-66.c: Likewise.
            * gcc.target/riscv/rvv/base/float-point-dynamic-frm-67.c: Likewise.
            * gcc.target/riscv/rvv/base/float-point-dynamic-frm-68.c: Likewise.
            * gcc.target/riscv/rvv/base/float-point-dynamic-frm-69.c: Likewise.
            * gcc.target/riscv/rvv/base/float-point-dynamic-frm-70.c: Likewise.
            * gcc.target/riscv/rvv/base/float-point-dynamic-frm-71.c: Likewise.
            * gcc.target/riscv/rvv/base/float-point-frm-insert-4.c: Likewise.
            * gcc.target/riscv/rvv/base/float-point-frm-insert-5.c: Likewise.
            * gcc.target/riscv/rvv/base/pr114352-3.c: Likewise.
            * gcc.target/riscv/rvv/base/scalar_move-7.c: Likewise.
            * gcc.target/riscv/rvv/base/spill-10.c: Likewise.
            * gcc.target/riscv/rvv/base/spill-11.c: Likewise.
            * gcc.target/riscv/rvv/base/spill-12.c: Likewise.
            * gcc.target/riscv/rvv/base/spill-8.c: Likewise.
            * gcc.target/riscv/rvv/base/spill-9.c: Likewise.
            * gcc.target/riscv/rvv/base/vwaddsub-1.c: Likewise.
            * gcc.target/riscv/rvv/base/zvbb_vandn_vx_constraint.c: Likewise.
            * gcc.target/riscv/rvv/base/zvbc_vx_constraint-2.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/avl_multiple-3.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/avl_multiple-4.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/avl_single-4.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/avl_single-6.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/avl_single-66.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-1.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-2.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-3.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-4.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-5.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-6.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-1.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-10.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-14.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-15.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-16.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-17.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-18.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-19.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-20.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-21.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-22.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-23.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-25.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-27.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-28.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-29.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-3.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-30.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-31.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-35.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-37.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-7.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-8.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-9.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_bb_prop-17.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_bb_prop-18.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_bb_prop-19.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_bb_prop-20.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_conflict-11.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_switch_vtype-14.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_switch_vtype-15.c: Likewise.
            * gcc.target/riscv/rvv/vsetvl/vlmax_switch_vtype-16.c: Likewise.
            * gcc.target/riscv/slt-1.c: Likewise.
            * gcc.target/riscv/struct_vect_24.c: Likewise.

Diff:
---
 gcc/common/config/riscv/riscv-common.cc            |  4 +++
 gcc/config/riscv/riscv.cc                          | 32 ++++++++++++++++++++++
 gcc/config/riscv/riscv.opt                         |  4 +++
 gcc/config/riscv/riscv.opt.urls                    |  3 ++
 gcc/doc/invoke.texi                                | 15 ++++++++++
 gcc/testsuite/g++.dg/tree-prof/pr57451.C           |  1 +
 gcc/testsuite/g++.target/riscv/pr97682.C           |  2 +-
 gcc/testsuite/gcc.dg/tree-ssa/pr117973-1.c         |  1 +
 gcc/testsuite/gcc.dg/vect/vect-alias-check-4.c     |  1 +
 gcc/testsuite/gcc.target/riscv/pr67731.c           |  4 +--
 .../gcc.target/riscv/rvv/autovec/pr113206-1.c      |  2 +-
 .../riscv/rvv/autovec/unop/math-nearbyint-0.c      |  2 +-
 .../riscv/rvv/autovec/vls-vlmax/vec_extract-1u.c   |  2 +-
 .../riscv/rvv/autovec/vls-vlmax/vec_extract-2u.c   |  2 +-
 .../riscv/rvv/autovec/vls-vlmax/vec_extract-3u.c   |  2 +-
 .../riscv/rvv/autovec/vls-vlmax/vec_extract-4u.c   |  2 +-
 .../riscv/rvv/autovec/vls/calling-convention-1.c   |  2 +-
 .../riscv/rvv/autovec/vls/calling-convention-2.c   |  2 +-
 .../riscv/rvv/autovec/vls/calling-convention-3.c   |  2 +-
 .../riscv/rvv/autovec/vls/calling-convention-4.c   |  2 +-
 .../riscv/rvv/autovec/vls/calling-convention-5.c   |  2 +-
 .../riscv/rvv/autovec/vls/calling-convention-6.c   |  2 +-
 .../riscv/rvv/autovec/vls/calling-convention-7.c   |  2 +-
 .../riscv/rvv/base/float-point-dynamic-frm-39.c    |  2 +-
 .../riscv/rvv/base/float-point-dynamic-frm-41.c    |  2 +-
 .../riscv/rvv/base/float-point-dynamic-frm-45.c    |  2 +-
 .../riscv/rvv/base/float-point-dynamic-frm-46.c    |  2 +-
 .../riscv/rvv/base/float-point-dynamic-frm-48.c    |  2 +-
 .../riscv/rvv/base/float-point-dynamic-frm-49.c    |  2 +-
 .../riscv/rvv/base/float-point-dynamic-frm-50.c    |  2 +-
 .../riscv/rvv/base/float-point-dynamic-frm-52.c    |  2 +-
 .../riscv/rvv/base/float-point-dynamic-frm-56.c    |  2 +-
 .../riscv/rvv/base/float-point-dynamic-frm-59.c    |  2 +-
 .../riscv/rvv/base/float-point-dynamic-frm-60.c    |  2 +-
 .../riscv/rvv/base/float-point-dynamic-frm-61.c    |  2 +-
 .../riscv/rvv/base/float-point-dynamic-frm-62.c    |  2 +-
 .../riscv/rvv/base/float-point-dynamic-frm-64.c    |  2 +-
 .../riscv/rvv/base/float-point-dynamic-frm-65.c    |  2 +-
 .../riscv/rvv/base/float-point-dynamic-frm-66.c    |  2 +-
 .../riscv/rvv/base/float-point-dynamic-frm-67.c    |  2 +-
 .../riscv/rvv/base/float-point-dynamic-frm-68.c    |  2 +-
 .../riscv/rvv/base/float-point-dynamic-frm-69.c    |  2 +-
 .../riscv/rvv/base/float-point-dynamic-frm-70.c    |  2 +-
 .../riscv/rvv/base/float-point-dynamic-frm-71.c    |  2 +-
 .../riscv/rvv/base/float-point-frm-insert-4.c      |  2 +-
 .../riscv/rvv/base/float-point-frm-insert-5.c      |  2 +-
 .../gcc.target/riscv/rvv/base/pr114352-3.c         |  2 +-
 .../gcc.target/riscv/rvv/base/scalar_move-7.c      |  2 +-
 gcc/testsuite/gcc.target/riscv/rvv/base/spill-10.c |  2 +-
 gcc/testsuite/gcc.target/riscv/rvv/base/spill-11.c |  2 +-
 gcc/testsuite/gcc.target/riscv/rvv/base/spill-12.c |  2 +-
 gcc/testsuite/gcc.target/riscv/rvv/base/spill-8.c  |  2 +-
 gcc/testsuite/gcc.target/riscv/rvv/base/spill-9.c  |  2 +-
 .../gcc.target/riscv/rvv/base/vwaddsub-1.c         |  2 +-
 .../riscv/rvv/base/zvbb_vandn_vx_constraint.c      |  2 +-
 .../riscv/rvv/base/zvbc_vx_constraint-2.c          |  2 +-
 .../gcc.target/riscv/rvv/vsetvl/avl_multiple-3.c   |  2 +-
 .../gcc.target/riscv/rvv/vsetvl/avl_multiple-4.c   |  2 +-
 .../gcc.target/riscv/rvv/vsetvl/avl_single-4.c     |  2 +-
 .../gcc.target/riscv/rvv/vsetvl/avl_single-6.c     |  2 +-
 .../gcc.target/riscv/rvv/vsetvl/avl_single-66.c    |  2 +-
 .../riscv/rvv/vsetvl/imm_loop_invariant-1.c        |  2 +-
 .../riscv/rvv/vsetvl/imm_loop_invariant-2.c        |  2 +-
 .../riscv/rvv/vsetvl/imm_loop_invariant-3.c        |  2 +-
 .../riscv/rvv/vsetvl/imm_loop_invariant-4.c        |  2 +-
 .../riscv/rvv/vsetvl/imm_loop_invariant-5.c        |  2 +-
 .../riscv/rvv/vsetvl/imm_loop_invariant-6.c        |  2 +-
 .../riscv/rvv/vsetvl/vlmax_back_prop-1.c           |  2 +-
 .../riscv/rvv/vsetvl/vlmax_back_prop-10.c          |  2 +-
 .../riscv/rvv/vsetvl/vlmax_back_prop-14.c          |  2 +-
 .../riscv/rvv/vsetvl/vlmax_back_prop-15.c          |  2 +-
 .../riscv/rvv/vsetvl/vlmax_back_prop-16.c          |  2 +-
 .../riscv/rvv/vsetvl/vlmax_back_prop-17.c          |  2 +-
 .../riscv/rvv/vsetvl/vlmax_back_prop-18.c          |  2 +-
 .../riscv/rvv/vsetvl/vlmax_back_prop-19.c          |  2 +-
 .../riscv/rvv/vsetvl/vlmax_back_prop-20.c          |  2 +-
 .../riscv/rvv/vsetvl/vlmax_back_prop-21.c          |  2 +-
 .../riscv/rvv/vsetvl/vlmax_back_prop-22.c          |  2 +-
 .../riscv/rvv/vsetvl/vlmax_back_prop-23.c          |  2 +-
 .../riscv/rvv/vsetvl/vlmax_back_prop-25.c          |  2 +-
 .../riscv/rvv/vsetvl/vlmax_back_prop-27.c          |  2 +-
 .../riscv/rvv/vsetvl/vlmax_back_prop-28.c          |  2 +-
 .../riscv/rvv/vsetvl/vlmax_back_prop-29.c          |  2 +-
 .../riscv/rvv/vsetvl/vlmax_back_prop-3.c           |  2 +-
 .../riscv/rvv/vsetvl/vlmax_back_prop-30.c          |  2 +-
 .../riscv/rvv/vsetvl/vlmax_back_prop-31.c          |  2 +-
 .../riscv/rvv/vsetvl/vlmax_back_prop-35.c          |  2 +-
 .../riscv/rvv/vsetvl/vlmax_back_prop-37.c          |  2 +-
 .../riscv/rvv/vsetvl/vlmax_back_prop-7.c           |  2 +-
 .../riscv/rvv/vsetvl/vlmax_back_prop-8.c           |  2 +-
 .../riscv/rvv/vsetvl/vlmax_back_prop-9.c           |  2 +-
 .../gcc.target/riscv/rvv/vsetvl/vlmax_bb_prop-17.c |  2 +-
 .../gcc.target/riscv/rvv/vsetvl/vlmax_bb_prop-18.c |  2 +-
 .../gcc.target/riscv/rvv/vsetvl/vlmax_bb_prop-19.c |  2 +-
 .../gcc.target/riscv/rvv/vsetvl/vlmax_bb_prop-20.c |  2 +-
 .../riscv/rvv/vsetvl/vlmax_conflict-11.c           |  2 +-
 .../riscv/rvv/vsetvl/vlmax_switch_vtype-14.c       |  2 +-
 .../riscv/rvv/vsetvl/vlmax_switch_vtype-15.c       |  2 +-
 .../riscv/rvv/vsetvl/vlmax_switch_vtype-16.c       |  2 +-
 gcc/testsuite/gcc.target/riscv/slt-1.c             |  2 +-
 gcc/testsuite/gcc.target/riscv/struct_vect_24.c    |  2 +-
 gcc/testsuite/gcc.target/riscv/unroll-explicit.c   | 22 +++++++++++++++
 gcc/testsuite/gcc.target/riscv/unroll-large-loop.c | 22 +++++++++++++++
 gcc/testsuite/gcc.target/riscv/unroll-pragma.c     | 23 ++++++++++++++++
 .../gcc.target/riscv/unroll-small-loop-tune.c      | 22 +++++++++++++++
 gcc/testsuite/gcc.target/riscv/unroll-small-loop.c | 19 +++++++++++++
 106 files changed, 263 insertions(+), 94 deletions(-)

diff --git a/gcc/common/config/riscv/riscv-common.cc 
b/gcc/common/config/riscv/riscv-common.cc
index 0ecfd814eba9..783692076a75 100644
--- a/gcc/common/config/riscv/riscv-common.cc
+++ b/gcc/common/config/riscv/riscv-common.cc
@@ -2351,6 +2351,10 @@ static const struct default_options 
riscv_option_optimization_table[] =
     /* Enable -fsched-pressure starting at -O1.  */
     { OPT_LEVELS_1_PLUS, OPT_fsched_pressure, NULL, 1 },
     { OPT_LEVELS_2_PLUS, OPT_free, NULL, 1 },
+    /* Turn on -funroll-loops with -munroll-only-small-loops to enable small
+       loop unrolling at -O2 and above.  */
+    { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_funroll_loops, NULL, 1 },
+    { OPT_LEVELS_2_PLUS_SPEED_ONLY, OPT_munroll_only_small_loops, NULL, 1 },
 #if TARGET_DEFAULT_ASYNC_UNWIND_TABLES == 1
     { OPT_LEVELS_ALL, OPT_fasynchronous_unwind_tables, NULL, 1 },
     { OPT_LEVELS_ALL, OPT_funwind_tables, NULL, 1},
diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
index 251da7c09998..a8b3bef6c2b7 100644
--- a/gcc/config/riscv/riscv.cc
+++ b/gcc/config/riscv/riscv.cc
@@ -300,6 +300,8 @@ struct riscv_tune_param
   const char *jump_align;
   const char *loop_align;
   bool prefer_agnostic;
+  unsigned int small_loop_unroll_ninsns = 4;
+  unsigned int small_loop_unroll_factor = 2;
 };
 
 
@@ -734,6 +736,8 @@ static const struct riscv_tune_param xt_c9501_tune_info = {
   "8",                                         /* jump_align */
   "16",                                                /* loop_align */
   true,                                                /* prefer-agnostic.  */
+  4,   /* small_loop_unroll_ninsns.  */
+  8,   /* small_loop_unroll_factor.  */
 };
 
 /* Costs to use when optimizing for Tenstorrent Ascalon 8 wide.  */
@@ -5080,6 +5084,22 @@ riscv_insn_cost (rtx_insn *insn, bool speed)
   return cost;
 }
 
+/* This function adjusts the unroll factor based on
+   the current tune parameters.  */
+
+static unsigned
+riscv_loop_unroll_adjust (unsigned nunroll, class loop *loop)
+{
+  if (riscv_unroll_only_small_loops && !loop->unroll)
+    {
+      if (loop->ninsns <= tune_param->small_loop_unroll_ninsns)
+       return MIN (tune_param->small_loop_unroll_factor, nunroll);
+      else
+       return 1;
+    }
+  return nunroll;
+}
+
 /* Implement TARGET_MAX_NOCE_IFCVT_SEQ_COST.  Like the default implementation,
    but we consider cost units of branch instructions equal to cost units of
    other instructions.  */
@@ -12164,6 +12184,16 @@ riscv_option_override (void)
 
   flag_pcc_struct_return = 0;
 
+  /* Explicit -funroll-loops or -funroll-all-loops turns
+     -munroll-only-small-loops off, allowing the unroller to handle
+     all loops without the conservative small-loop restriction.  */
+  if ((OPTION_SET_P (flag_unroll_loops) && flag_unroll_loops)
+      || (OPTION_SET_P (flag_unroll_all_loops) && flag_unroll_all_loops))
+    {
+      if (!OPTION_SET_P (riscv_unroll_only_small_loops))
+       riscv_unroll_only_small_loops = 0;
+    }
+
   if (flag_pic)
     g_switch_value = 0;
 
@@ -16575,6 +16605,8 @@ riscv_memtag_tag_bitsize ()
 #define TARGET_RTX_COSTS riscv_rtx_costs
 #undef TARGET_ADDRESS_COST
 #define TARGET_ADDRESS_COST riscv_address_cost
+#undef TARGET_LOOP_UNROLL_ADJUST
+#define TARGET_LOOP_UNROLL_ADJUST riscv_loop_unroll_adjust
 #undef TARGET_INSN_COST
 #define TARGET_INSN_COST riscv_insn_cost
 
diff --git a/gcc/config/riscv/riscv.opt b/gcc/config/riscv/riscv.opt
index c2670ad87b20..3226367bf8a9 100644
--- a/gcc/config/riscv/riscv.opt
+++ b/gcc/config/riscv/riscv.opt
@@ -454,3 +454,7 @@ Enum(arcv_mpy_option) String(10c) Value(ARCV_MPY_OPTION_10C)
 mmpy-option=
 Target RejectNegative Joined Enum(arcv_mpy_option) Var(arcv_mpy_option) 
Init(ARCV_MPY_OPTION_2C)
 The type of MPY unit used by the RMX-100 core (to be used in combination with 
-mtune=arc-v-rmx-100-series) (default: 2c).
+
+munroll-only-small-loops
+Target Var(riscv_unroll_only_small_loops) Init(0) Save
+Enable conservative small loop unrolling.
diff --git a/gcc/config/riscv/riscv.opt.urls b/gcc/config/riscv/riscv.opt.urls
index a11299b310af..15c1a8badc7c 100644
--- a/gcc/config/riscv/riscv.opt.urls
+++ b/gcc/config/riscv/riscv.opt.urls
@@ -129,3 +129,6 @@ UrlSuffix(gcc/RISC-V-Options.html#index-mautovec-segment)
 
 ; skipping UrlSuffix for 'mmpy-option=' due to finding no URLs
 
+munroll-only-small-loops
+UrlSuffix(gcc/RISC-V-Options.html#index-munroll-only-small-loops)
+
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 455ea08d7c73..535ad6ba3ffe 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -1349,6 +1349,7 @@ See RS/6000 and PowerPC Options.
 -mno-inline-atomics  -mno-inline-strlen
 -mno-inline-strcmp  -mno-inline-strncmp
 -mstringop-strategy=@var{strategy}
+-munroll-only-small-loops  -mno-unroll-only-small-loops
 -mtls-dialect=desc  -mtls-dialect=trad
 -mrvv-vector-bits=@var{value}  -mrvv-max-lmul=@var{value}
 -madjust-lmul-cost  -mmax-vectorization  -mno-autovec-segment}
@@ -31565,6 +31566,20 @@ of TLS variables.
 Use traditional TLS as the thread-local storage mechanism for dynamic accesses
 of TLS variables.  This is the default.
 
+@opindex munroll-only-small-loops
+@opindex mno-unroll-only-small-loops
+@item -munroll-only-small-loops
+@itemx -mno-unroll-only-small-loops
+Controls conservative small loop unrolling.  It is enabled by default at
+@option{-O2} and above.  When enabled, only loops whose RTL instruction
+count does not exceed a tune-specific threshold are unrolled, and the
+unroll factor is capped by a tune-specific parameter.  This gives better
+utilization of the instruction decoding pipeline without enlarging bigger
+loops.  You can disable it with @option{-mno-unroll-only-small-loops}; it
+is also turned off when @option{-funroll-loops} or
+@option{-funroll-all-loops} is explicitly enabled, so that an explicit
+unrolling request applies to loops of any size.
+
 @opindex mrvv-vector-bits
 @item -mrvv-vector-bits=@var{value}
 Specify how the number of bits for an RVV vector register, as taken from
diff --git a/gcc/testsuite/g++.dg/tree-prof/pr57451.C 
b/gcc/testsuite/g++.dg/tree-prof/pr57451.C
index 8fbc1214095b..44a1dc263935 100644
--- a/gcc/testsuite/g++.dg/tree-prof/pr57451.C
+++ b/gcc/testsuite/g++.dg/tree-prof/pr57451.C
@@ -1,6 +1,7 @@
 // Explicit { dg-require-effective-target exceptions_enabled } so that 
dependent tests don't turn UNRESOLVED for '-fno-exceptions'.
 // { dg-require-effective-target freorder }
 // { dg-options "-O2 -freorder-blocks-and-partition -g" }
+/* { dg-additional-options "-fno-unroll-loops" { target riscv*-*-* } } */
 
 extern "C" void abort (void);
 struct MyException {};
diff --git a/gcc/testsuite/g++.target/riscv/pr97682.C 
b/gcc/testsuite/g++.target/riscv/pr97682.C
index 03c7a447de59..68e332a9993d 100644
--- a/gcc/testsuite/g++.target/riscv/pr97682.C
+++ b/gcc/testsuite/g++.target/riscv/pr97682.C
@@ -1,6 +1,6 @@
 /* PR target/97682 */
 /* { dg-do compile } */
-/* { dg-options "-fPIC -O2 -march=rv64g -mabi=lp64" } */
+/* { dg-options "-fPIC -O2 -march=rv64g -mabi=lp64 -fno-unroll-loops" } */
 
 template <typename ab, int ac> struct g { ab b[ac]; };
 long i, m;
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr117973-1.c 
b/gcc/testsuite/gcc.dg/tree-ssa/pr117973-1.c
index 6523b3ce59fe..aa4708ae6702 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr117973-1.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr117973-1.c
@@ -1,5 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-O2 -fdump-tree-optimized --param 
logical-op-non-short-circuit=0" } */
+/* { dg-additional-options "-fno-unroll-loops" { target riscv*-*-* } } */
 /* PR tree-optimization/117973 */
 #include "pr111456-1.c"
 
diff --git a/gcc/testsuite/gcc.dg/vect/vect-alias-check-4.c 
b/gcc/testsuite/gcc.dg/vect/vect-alias-check-4.c
index 750193e3cd43..136b04ef1a75 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-alias-check-4.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-alias-check-4.c
@@ -1,6 +1,7 @@
 /* { dg-do compile } */
 /* { dg-require-effective-target vect_int } */
 /* { dg-additional-options "--param vect-max-version-for-alias-checks=0 
-fopt-info-vec-all" } */
+/* { dg-additional-options "-fno-unroll-loops" { target riscv*-*-* } } */
 
 #define N 16
 
diff --git a/gcc/testsuite/gcc.target/riscv/pr67731.c 
b/gcc/testsuite/gcc.target/riscv/pr67731.c
index 4e6f609e24df..e0985aac1f46 100644
--- a/gcc/testsuite/gcc.target/riscv/pr67731.c
+++ b/gcc/testsuite/gcc.target/riscv/pr67731.c
@@ -1,6 +1,6 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -march=rv64gcbv -mabi=lp64d" { target { rv64 } } } */
-/* { dg-options "-O2 -march=rv32gcbv -mabi=ilp32" { target { rv32 } } } */
+/* { dg-options "-O2 -march=rv64gcbv -mabi=lp64d -fno-unroll-loops" { target { 
rv64 } } } */
+/* { dg-options "-O2 -march=rv32gcbv -mabi=ilp32 -fno-unroll-loops" { target { 
rv32 } } } */
 
 typedef struct
 {
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113206-1.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113206-1.c
index 45086182aa89..c8e4400b5556 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113206-1.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/pr113206-1.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv -mabi=lp64d -O3 -mrvv-max-lmul=m8" } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d -O3 -mrvv-max-lmul=m8 
-fno-unroll-loops" } */
 
 signed char e;
 short f = 8;
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/math-nearbyint-0.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/math-nearbyint-0.c
index 85d5e0acab2d..1d8dc73e633b 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/math-nearbyint-0.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/unop/math-nearbyint-0.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv_zvfh -mabi=lp64d -O3 -ftree-vectorize 
-fno-vect-cost-model -ffast-math -fno-schedule-insns -fno-schedule-insns2" } */
+/* { dg-options "-march=rv64gcv_zvfh -mabi=lp64d -O3 -ftree-vectorize 
-fno-vect-cost-model -ffast-math -fno-schedule-insns -fno-schedule-insns2 
-fno-unroll-loops" } */
 /* { dg-final { check-function-bodies "**" "" } } */
 
 #include "test-math.h"
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/vec_extract-1u.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/vec_extract-1u.c
index 14334ba1a947..9552d09f48d0 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/vec_extract-1u.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/vec_extract-1u.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-additional-options "-march=rv64gcv -mabi=lp64d -Wno-pedantic" } */
+/* { dg-additional-options "-march=rv64gcv -mabi=lp64d -Wno-pedantic 
-fno-unroll-loops" } */
 
 #include <stdint-gcc.h>
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/vec_extract-2u.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/vec_extract-2u.c
index b9865948087a..fd297e1a6f0c 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/vec_extract-2u.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/vec_extract-2u.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-additional-options "-march=rv64gcv -mabi=lp64d -Wno-pedantic" } */
+/* { dg-additional-options "-march=rv64gcv -mabi=lp64d -Wno-pedantic 
-fno-unroll-loops" } */
 
 #include <stdint-gcc.h>
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/vec_extract-3u.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/vec_extract-3u.c
index 552c48ecc490..1dca3a337a4f 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/vec_extract-3u.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/vec_extract-3u.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-additional-options "-march=rv64gcv -mabi=lp64d -Wno-pedantic" } */
+/* { dg-additional-options "-march=rv64gcv -mabi=lp64d -Wno-pedantic 
-fno-unroll-loops" } */
 
 #include <stdint-gcc.h>
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/vec_extract-4u.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/vec_extract-4u.c
index 36d4926e4f88..7fcf21271db1 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/vec_extract-4u.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls-vlmax/vec_extract-4u.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-additional-options "-march=rv64gcv -mabi=lp64d -Wno-pedantic" } */
+/* { dg-additional-options "-march=rv64gcv -mabi=lp64d -Wno-pedantic 
-fno-unroll-loops" } */
 
 #include <stdint-gcc.h>
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-1.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-1.c
index 86c2400ce513..4a1ec041898a 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-1.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-1.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv_zvl4096b -mrvv-vector-bits=scalable 
-mabi=lp64d -O3 -fno-schedule-insns2 -mrvv-max-lmul=m8" } */
+/* { dg-options "-march=rv64gcv_zvl4096b -mrvv-vector-bits=scalable 
-mabi=lp64d -O3 -fno-schedule-insns2 -mrvv-max-lmul=m8 -fno-unroll-loops" } */
 
 #include "def.h"
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-2.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-2.c
index c489a9ff7966..c2ab5ea9d285 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-2.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-2.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv_zvl4096b -mrvv-vector-bits=scalable 
-mabi=lp64d -O3 -fno-schedule-insns2 -mrvv-max-lmul=m8" } */
+/* { dg-options "-march=rv64gcv_zvl4096b -mrvv-vector-bits=scalable 
-mabi=lp64d -O3 -fno-schedule-insns2 -mrvv-max-lmul=m8 -fno-unroll-loops" } */
 
 #include "def.h"
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-3.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-3.c
index 97a3282a6570..7c9d23e748b7 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-3.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-3.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv_zvl4096b -mrvv-vector-bits=scalable 
-mabi=lp64d -O3 -fno-schedule-insns2 -mrvv-max-lmul=m8" } */
+/* { dg-options "-march=rv64gcv_zvl4096b -mrvv-vector-bits=scalable 
-mabi=lp64d -O3 -fno-schedule-insns2 -mrvv-max-lmul=m8 -fno-unroll-loops" } */
 
 #include "def.h"
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-4.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-4.c
index a892919feb7c..f0cccf761553 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-4.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-4.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv_zvl4096b -mrvv-vector-bits=scalable 
-mabi=lp64d -O3 -fno-schedule-insns2 -mrvv-max-lmul=m8" } */
+/* { dg-options "-march=rv64gcv_zvl4096b -mrvv-vector-bits=scalable 
-mabi=lp64d -O3 -fno-schedule-insns2 -mrvv-max-lmul=m8 -fno-unroll-loops" } */
 
 #include "def.h"
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-5.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-5.c
index 0d40349fb0f8..b1c7570d0ea1 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-5.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-5.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv_zvfh_zvl4096b -mrvv-vector-bits=scalable 
-mabi=lp64d -O3 -fno-schedule-insns2 -mrvv-max-lmul=m8" } */
+/* { dg-options "-march=rv64gcv_zvfh_zvl4096b -mrvv-vector-bits=scalable 
-mabi=lp64d -O3 -fno-schedule-insns2 -mrvv-max-lmul=m8 -fno-unroll-loops" } */
 
 #include "def.h"
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-6.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-6.c
index 8b5a779467db..72080058be5d 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-6.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-6.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv_zvl4096b -mrvv-vector-bits=scalable 
-mabi=lp64d -O3 -fno-schedule-insns2 -mrvv-max-lmul=m8" } */
+/* { dg-options "-march=rv64gcv_zvl4096b -mrvv-vector-bits=scalable 
-mabi=lp64d -O3 -fno-schedule-insns2 -mrvv-max-lmul=m8 -fno-unroll-loops" } */
 
 #include "def.h"
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-7.c 
b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-7.c
index 3ba4e1f18642..10f6f1dc6085 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-7.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/autovec/vls/calling-convention-7.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv_zvl4096b -mrvv-vector-bits=scalable 
-mabi=lp64d -O3 -fno-schedule-insns2 -mrvv-max-lmul=m8" } */
+/* { dg-options "-march=rv64gcv_zvl4096b -mrvv-vector-bits=scalable 
-mabi=lp64d -O3 -fno-schedule-insns2 -mrvv-max-lmul=m8 -fno-unroll-loops" } */
 
 #include "def.h"
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-39.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-39.c
index fe497c757db8..5507706ea7e6 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-39.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-39.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */
+/* { dg-options "-march=rv64gcv -mabi=lp64 -O3 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-41.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-41.c
index 4f86fcb938a9..5b2835ddf919 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-41.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-41.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */
+/* { dg-options "-march=rv64gcv -mabi=lp64 -O3 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-45.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-45.c
index 69ccd4fe04d2..029695a79ea9 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-45.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-45.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */
+/* { dg-options "-march=rv64gcv -mabi=lp64 -O3 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-46.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-46.c
index a11a1b45f509..471f68bba9ce 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-46.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-46.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */
+/* { dg-options "-march=rv64gcv -mabi=lp64 -O3 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-48.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-48.c
index 2855d5f45624..3b8fb1582865 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-48.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-48.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */
+/* { dg-options "-march=rv64gcv -mabi=lp64 -O3 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-49.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-49.c
index 3e8a9808ba7e..b2cbbd7b0f4f 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-49.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-49.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */
+/* { dg-options "-march=rv64gcv -mabi=lp64 -O3 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-50.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-50.c
index e8fc7bbd6c28..f8d7c77497ac 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-50.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-50.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */
+/* { dg-options "-march=rv64gcv -mabi=lp64 -O3 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-52.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-52.c
index 9828987d7d26..1579392fa187 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-52.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-52.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */
+/* { dg-options "-march=rv64gcv -mabi=lp64 -O3 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-56.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-56.c
index aa9c06f625cc..7cef51d93299 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-56.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-56.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */
+/* { dg-options "-march=rv64gcv -mabi=lp64 -O3 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-59.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-59.c
index 8a752697cd84..f22e389f05b1 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-59.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-59.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */
+/* { dg-options "-march=rv64gcv -mabi=lp64 -O3 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-60.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-60.c
index 96f009185cc0..4a89eb0ff01a 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-60.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-60.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */
+/* { dg-options "-march=rv64gcv -mabi=lp64 -O3 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-61.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-61.c
index 5028b789192a..995400ed2a83 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-61.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-61.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */
+/* { dg-options "-march=rv64gcv -mabi=lp64 -O3 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-62.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-62.c
index 44bf9ffd0593..3dac687db137 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-62.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-62.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */
+/* { dg-options "-march=rv64gcv -mabi=lp64 -O3 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-64.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-64.c
index 45c8b8408de6..0f2bbf0b1f7a 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-64.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-64.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */
+/* { dg-options "-march=rv64gcv -mabi=lp64 -O3 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-65.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-65.c
index 329f98c5c1a9..8efc2d468814 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-65.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-65.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */
+/* { dg-options "-march=rv64gcv -mabi=lp64 -O3 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-66.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-66.c
index b9240f24ec75..064c93369af8 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-66.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-66.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */
+/* { dg-options "-march=rv64gcv -mabi=lp64 -O3 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-67.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-67.c
index 2008cc60b461..9bc910f2daad 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-67.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-67.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */
+/* { dg-options "-march=rv64gcv -mabi=lp64 -O3 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-68.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-68.c
index cad2f1d5f9c6..30371f600cf9 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-68.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-68.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */
+/* { dg-options "-march=rv64gcv -mabi=lp64 -O3 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-69.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-69.c
index a971103c3ee2..ef1bdfc45d78 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-69.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-69.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */
+/* { dg-options "-march=rv64gcv -mabi=lp64 -O3 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-70.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-70.c
index b1c51924567e..6f3cd43dd03a 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-70.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-70.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */
+/* { dg-options "-march=rv64gcv -mabi=lp64 -O3 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git 
a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-71.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-71.c
index c3170556d2f9..bb054f9b9962 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-71.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-dynamic-frm-71.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */
+/* { dg-options "-march=rv64gcv -mabi=lp64 -O3 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-frm-insert-4.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-frm-insert-4.c
index 17e47eb0f414..2398d26b4774 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-frm-insert-4.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-frm-insert-4.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */
+/* { dg-options "-march=rv64gcv -mabi=lp64 -O3 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-frm-insert-5.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-frm-insert-5.c
index 32c938db123f..ee097dc6be98 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-frm-insert-5.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/float-point-frm-insert-5.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */
+/* { dg-options "-march=rv64gcv -mabi=lp64 -O3 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/pr114352-3.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/pr114352-3.c
index 4f375e526be9..f3dfb33df7b7 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/pr114352-3.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/pr114352-3.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gc -mabi=lp64 -O3 -fno-schedule-insns 
-fno-schedule-insns2" } */
+/* { dg-options "-march=rv64gc -mabi=lp64 -O3 -fno-schedule-insns 
-fno-schedule-insns2 -fno-unroll-loops" } */
 /* { dg-final { check-function-bodies "**" "" } } */
 
 /*
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/scalar_move-7.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/scalar_move-7.c
index cf53aca5c629..4897a22e4721 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/scalar_move-7.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/scalar_move-7.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gcv -mabi=lp64d -fno-schedule-insns 
-fno-schedule-insns2 -O3" } */
+/* { dg-options "-march=rv64gcv -mabi=lp64d -fno-schedule-insns 
-fno-schedule-insns2 -O3 -fno-unroll-loops" } */
 /* { dg-final { check-function-bodies "**" "" } } */
 
 #include "riscv_vector.h"
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/spill-10.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/spill-10.c
index d5a839a2ce9e..67954af0fd50 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/spill-10.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/spill-10.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv32gcv -mabi=ilp32 -mpreferred-stack-boundary=3 
-fno-schedule-insns -fno-schedule-insns2 -O3" } */
+/* { dg-options "-march=rv32gcv -mabi=ilp32 -mpreferred-stack-boundary=3 
-fno-schedule-insns -fno-schedule-insns2 -O3 -fno-unroll-loops" } */
 /* { dg-final { check-function-bodies "**" "" } } */
 
 #include "riscv_vector.h"
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/spill-11.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/spill-11.c
index cbfe92105147..5fd4b30f53de 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/spill-11.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/spill-11.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-msave-restore -march=rv32gc_zve64d -mabi=ilp32 
-msave-restore -fno-schedule-insns -fno-schedule-insns2 -O3" } */
+/* { dg-options "-msave-restore -march=rv32gc_zve64d -mabi=ilp32 
-msave-restore -fno-schedule-insns -fno-schedule-insns2 -O3 -fno-unroll-loops" 
} */
 /* { dg-final { check-function-bodies "**" "" } } */
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/spill-12.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/spill-12.c
index 7e83cb7b7c1c..65566d6b09e1 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/spill-12.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/spill-12.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv32gcv -mabi=ilp32 -msave-restore -fno-schedule-insns 
-fno-schedule-insns2 -O3" } */
+/* { dg-options "-march=rv32gcv -mabi=ilp32 -msave-restore -fno-schedule-insns 
-fno-schedule-insns2 -O3 -fno-unroll-loops" } */
 /* { dg-final { check-function-bodies "**" "" } } */
 
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/spill-8.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/spill-8.c
index ddc36e888eb4..a3e7c9898e8c 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/spill-8.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/spill-8.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv32gcv -mabi=ilp32 -fno-schedule-insns 
-fno-schedule-insns2 -O3" } */
+/* { dg-options "-march=rv32gcv -mabi=ilp32 -fno-schedule-insns 
-fno-schedule-insns2 -O3 -fno-unroll-loops" } */
 /* { dg-final { check-function-bodies "**" "" } } */
 
 void f2 (char*);
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/spill-9.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/spill-9.c
index 375d3166a468..c0c424c64ae2 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/spill-9.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/spill-9.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv32gc_zve64d -mabi=ilp32 -fno-schedule-insns 
-fno-schedule-insns2 -O3" } */
+/* { dg-options "-march=rv32gc_zve64d -mabi=ilp32 -fno-schedule-insns 
-fno-schedule-insns2 -O3 -fno-unroll-loops" } */
 /* { dg-final { check-function-bodies "**" "" } } */
 
 #include "riscv_vector.h"
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/vwaddsub-1.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/vwaddsub-1.c
index bd3b16829a64..af5cfadf6c32 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/vwaddsub-1.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/vwaddsub-1.c
@@ -1,6 +1,6 @@
 /* { dg-do compile { target { { ! riscv_abi_e } && rv64 } } } */
 /* { dg-add-options riscv_v } */
-/* { dg-additional-options "-std=gnu99 -O3 -fno-schedule-insns 
-fno-schedule-insns2 -Wno-pedantic" } */
+/* { dg-additional-options "-std=gnu99 -O3 -fno-schedule-insns 
-fno-schedule-insns2 -Wno-pedantic -fno-unroll-loops" } */
 
 #include <stdint.h>
 #include "riscv_vector.h"
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/zvbb_vandn_vx_constraint.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/zvbb_vandn_vx_constraint.c
index 0d626095544a..e70b1e326bcd 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/zvbb_vandn_vx_constraint.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/zvbb_vandn_vx_constraint.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv32gc_zvbb_zve64x -mabi=ilp32 -O3" } */
+/* { dg-options "-march=rv32gc_zvbb_zve64x -mabi=ilp32 -O3 -fno-unroll-loops" 
} */
 #include "riscv_vector.h"
 
 vuint64m1_t test_vandn_vx_u64m1(vuint64m1_t vs2, uint64_t rs1, size_t vl) {
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/base/zvbc_vx_constraint-2.c 
b/gcc/testsuite/gcc.target/riscv/rvv/base/zvbc_vx_constraint-2.c
index 3fb14660af8d..daec087be730 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/base/zvbc_vx_constraint-2.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/base/zvbc_vx_constraint-2.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gc_zvbc -mabi=lp64d -O3" } */
+/* { dg-options "-march=rv64gc_zvbc -mabi=lp64d -O3 -fno-unroll-loops" } */
 #include "riscv_vector.h"
 
 vuint64m1_t test_vclmul_vx_u64m1_extend(vuint64m1_t vs2, uint32_t rs1, size_t 
vl) {
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/avl_multiple-3.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/avl_multiple-3.c
index 2ec94b2e4827..9954e3538ab5 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/avl_multiple-3.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/avl_multiple-3.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-schedule-insns -fno-schedule-insns2" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-schedule-insns -fno-schedule-insns2 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/avl_multiple-4.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/avl_multiple-4.c
index 5f2ef672c903..26884589a4e2 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/avl_multiple-4.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/avl_multiple-4.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-schedule-insns -fno-schedule-insns2" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-schedule-insns -fno-schedule-insns2 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/avl_single-4.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/avl_single-4.c
index cf2ece80beff..aef7377e5228 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/avl_single-4.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/avl_single-4.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-schedule-insns -fno-schedule-insns2" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-schedule-insns -fno-schedule-insns2 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/avl_single-6.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/avl_single-6.c
index b6776cd9713e..ef179d09018c 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/avl_single-6.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/avl_single-6.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-schedule-insns -fno-schedule-insns2" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-schedule-insns -fno-schedule-insns2 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/avl_single-66.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/avl_single-66.c
index c174845f7bc6..38ed49455e7f 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/avl_single-66.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/avl_single-66.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -fno-schedule-insns -fno-schedule-insns2" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -fno-schedule-insns -fno-schedule-insns2 -fno-unroll-loops" 
} */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-1.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-1.c
index cee9e36ff2d3..ad968b03abc8 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-1.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-1.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-schedule-insns -fno-schedule-insns2" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-schedule-insns -fno-schedule-insns2 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-2.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-2.c
index 46b79ce23134..19abe42d5bd6 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-2.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-2.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-schedule-insns -fno-schedule-insns2" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-schedule-insns -fno-schedule-insns2 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-3.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-3.c
index 05604f83974f..19d79637665e 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-3.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-3.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-schedule-insns -fno-schedule-insns2" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-schedule-insns -fno-schedule-insns2 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-4.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-4.c
index b55f74a323c9..b2a85af55c4c 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-4.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-4.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-schedule-insns -fno-schedule-insns2" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-schedule-insns -fno-schedule-insns2 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-5.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-5.c
index 50874c9acb6d..eb2eb78a8747 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-5.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-5.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-schedule-insns -fno-schedule-insns2" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-schedule-insns -fno-schedule-insns2 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-6.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-6.c
index 63039357fe87..20d7aafa2326 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-6.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/imm_loop_invariant-6.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-schedule-insns -fno-schedule-insns2" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-schedule-insns -fno-schedule-insns2 -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-1.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-1.c
index bfa81ba8294e..f79bb848e0d9 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-1.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-1.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-10.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-10.c
index 4ba81601c294..f2f445db290a 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-10.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-10.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-14.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-14.c
index e10f12ea2059..ad8696903441 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-14.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-14.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-15.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-15.c
index 54074836e1d1..662289275a68 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-15.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-15.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-16.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-16.c
index e2963ddac150..fc1bf6ed894e 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-16.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-16.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-17.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-17.c
index aa18c3a6180c..9c7940c02449 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-17.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-17.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-18.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-18.c
index 81eba9ea2597..1bdb2d2851a6 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-18.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-18.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-19.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-19.c
index a7c1478b2a80..ed7adb82c207 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-19.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-19.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-20.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-20.c
index aa18c3a6180c..9c7940c02449 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-20.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-20.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-21.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-21.c
index 5f770ae0257c..38a6e3cfc665 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-21.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-21.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-22.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-22.c
index dc012c8c1d2d..b6251e7aca7a 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-22.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-22.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-23.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-23.c
index 18700d518e9b..40dfa3f973d5 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-23.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-23.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-25.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-25.c
index c2284c822361..74e10cdd0a01 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-25.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-25.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-27.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-27.c
index ffa95f90e498..a9f1a8d7a10d 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-27.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-27.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-28.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-28.c
index d997762f8775..1fce7ebc46ed 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-28.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-28.c
@@ -1,7 +1,7 @@
 /* { dg-do compile } */
 /* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize" } */
 // PR113249
-/* { dg-additional-options "-fno-schedule-insns -fno-schedule-insns2" } */
+/* { dg-additional-options "-fno-schedule-insns -fno-schedule-insns2 
-fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-29.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-29.c
index 2b3722decd85..76867b451250 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-29.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-29.c
@@ -1,7 +1,7 @@
 /* { dg-do compile } */
 /* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize" } */
 // PR113249
-/* { dg-additional-options "-fno-schedule-insns -fno-schedule-insns2" } */
+/* { dg-additional-options "-fno-schedule-insns -fno-schedule-insns2 
-fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-3.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-3.c
index af46a81de6fa..ac13999dd0dd 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-3.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-3.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-30.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-30.c
index 4c977e4e169d..10eb6af82147 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-30.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-30.c
@@ -1,6 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize" } */
-/* { dg-additional-options "-fno-schedule-insns -fno-schedule-insns2" } */
+/* { dg-additional-options "-fno-schedule-insns -fno-schedule-insns2 
-fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-31.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-31.c
index 2e2fc0282c9a..1724c5ebc32a 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-31.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-31.c
@@ -1,6 +1,6 @@
 /* { dg-do compile } */
 /* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize" } */
-/* { dg-additional-options "-fno-schedule-insns -fno-schedule-insns2" } */
+/* { dg-additional-options "-fno-schedule-insns -fno-schedule-insns2 
-fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-35.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-35.c
index 4de390c249c5..6ae36ba8793c 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-35.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-35.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-37.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-37.c
index 945beed5ebb3..b864d6f0dd90 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-37.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-37.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-7.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-7.c
index 8e613899509c..a82e90d33e56 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-7.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-7.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-8.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-8.c
index 15e82e08d89f..f26ed8f97d7e 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-8.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-8.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-9.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-9.c
index d1a6a944f40c..752c12c5fdbd 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-9.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_back_prop-9.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_bb_prop-17.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_bb_prop-17.c
index 321eb3b9f298..ee37b53507dc 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_bb_prop-17.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_bb_prop-17.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -mtune=rocket" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -mtune=rocket -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_bb_prop-18.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_bb_prop-18.c
index 29dcfefbd0cf..4aa06ca09dd1 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_bb_prop-18.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_bb_prop-18.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -mtune=rocket" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -mtune=rocket -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_bb_prop-19.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_bb_prop-19.c
index 8b6299e99d1f..f13f02f47646 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_bb_prop-19.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_bb_prop-19.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -mtune=rocket" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -mtune=rocket -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_bb_prop-20.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_bb_prop-20.c
index 3b836f927d20..a6ffa12a6817 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_bb_prop-20.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_bb_prop-20.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -mtune=rocket" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -mtune=rocket -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_conflict-11.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_conflict-11.c
index ddc3f2c22a6b..49f28eb846c8 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_conflict-11.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_conflict-11.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-tree-vectorize -fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_switch_vtype-14.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_switch_vtype-14.c
index a48bce08596c..7aca370e47f9 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_switch_vtype-14.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_switch_vtype-14.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_switch_vtype-15.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_switch_vtype-15.c
index bdea9a23b9e2..c483ced626a3 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_switch_vtype-15.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_switch_vtype-15.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_switch_vtype-16.c 
b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_switch_vtype-16.c
index 449e46c49f8b..15d498337f90 100644
--- a/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_switch_vtype-16.c
+++ b/gcc/testsuite/gcc.target/riscv/rvv/vsetvl/vlmax_switch_vtype-16.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32" } */
+/* { dg-options "-mrvv-vector-bits=scalable -march=rv32gcv -mabi=ilp32 
-fno-unroll-loops" } */
 
 #include "riscv_vector.h"
 
diff --git a/gcc/testsuite/gcc.target/riscv/slt-1.c 
b/gcc/testsuite/gcc.target/riscv/slt-1.c
index 5711757e706d..1504b6113019 100644
--- a/gcc/testsuite/gcc.target/riscv/slt-1.c
+++ b/gcc/testsuite/gcc.target/riscv/slt-1.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-march=rv64gc -mabi=lp64d -mbranch-cost=4" } */
+/* { dg-options "-march=rv64gc -mabi=lp64d -mbranch-cost=4 -fno-unroll-loops" 
} */
 /* { dg-skip-if "" { *-*-* } { "-O0" "-Og" "-Os" "-Oz" } } */
 
 #include <stdint.h>
diff --git a/gcc/testsuite/gcc.target/riscv/struct_vect_24.c 
b/gcc/testsuite/gcc.target/riscv/struct_vect_24.c
index 7c0852f1a552..fbfb9c05a54f 100644
--- a/gcc/testsuite/gcc.target/riscv/struct_vect_24.c
+++ b/gcc/testsuite/gcc.target/riscv/struct_vect_24.c
@@ -1,6 +1,6 @@
 /* { dg-do compile } */
 /* { dg-require-effective-target supports_stack_clash_protection } */
-/* { dg-options "-O3 -march=rv64gcv -mabi=lp64d -fstack-clash-protection 
-fno-stack-protector" } */
+/* { dg-options "-O3 -march=rv64gcv -mabi=lp64d -fstack-clash-protection 
-fno-stack-protector -fno-unroll-loops" } */
 /* { dg-skip-if "" { *-*-* } {"-O0" "-O1" "-O2" "-Og" "-Os" "-Oz" 
"-funroll-loops"} } */
 
 #include <stdint.h>
diff --git a/gcc/testsuite/gcc.target/riscv/unroll-explicit.c 
b/gcc/testsuite/gcc.target/riscv/unroll-explicit.c
new file mode 100644
index 000000000000..bf43fbe9ed2d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/unroll-explicit.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-funroll-loops -fdump-rtl-loop2_unroll-details 
-fno-tree-vectorize" } */
+/* { dg-skip-if "" { *-*-* } { "-O0" "-O1" "-Og" "-Os" "-Oz" } { "" } } */
+
+/* An explicit -funroll-loops turns off the default -munroll-only-small-loops,
+   so a loop exceeding the small-loop instruction threshold is unrolled
+   normally.  */
+
+void
+large_loop_explicit (int *a, int *b, int *c, int *d, int n)
+{
+  int i;
+  for (i = 0; i < n; i++)
+    {
+      a[i] = b[i] + c[i];
+      d[i] = a[i] * b[i] - c[i];
+      b[i] = c[i] + d[i] + a[i];
+      c[i] = a[i] - d[i] + b[i];
+    }
+}
+
+/* { dg-final { scan-rtl-dump "Unrolled loop" "loop2_unroll" } } */
diff --git a/gcc/testsuite/gcc.target/riscv/unroll-large-loop.c 
b/gcc/testsuite/gcc.target/riscv/unroll-large-loop.c
new file mode 100644
index 000000000000..cf3b22479f17
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/unroll-large-loop.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-fdump-rtl-loop2_unroll-details -fno-tree-vectorize" } */
+/* { dg-skip-if "" { *-*-* } { "-O0" "-O1" "-Og" "-Os" "-Oz" "-funroll-loops" 
} { "" } } */
+
+/* With the default -O2 small loop unrolling (-munroll-only-small-loops),
+   a loop whose body exceeds the small-loop instruction threshold is NOT
+   unrolled.  */
+
+void
+large_loop (int *a, int *b, int *c, int *d, int n)
+{
+  int i;
+  for (i = 0; i < n; i++)
+    {
+      a[i] = b[i] + c[i];
+      d[i] = a[i] * b[i] - c[i];
+      b[i] = c[i] + d[i] + a[i];
+      c[i] = a[i] - d[i] + b[i];
+    }
+}
+
+/* { dg-final { scan-rtl-dump-not "Unrolled loop" "loop2_unroll" } } */
diff --git a/gcc/testsuite/gcc.target/riscv/unroll-pragma.c 
b/gcc/testsuite/gcc.target/riscv/unroll-pragma.c
new file mode 100644
index 000000000000..28de8dc55967
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/unroll-pragma.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-fdump-rtl-loop2_unroll-details -fno-tree-vectorize" } */
+/* { dg-skip-if "" { *-*-* } { "-O0" "-O1" "-Og" "-Os" "-Oz" "-funroll-loops" 
} { "" } } */
+
+/* An explicit "#pragma GCC unroll" sets loop->unroll, which makes
+   riscv_loop_unroll_adjust bypass the -munroll-only-small-loops
+   restriction.  Hence a loop exceeding the small-loop instruction
+   threshold is still unrolled as requested.  */
+
+void
+large_loop_pragma (int *a, int *b, int *c, int *d, int n)
+{
+#pragma GCC unroll 2
+  for (int i = 0; i < n; i++)
+    {
+      a[i] = b[i] + c[i];
+      d[i] = a[i] * b[i] - c[i];
+      b[i] = c[i] + d[i] + a[i];
+      c[i] = a[i] - d[i] + b[i];
+    }
+}
+
+/* { dg-final { scan-rtl-dump "Unrolled loop" "loop2_unroll" } } */
diff --git a/gcc/testsuite/gcc.target/riscv/unroll-small-loop-tune.c 
b/gcc/testsuite/gcc.target/riscv/unroll-small-loop-tune.c
new file mode 100644
index 000000000000..2f0c5b95be34
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/unroll-small-loop-tune.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+/* { dg-options "-mtune=xt-c9501fdvt -fdump-rtl-loop2_unroll-details 
-fno-tree-vectorize" } */
+/* { dg-skip-if "" { *-*-* } { "-O0" "-O1" "-Og" "-Os" "-Oz" "-funroll-loops" 
} { "" } } */
+
+/* The xt-c9501fdvt tune model sets small_loop_unroll_factor to 8, so a small
+   loop is unrolled by a factor of 8 (rather than the generic default of 2).
+   The unroller reports the number of extra copies, i.e. factor - 1, so an
+   8x unroll is dumped as "Unrolled loop 7 times".  This verifies the tune
+   parameter actually takes effect; with the default factor the dump would
+   instead read "Unrolled loop 1 times".  */
+
+int
+small_loop (int n)
+{
+  int sum = 0;
+  do
+    sum += n;
+  while (--n);
+  return sum;
+}
+
+/* { dg-final { scan-rtl-dump "Unrolled loop 7 times" "loop2_unroll" } } */
diff --git a/gcc/testsuite/gcc.target/riscv/unroll-small-loop.c 
b/gcc/testsuite/gcc.target/riscv/unroll-small-loop.c
new file mode 100644
index 000000000000..3f2ecae2b248
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/unroll-small-loop.c
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-options "-fdump-rtl-loop2_unroll-details -fno-tree-vectorize" } */
+/* { dg-skip-if "" { *-*-* } { "-O0" "-O1" "-Og" "-Os" "-Oz" "-funroll-loops" 
} { "" } } */
+
+/* Small loop unrolling is enabled by default at -O2 (-funroll-loops with
+   -munroll-only-small-loops), so a loop whose body is within the small-loop
+   instruction threshold is unrolled without any explicit option.  */
+
+int
+small_loop (int n)
+{
+  int sum = 0;
+  do
+    sum += n;
+  while (--n);
+  return sum;
+}
+
+/* { dg-final { scan-rtl-dump "Unrolled loop" "loop2_unroll" } } */

Reply via email to