On 06/13/2013 09:11 AM, Aldy Hernandez wrote:
> The whole slew of these cases have a lot of duplicated code.  For instance,
> BUILT_IN_CILKPLUS_SEC_REDUCE_MIN is the same as
> BUILT_IN_CILKPLUS_SEC_REDUCE_MAX, the only difference being GT_EXPR vs
> LT_EXPR.  Surely you could do something like:
> 
> if (an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_MIN
>     || an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_MAX) {
>    enum tree_code code;
>    if (an_type == BUILT_IN_CILKPLUS_SEC_REDUCE_MIN)
>      code = GT_EXPR;
>    else
>      code = LT_EXPR;
>    // stuff
> }
> 
> The compiler should be able to optimize the above, but even if it couldn't, I
> am willing to compare twice and save lines and lines of code.
> 
> Similarly for SEC_REDUCE_ANY_ZERO/SEC_REDUCE_ANY_NONZERO,
> SEC_REDUCE_ALL_ZERO/SEC_REDUCE_ALL_NONZERO, SEC_REDUCE_ADD/SEC_REDUCE_MUL, etc
> etc etc.

Yep.  It's at this point that I normally start using the idiom

        switch (an_type)
          {
          case BUILT_IN_CILKPLUS_SEC_REDUCE_MIN:
            code = GT_EXPR;
            goto do_min_max;
          case BUILT_IN_CILKPLUS_SEC_REDUCE_MAX:
            code = LT_EXPR;
            goto do_min_max;
          do_min_max:
            // stuff

So much the better if you can include the other SEC_* cases in that switch too,
doing one compiler-controlled dispatch.

It also occurs to me to wonder why you're building your own COND_EXPR here,
with the comparison, rather than using MIN/MAX_EXPR...


r~

Reply via email to