On Dec  8, 2024, Richard Biener <richard.guent...@gmail.com> wrote:

> Like below, gimple_convert_def_p ().

>> +static bool
>> +gimple_fold_follow_convert (tree t, tree op[1])

> Since it doesn't actually fold - can you name it

> static bool
> gimple_binop_def_p (...)

>> +         if (tree_swap_operands_p (op0, op1))
>> +           std::swap (op0, op1);

> All stmts are canonical, you shouldn't need to swap operands here.

>> +         if (uniform_integer_cst_p (op1))

> ... put this in the caller so it could be made more universal eventually?

Incremental for upcoming v4

diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc
index 126d6c5b849e9..65f1e7eb97fae 100644
--- a/gcc/gimple-fold.cc
+++ b/gcc/gimple-fold.cc
@@ -7443,7 +7443,7 @@ maybe_fold_comparisons_from_match_pd (tree type, enum 
tree_code code,
    conversion.  */
 
 static bool
-gimple_fold_follow_convert (tree t, tree op[1])
+gimple_convert_def_p (tree t, tree op[1])
 {
   if (TREE_CODE (t) == SSA_NAME
       && !SSA_NAME_IS_DEFAULT_DEF (t))
@@ -7466,23 +7466,16 @@ gimple_fold_follow_convert (tree t, tree op[1])
    binary expression with code CODE.  */
 
 static bool
-gimple_fold_binop_cst (enum tree_code code, tree t, tree op[2])
+gimple_binop_def_p (enum tree_code code, tree t, tree op[2])
 {
   if (TREE_CODE (t) == SSA_NAME
       && !SSA_NAME_IS_DEFAULT_DEF (t))
     if (gimple *def = dyn_cast <gassign *> (SSA_NAME_DEF_STMT (t)))
       if (gimple_assign_rhs_code (def) == code)
        {
-         tree op0 = gimple_assign_rhs1 (def);
-         tree op1 = gimple_assign_rhs2 (def);
-         if (tree_swap_operands_p (op0, op1))
-           std::swap (op0, op1);
-         if (uniform_integer_cst_p (op1))
-           {
-             op[0] = op0;
-             op[1] = op1;
-             return true;
-           }
+         op[0] = gimple_assign_rhs1 (def);
+         op[1] = gimple_assign_rhs2 (def);
+         return true;
        }
   return false;
 }
@@ -7545,7 +7538,7 @@ decode_field_reference (tree *pexp, HOST_WIDE_INT 
*pbitsize,
      narrowing then widening casts, or vice-versa, for those that are not
      essential for the compare have already been optimized out at this
      point.  */
-  if (gimple_fold_follow_convert (exp, res_ops))
+  if (gimple_convert_def_p (exp, res_ops))
     {
       if (!outer_type)
        {
@@ -7556,7 +7549,8 @@ decode_field_reference (tree *pexp, HOST_WIDE_INT 
*pbitsize,
     }
 
   /* Recognize and save a masking operation.  */
-  if (pand_mask && gimple_fold_binop_cst (BIT_AND_EXPR, exp, res_ops))
+  if (pand_mask && gimple_binop_def_p (BIT_AND_EXPR, exp, res_ops)
+      && uniform_integer_cst_p (res_ops[1]))
     {
       loc[1] = gimple_location (SSA_NAME_DEF_STMT (exp));
       exp = res_ops[0];
@@ -7564,7 +7558,8 @@ decode_field_reference (tree *pexp, HOST_WIDE_INT 
*pbitsize,
     }
 
   /* Turn (a ^ b) [!]= 0 into a [!]= b.  */
-  if (xor_p && gimple_fold_binop_cst (BIT_XOR_EXPR, exp, res_ops))
+  if (xor_p && gimple_binop_def_p (BIT_XOR_EXPR, exp, res_ops)
+      && uniform_integer_cst_p (res_ops[1]))
     {
       /* No location recorded for this one, it's entirely subsumed by the
         compare.  */
@@ -7586,7 +7581,7 @@ decode_field_reference (tree *pexp, HOST_WIDE_INT 
*pbitsize,
     }
 
   /* Another chance to drop conversions.  */
-  if (gimple_fold_follow_convert (exp, res_ops))
+  if (gimple_convert_def_p (exp, res_ops))
     {
       if (!outer_type)
        {
@@ -7597,7 +7592,8 @@ decode_field_reference (tree *pexp, HOST_WIDE_INT 
*pbitsize,
     }
 
   /* Take note of shifts.  */
-  if (gimple_fold_binop_cst (RSHIFT_EXPR, exp, res_ops))
+  if (gimple_binop_def_p (RSHIFT_EXPR, exp, res_ops)
+      && uniform_integer_cst_p (res_ops[1]))
     {
       loc[2] = gimple_location (SSA_NAME_DEF_STMT (exp));
       exp = res_ops[0];
@@ -7609,7 +7605,7 @@ decode_field_reference (tree *pexp, HOST_WIDE_INT 
*pbitsize,
     }
 
   /* Yet another chance to drop conversions.  */
-  if (gimple_fold_follow_convert (exp, res_ops))
+  if (gimple_convert_def_p (exp, res_ops))
     {
       if (!outer_type)
        {
diff --git a/gcc/testsuite/gcc.target/aarch64/long_branch_1.c 
b/gcc/testsuite/gcc.target/aarch64/long_branch_1.c
index 49d8b6a2278ad..0b04e36873388 100644
--- a/gcc/testsuite/gcc.target/aarch64/long_branch_1.c
+++ b/gcc/testsuite/gcc.target/aarch64/long_branch_1.c
@@ -1,6 +1,6 @@
 /* { dg-do assemble } */
 /* { dg-timeout-factor 2.0 } */
-/* { dg-options "-O1 -fno-reorder-blocks -fno-tree-cselim --save-temps" } */
+/* { dg-options "-O1 -fno-reorder-blocks -fno-tree-cselim -fno-tree-ifcombine 
--save-temps" } */
 
 
 __attribute__((noinline, noclone)) int


-- 
Alexandre Oliva, happy hacker            https://FSFLA.org/blogs/lxo/
   Free Software Activist                   GNU Toolchain Engineer
More tolerance and less prejudice are key for inclusion and diversity
Excluding neuro-others for not behaving ""normal"" is *not* inclusive

Reply via email to