On 8/16/22 05:28, Richard Biener wrote:
On Tue, 16 Aug 2022, Aldy Hernandez wrote:

On Tue, Aug 16, 2022 at 11:08 AM Aldy Hernandez <al...@redhat.com> wrote:
On Tue, Aug 16, 2022 at 10:32 AM Richard Biener <rguent...@suse.de> wrote:
On Tue, 16 Aug 2022, Aldy Hernandez wrote:

On Thu, Aug 11, 2022 at 1:42 PM Richard Biener <rguent...@suse.de> wrote:

@@ -599,6 +592,30 @@ path_range_query::compute_imports (bitmap imports, const 
vec<basic_block> &path)
                 worklist.safe_push (arg);
             }
         }
+      else if (gassign *ass = dyn_cast <gassign *> (def_stmt))
+       {
+         tree ssa[3];
+         if (range_op_handler (ass))
+           {
+             ssa[0] = gimple_range_ssa_p (gimple_range_operand1 (ass));
+             ssa[1] = gimple_range_ssa_p (gimple_range_operand2 (ass));
+             ssa[2] = NULL_TREE;
+           }
+         else if (gimple_assign_rhs_code (ass) == COND_EXPR)
+           {
+             ssa[0] = gimple_range_ssa_p (gimple_assign_rhs1 (ass));
+             ssa[1] = gimple_range_ssa_p (gimple_assign_rhs2 (ass));
+             ssa[2] = gimple_range_ssa_p (gimple_assign_rhs3 (ass));
+           }
+         else
+           continue;
+         for (unsigned j = 0; j < 3; ++j)
+           {
+             tree rhs = ssa[j];
+             if (rhs && add_to_imports (rhs, imports))
+               worklist.safe_push (rhs);
+           }
+       }
We seem to have 3 copies of this copy now: this one, the
threadbackward one, and the original one.

Could we abstract this somehow?
I've thought about this but didn't find any good solution since the
use of the operands is always a bit different.  But I was wondering
why/if the COND_EXPR special-casing is necessary, that is, why
don't we have a range_op_handler for it and if we don't why
do we care about it?

Simply that range-ops is defined as always being one or 2 use operands. everything is streamlined for those common cases.  There is no support in the API for a 3rd field. All non-conforming stmts are "unique" and thus require some level of specialization.  I am not aware of any other 3 operand stmt we would care about, so at the time it seemed easier to leave cond-expr as a specialization, in theory localized.

as for the abstraction, its easy enough to provide a routine which will take a vector and fill it with ssa_names we might care about on the stmt.. then each caller can do their own little specialized bit.  I never expected for that sequence to become common place :-)

I think it's because we don't have a range-op handler for COND_EXPR,
opting to handle the relational operators instead in range-ops.  We
have similar code in the folder:

   if (range_op_handler (s))
     res = range_of_range_op (r, s, src);
   else if (is_a<gphi *>(s))
     res = range_of_phi (r, as_a<gphi *> (s), src);
   else if (is_a<gcall *>(s))
     res = range_of_call (r, as_a<gcall *> (s), src);
   else if (is_a<gassign *> (s) && gimple_assign_rhs_code (s) == COND_EXPR)
     res = range_of_cond_expr (r, as_a<gassign *> (s), src);

Andrew, do you have any suggestions here?
Hmmm, so thinking about this, perhaps special casing it is the way to go ??
It looks like so.  Though a range_op_handler could, for
_1 = _2 ? _3 : _4; derive a range for _3 from _1 if _2 is
known true?

the fold_using_range class does this for the forward direction, and my intention (just havent gotten to it yet), was to add similar specialization in GORI rather than expanding range-ops just for the one stmt... in much the same way that range_of_cond_expr works.

It should be localized to gori_compute::compute_operand_range () , where:

 range_op_handler handler(stmt);
  if (!handler)
    return false;

before returning, we check if its a COND_EXPR, and if so, call a specialized compute routine to look at the various operands and invoke any continued operand ranges as approriate.    It should be quite trivial..

  I'll take a look at adding COND_EXPR to GORI, and privoide that routine somewhere.. probably as a function as part of gimple-range-fold.h so it can potentially apply to any stmt.

Andrew

Reply via email to