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

--- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to H.J. Lu from comment #6)
> Does this patch
> 
> diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c
> index 2ac3828..8b57875 100644
> --- a/gcc/tree-ssa-sccvn.c
> +++ b/gcc/tree-ssa-sccvn.c
> @@ -4372,17 +4372,16 @@ sccvn_dom_walker::before_dom_children (basic_block
> bb)
>       {
>         gimple *stmt = last_stmt (e->src);
>         if (stmt
> -           && gimple_code (stmt) == GIMPLE_COND)
> +           && gimple_code (stmt) == GIMPLE_COND
> +           && (e->flags & EDGE_TRUE_VALUE) != 0)
>           {
>             enum tree_code code = gimple_cond_code (stmt);
>             tree lhs = gimple_cond_lhs (stmt);
>             tree rhs = gimple_cond_rhs (stmt);
> -           record_conds (bb, code, lhs, rhs,
> -                         (e->flags & EDGE_TRUE_VALUE) != 0);
> +           record_conds (bb, code, lhs, rhs, true);
>             code = invert_tree_comparison (code, HONOR_NANS (lhs));
>             if (code != ERROR_MARK)
> -             record_conds (bb, code, lhs, rhs,
> -                           (e->flags & EDGE_TRUE_VALUE) == 0);
> +             record_conds (bb, code, lhs, rhs, false);
>           }
>       }
>      }
> 
> make any senses? Do we need to check EDGE_FALSE_VALUE?

No, even for the false edge we can record proper expressions, see
record_conds and how it handles the cases if the condition was true or false.

Can you please attach -details dumps of the pass instance that does this?

Note that the large number '5368709811' (0x1fffffff) might point to a
different issue elsewhere.  Did you double-check that makes sense?

Sorry for not investigating myself but I lack a x32 runtime environment.
It would help if you attach preprocessed source with a pointer to the
function that you believe is miscompiled.

Reply via email to