]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
switch expansion: limit JT growth param values
authorMartin Liska <mliska@suse.cz>
Wed, 28 Dec 2022 08:11:40 +0000 (09:11 +0100)
committerMartin Liska <mliska@suse.cz>
Wed, 11 Jan 2023 12:06:28 +0000 (13:06 +0100)
Currently, one can request a huge jump table creation which
leads to a non-sensual huge output. Moreover, use auto_vec rather
than a stack-allocated array.

PR middle-end/107976

gcc/ChangeLog:

* params.opt: Limit JT params.
* stmt.cc (emit_case_dispatch_table): Use auto_vec.

gcc/params.opt
gcc/stmt.cc

index 929131254d2fad4fc5ce1b6730e08301e33f3b41..8a128c321c9d07976471734e074483b4fe4f2a7a 100644 (file)
@@ -323,11 +323,11 @@ Common Joined UInteger Var(param_iv_max_considered_uses) Init(250) Param Optimiz
 Bound on number of iv uses in loop optimized in iv optimizations.
 
 -param=jump-table-max-growth-ratio-for-size=
-Common Joined UInteger Var(param_jump_table_max_growth_ratio_for_size) Init(300) Param Optimization
+Common Joined UInteger Var(param_jump_table_max_growth_ratio_for_size) Init(300) IntegerRange(0, 10000) Param Optimization
 The maximum code size growth ratio when expanding into a jump table (in percent).  The parameter is used when optimizing for size.
 
 -param=jump-table-max-growth-ratio-for-speed=
-Common Joined UInteger Var(param_jump_table_max_growth_ratio_for_speed) Init(800) Param Optimization
+Common Joined UInteger Var(param_jump_table_max_growth_ratio_for_speed) Init(800) IntegerRange(0, 10000) Param Optimization
 The maximum code size growth ratio when expanding into a jump table (in percent).  The parameter is used when optimizing for speed.
 
 -param=l1-cache-line-size=
index 82a3e1035eced919d30117733cbf538665e0563d..b239c02018a2df44e69ed99b41bb8174e0179b86 100644 (file)
@@ -746,7 +746,7 @@ emit_case_dispatch_table (tree index_expr, tree index_type,
                          tree range, basic_block stmt_bb)
 {
   int i, ncases;
-  rtx *labelvec;
+  auto_vec<rtx> labelvec;
   rtx_insn *fallback_label = label_rtx (case_list[0].m_code_label);
   rtx_code_label *table_label = gen_label_rtx ();
   bool has_gaps = false;
@@ -779,8 +779,7 @@ emit_case_dispatch_table (tree index_expr, tree index_type,
   /* Get table of labels to jump to, in order of case index.  */
 
   ncases = tree_to_shwi (range) + 1;
-  labelvec = XALLOCAVEC (rtx, ncases);
-  memset (labelvec, 0, ncases * sizeof (rtx));
+  labelvec.safe_grow_cleared (ncases);
 
   for (unsigned j = 0; j < case_list.length (); j++)
     {
@@ -860,11 +859,11 @@ emit_case_dispatch_table (tree index_expr, tree index_type,
     emit_jump_table_data (gen_rtx_ADDR_DIFF_VEC (CASE_VECTOR_MODE,
                                                 gen_rtx_LABEL_REF (Pmode,
                                                                    table_label),
-                                                gen_rtvec_v (ncases, labelvec),
+                                                gen_rtvec_v (ncases, labelvec.address ()),
                                                 const0_rtx, const0_rtx));
   else
     emit_jump_table_data (gen_rtx_ADDR_VEC (CASE_VECTOR_MODE,
-                                           gen_rtvec_v (ncases, labelvec)));
+                                           gen_rtvec_v (ncases, labelvec.address ())));
 
   /* Record no drop-through after the table.  */
   emit_barrier ();