summaryrefslogtreecommitdiff
path: root/0302-Added-param-for-optimization-for-merging-bb-s-with-c.patch
diff options
context:
space:
mode:
Diffstat (limited to '0302-Added-param-for-optimization-for-merging-bb-s-with-c.patch')
-rw-r--r--0302-Added-param-for-optimization-for-merging-bb-s-with-c.patch158
1 files changed, 158 insertions, 0 deletions
diff --git a/0302-Added-param-for-optimization-for-merging-bb-s-with-c.patch b/0302-Added-param-for-optimization-for-merging-bb-s-with-c.patch
new file mode 100644
index 0000000..da25a9e
--- /dev/null
+++ b/0302-Added-param-for-optimization-for-merging-bb-s-with-c.patch
@@ -0,0 +1,158 @@
+From 210147e28d542a03588ba3c3fa473301a03bb687 Mon Sep 17 00:00:00 2001
+From: Gmyrikov Konstantin <gmyrikov.konstantin@huawei-partners.com>
+Date: Thu, 31 Oct 2024 16:45:15 +0800
+Subject: [PATCH 6/6] Added param for optimization for merging bb's with cheap
+ insns.Zero param means turned off optimization(default implementation),One
+ means turned on
+
+Signed-off-by: Gmyrikov Konstantin <gmyrikov.konstantin@huawei-partners.com>
+---
+ gcc/params.opt | 4 +++
+ gcc/testsuite/gcc.dg/if_comb1.c | 13 +++++++++
+ gcc/testsuite/gcc.dg/if_comb2.c | 13 +++++++++
+ gcc/testsuite/gcc.dg/if_comb3.c | 12 +++++++++
+ gcc/tree-ssa-ifcombine.cc | 47 ++++++++++++++++++++++++++++++---
+ 5 files changed, 86 insertions(+), 3 deletions(-)
+ create mode 100644 gcc/testsuite/gcc.dg/if_comb1.c
+ create mode 100644 gcc/testsuite/gcc.dg/if_comb2.c
+ create mode 100644 gcc/testsuite/gcc.dg/if_comb3.c
+
+diff --git a/gcc/params.opt b/gcc/params.opt
+index fc700ab79..3ddfaf5b2 100644
+--- a/gcc/params.opt
++++ b/gcc/params.opt
+@@ -789,6 +789,10 @@ Maximum number of VALUEs handled during a single find_base_term call.
+ Common Joined UInteger Var(param_max_vrp_switch_assertions) Init(10) Param Optimization
+ Maximum number of assertions to add along the default edge of a switch statement during VRP.
+
++-param=merge-assign-stmts-ifcombine=
++Common Joined UInteger Var(param_merge_assign_stmts_ifcombine) Init(0) IntegerRange(0, 1) Param Optimization
++Whether bb's with cheap gimple_assign stmts should be merged in the ifcombine pass.
++
+ -param=min-crossjump-insns=
+ Common Joined UInteger Var(param_min_crossjump_insns) Init(5) IntegerRange(1, 65536) Param Optimization
+ The minimum number of matching instructions to consider for crossjumping.
+diff --git a/gcc/testsuite/gcc.dg/if_comb1.c b/gcc/testsuite/gcc.dg/if_comb1.c
+new file mode 100644
+index 000000000..e00adc37d
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/if_comb1.c
+@@ -0,0 +1,13 @@
++/* { dg-do compile } */
++/* { dg-options "-Ofast -S --param=merge-assign-stmts-ifcombine=1 -fdump-tree-ifcombine" } */
++
++int foo (double a, double b, int c)
++{
++ if (c < 10 || a - b > 1.0)
++ return 0;
++ else
++ return 1;
++}
++
++/* { dg-final { scan-tree-dump "optimizing two comparisons" "ifcombine"} } */
++/* { dg-final { scan-tree-dump "Merging blocks" "ifcombine"} } */
+diff --git a/gcc/testsuite/gcc.dg/if_comb2.c b/gcc/testsuite/gcc.dg/if_comb2.c
+new file mode 100644
+index 000000000..176e7e726
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/if_comb2.c
+@@ -0,0 +1,13 @@
++/* { dg-do compile } */
++/* { dg-options "-Ofast -S --param=merge-assign-stmts-ifcombine=1 -fdump-tree-ifcombine" } */
++
++int foo (int a, int b, int c)
++{
++ if (a > 1 || b * c < 10)
++ return 0;
++ else
++ return 1;
++}
++
++/* { dg-final { scan-tree-dump "optimizing two comparisons" "ifcombine"} } */
++/* { dg-final { scan-tree-dump "Merging blocks" "ifcombine"} } */
+diff --git a/gcc/testsuite/gcc.dg/if_comb3.c b/gcc/testsuite/gcc.dg/if_comb3.c
+new file mode 100644
+index 000000000..aa2e4510c
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/if_comb3.c
+@@ -0,0 +1,12 @@
++/* { dg-do compile } */
++/* { dg-options "-Ofast -S --param=merge-assign-stmts-ifcombine=1 -fdump-tree-ifcombine" } */
++
++int foo (int a, int b, int c)
++{
++ if (a > 1 && b + c < 10)
++ a++;
++ return a;
++}
++
++/* { dg-final { scan-tree-dump "optimizing two comparisons" "ifcombine"} } */
++/* { dg-final { scan-tree-dump "Merging blocks" "ifcombine"} } */
+diff --git a/gcc/tree-ssa-ifcombine.cc b/gcc/tree-ssa-ifcombine.cc
+index ce9bbebf9..264a8bcae 100644
+--- a/gcc/tree-ssa-ifcombine.cc
++++ b/gcc/tree-ssa-ifcombine.cc
+@@ -110,6 +110,18 @@ recognize_if_then_else (basic_block cond_bb,
+ return true;
+ }
+
++/* Verify if gimple insn cheap for param=merge-assign-stmts-ifcombine
++ optimization. */
++
++bool is_insn_cheap (enum tree_code t)
++{
++ static enum tree_code cheap_insns[] = {MULT_EXPR, PLUS_EXPR, MINUS_EXPR};
++ for (int i = 0; i < sizeof (cheap_insns)/sizeof (enum tree_code); i++)
++ if (t == cheap_insns[i])
++ return 1;
++ return 0;
++}
++
+ /* Verify if the basic block BB does not have side-effects. Return
+ true in this case, else false. */
+
+@@ -572,9 +584,38 @@ ifcombine_ifandif (basic_block inner_cond_bb, bool inner_inv,
+ = param_logical_op_non_short_circuit;
+ if (!logical_op_non_short_circuit || sanitize_coverage_p ())
+ return false;
+- /* Only do this optimization if the inner bb contains only the conditional. */
+- if (!gsi_one_before_end_p (gsi_start_nondebug_after_labels_bb (inner_cond_bb)))
+- return false;
++ if (param_merge_assign_stmts_ifcombine)
++ {
++ int number_cheap_insns = 0;
++ int number_conds = 0;
++ for (auto i = gsi_start_nondebug_after_labels_bb
++ (outer_cond_bb); !gsi_end_p (i); gsi_next_nondebug (&i))
++ if (gimple_code (gsi_stmt (i)) == GIMPLE_ASSIGN
++ && is_insn_cheap (gimple_assign_rhs_code (gsi_stmt (i))))
++ number_cheap_insns++;
++ else if (gimple_code (gsi_stmt (i)) == GIMPLE_COND)
++ number_conds++;
++ for (auto i = gsi_start_nondebug_after_labels_bb
++ (inner_cond_bb); !gsi_end_p (i); gsi_next_nondebug (&i))
++ if (gimple_code (gsi_stmt (i)) == GIMPLE_ASSIGN
++ && is_insn_cheap (gimple_assign_rhs_code (gsi_stmt (i))))
++ number_cheap_insns++;
++ else if (gimple_code (gsi_stmt (i)) == GIMPLE_COND)
++ number_conds++;
++ if (!(number_cheap_insns == 1 && number_conds == 2)
++ && !gsi_one_before_end_p (gsi_start_nondebug_after_labels_bb
++ (inner_cond_bb)))
++ return false;
++ }
++ else
++ {
++ /* Only do this optimization if the inner bb contains
++ only the conditional. */
++ if (!gsi_one_before_end_p (gsi_start_nondebug_after_labels_bb
++ (inner_cond_bb)))
++ return false;
++ }
++
+ t1 = fold_build2_loc (gimple_location (inner_cond),
+ inner_cond_code,
+ boolean_type_node,
+--
+2.33.0
+