https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117643

Mikael Morin <mikael at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |mikael at gcc dot gnu.org

--- Comment #6 from Mikael Morin <mikael at gcc dot gnu.org> ---
I've had a look.

The problem is the single tree expression len to hold the result length.
Each branch of the conditional uses a different expression to evaluate the
result, so the result length also uses a different expression.

When generating the code of the "else" branch, the following creates the length
expression: 

> +       len = fold_build2_loc (input_location, PLUS_EXPR, cnode,
> +                              fold_convert (cnode, tse.string_length),
> +                              fold_convert (cnode, rse.string_length));

But it actually overwrites the expression that was used in the "then" branch.
So the final length used for the intrinsic's result (used by reallocation,
etc):

> +       se->string_length = len;

is unconditionally the expression of the "else" branch (using the "len" trim
result variable).

The generation of the conditional :

> +       tmp = fold_build3_loc (input_location, COND_EXPR, void_type_node, 
> +                              asis_se.expr, then_branch, else_branch);

immediately optimizes away the else branch code (condition is true), so all
that remains is the "then" branch and the reallocation code using the length
from the "else" branch.  Ooops.


I think what is missing is a variable to hold the length, and an assignment in
each branch to set the variable.

Reply via email to