qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [PATCH] tcg: `reachable_code_pass()` remove empty else-branch


From: Taylor Simpson
Subject: RE: [PATCH] tcg: `reachable_code_pass()` remove empty else-branch
Date: Fri, 3 Mar 2023 15:39:35 +0000


> -----Original Message-----
> From: Anton Johansson <anjo@rev.ng>
> Sent: Friday, March 3, 2023 7:32 AM
> To: Taylor Simpson <tsimpson@quicinc.com>; qemu-devel@nongnu.org
> Cc: ale@rev.ng; richard.henderson@linaro.org
> Subject: Re: [PATCH] tcg: `reachable_code_pass()` remove empty else-
> branch
> 
> On 3/1/23 23:37, Taylor Simpson wrote:
> >> diff --git a/tcg/tcg.c b/tcg/tcg.c
> >> index a4a3da6804..531bc74231 100644
> >> --- a/tcg/tcg.c
> >> +++ b/tcg/tcg.c
> >> @@ -2664,21 +2664,40 @@ static void reachable_code_pass(TCGContext
> *s)
> >>                   dead = false;
> >>                   remove = false;
> >>
> >> -                /*
> >> -                 * Optimization can fold conditional branches to 
> >> unconditional.
> >> -                 * If we find a label with one reference which is 
> >> preceded by
> >> -                 * an unconditional branch to it, remove both.  This 
> >> needed to
> >> -                 * wait until the dead code in between them was removed.
> >> -                 */
> >> -                if (label->refs == 1) {
> >> -                    TCGOp *op_prev = QTAILQ_PREV(op, link);
> > Can't we just insert a while loop here to move op_prev back across labels?
> >
> >      while (op_next->opc == INDEX_op_set_label) {
> >          op_prev = QTAILQ_PREV(op, op_prev);
> >      }
> >
> >> -                    if (op_prev->opc == INDEX_op_br &&
> >> -                        label == arg_label(op_prev->args[0])) {
> Ah I see, you're thinking something like
> 
>      dead = false;
>      remove = false;
> 
>      if (label->refs == 1) {
>          TCGOp *op_prev = NULL;
>          do {
>              op_prev = QTAILQ_PREV(op_prev, link);

You can't use op_prev as the argument here.  It is NULL the first time through 
the loop ☹

>          } while (op_prev->opc == INDEX_op_set_label);
> 
>          if (op_prev->opc == INDEX_op_br &&
>              label == arg_label(op_prev->args[0])) {
>              tcg_op_remove(s, op_prev);
>              remove = true;
>          }
>      }
> 
> to handle
> 
>      br
>      set_label
>      ...
>      set_label
> 
> I do like being able to combine both branches, and we're no longer relying on
> the next iteration of the loop to clean up the final set_label. Since we won't
> ever encounter more than one intermediate set_label this might be overkill,
> but either way I think it's an improvement.

It's overkill for the code that idef-parser generates, but my suggestion is to 
make able to skip back over as many labels as possible.

> 
> Thanks for the feedback, I'll resubmit with this change! :)
> 
> --
> Anton Johansson,
> rev.ng Labs Srl.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]