On Dec 17, 2024, Alexandre Oliva <[email protected]> wrote:
> diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc
> index 92f02ddd77408..06913d57f8aec 100644
> --- a/gcc/gimple-fold.cc
> +++ b/gcc/gimple-fold.cc
> @@ -7554,13 +7554,10 @@ decode_field_reference (tree *pexp, HOST_WIDE_INT
> *pbitsize,
> narrowing then widening casts, or vice-versa, for those that are not
> essential for the compare have already been optimized out at this
> point. */
> - if (gimple_convert_def_p (exp, res_ops))
> + if (!outer_type && gimple_convert_def_p (exp, res_ops))
Oops, I failed to update the comment.
Please consider it combined with this patchlet.
diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc
index d8f0df97b8f53..9ee854bec4dc6 100644
--- a/gcc/gimple-fold.cc
+++ b/gcc/gimple-fold.cc
@@ -7313,10 +7313,14 @@ decode_field_reference (tree *pexp, HOST_WIDE_INT
*pbitsize,
if (! INTEGRAL_TYPE_P (TREE_TYPE (exp)))
return NULL_TREE;
- /* Drop casts, only save the outermost type. We need not worry about
- narrowing then widening casts, or vice-versa, for those that are not
- essential for the compare have already been optimized out at this
- point. */
+ /* Drop casts, saving only the outermost type, effectively used in
+ the compare. We can deal with at most one conversion, and it may
+ appear at various points in the chain of recognized preparation
+ statements. Earlier optimizers will often have already dropped
+ unneeded extensions, but they may survive, as in PR118046. ???
+ Can we do better and allow multiple conversions, perhaps taking
+ note of the narrowest intermediate type, sign extensions and
+ whatnot? */
if (!outer_type && gimple_convert_def_p (exp, res_ops))
{
outer_type = TREE_TYPE (exp);
--
Alexandre Oliva, happy hacker https://FSFLA.org/blogs/lxo/
Free Software Activist GNU Toolchain Engineer
More tolerance and less prejudice are key for inclusion and diversity
Excluding neuro-others for not behaving ""normal"" is *not* inclusive