This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Don't simplify_conversion_from_bitmask on x & 1 (PR tree-optimization/59014)
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: Marek Polacek <polacek at redhat dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>, Jeff Law <law at redhat dot com>
- Date: Thu, 7 Nov 2013 16:39:03 +0100
- Subject: Re: [PATCH] Don't simplify_conversion_from_bitmask on x & 1 (PR tree-optimization/59014)
- Authentication-results: sourceware.org; auth=none
- References: <20131107151511 dot GK30062 at redhat dot com>
On Thu, Nov 7, 2013 at 4:15 PM, Marek Polacek <polacek@redhat.com> wrote:
> Here, forward propagation turned
> _6 = a.1_5 & 1;
> _7 = (_Bool) _6;
> into
> _7 = (_Bool) a.1_5;
> but that's wrong: e.g. if a = 2 then (_Bool) _6 is 0, but (_Bool) a.1_5 is 1.
?
(_Bool) 2
should truncate the value to zero.
Richard.
> If a is an odd number, this is correct, but we don't know the value
> of a, so I disabled this optimization for "x & 1" cases. For e.g. "x & 255",
> this still works correctly.
> In this PR, VRP created wrong ASSERT_EXPR because of this, thus we were
> miscompiling the following testcase...
>
> Regtested/bootstrapped on x86_64-linux, ok for trunk?
>
> 2013-11-07 Marek Polacek <polacek@redhat.com>
>
> PR tree-optimization/59014
> * tree-ssa-forwprop.c (simplify_conversion_from_bitmask): Don't
> optimize x & 1 expressions here.
> testsuite/
> * gcc.dg/torture/pr59014.c: New test.
>
> --- gcc/testsuite/gcc.dg/torture/pr59014.c.mp 2013-11-07 14:47:38.040941144 +0100
> +++ gcc/testsuite/gcc.dg/torture/pr59014.c 2013-11-07 14:49:03.646271031 +0100
> @@ -0,0 +1,26 @@
> +/* PR tree-optimization/59014 */
> +/* { dg-do run } */
> +
> +int a = 2, b, c, d;
> +
> +int
> +foo ()
> +{
> + for (;; c++)
> + if ((b > 0) | (a & 1))
> + ;
> + else
> + {
> + d = a;
> + return 0;
> + }
> +}
> +
> +int
> +main ()
> +{
> + foo ();
> + if (d != 2)
> + __builtin_abort ();
> + return 0;
> +}
> --- gcc/tree-ssa-forwprop.c.mp 2013-11-07 14:30:43.785733810 +0100
> +++ gcc/tree-ssa-forwprop.c 2013-11-07 14:42:31.836765375 +0100
> @@ -1199,9 +1199,16 @@ simplify_conversion_from_bitmask (gimple
> if (TREE_CODE (rhs_def_operand1) == SSA_NAME
> && ! SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs_def_operand1)
> && TREE_CODE (rhs_def_operand2) == INTEGER_CST
> + /* We can't turn
> + _6 = a & 1;
> + _7 = (_Bool) _6;
> + into
> + _7 = (_Bool) a;
> + as that's wrong if A is an even number. */
> + && ! integer_onep (rhs_def_operand2)
> && operand_equal_p (rhs_def_operand2,
> build_low_bits_mask (TREE_TYPE (rhs_def_operand2),
> - TYPE_PRECISION (lhs_type)),
> + TYPE_PRECISION (lhs_type)),
> 0))
> {
> /* This is an optimizable case. Replace the source operand
>
> Marek