backport: re PR middle-end/58564 (possible wrong code bug at -O0)

Backported from mainline
	2013-09-30  Jakub Jelinek  <jakub@redhat.com>

	PR middle-end/58564
	* fold-const.c (fold_ternary_loc): For A < 0 : <sign bit of A> : 0
	optimization, punt if sign_bit_p looked through any zero extension.

	* gcc.c-torture/execute/pr58564.c: New test.

From-SVN: r210174
This commit is contained in:
Jakub Jelinek 2014-05-07 18:05:38 +02:00 committed by Jakub Jelinek
parent dd5422383c
commit 11d82e3374
4 changed files with 42 additions and 2 deletions

View File

@ -1,6 +1,12 @@
2014-05-07 Jakub Jelinek <jakub@redhat.com>
Backported from mainline
2013-09-30 Jakub Jelinek <jakub@redhat.com>
PR middle-end/58564
* fold-const.c (fold_ternary_loc): For A < 0 : <sign bit of A> : 0
optimization, punt if sign_bit_p looked through any zero extension.
2013-09-10 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/58365

View File

@ -13849,14 +13849,29 @@ fold_ternary_loc (location_t loc, enum tree_code code, tree type,
&& integer_zerop (op2)
&& (tem = sign_bit_p (TREE_OPERAND (arg0, 0), arg1)))
{
/* sign_bit_p looks through both zero and sign extensions,
but for this optimization only sign extensions are
usable. */
tree tem2 = TREE_OPERAND (arg0, 0);
while (tem != tem2)
{
if (TREE_CODE (tem2) != NOP_EXPR
|| TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (tem2, 0))))
{
tem = NULL_TREE;
break;
}
tem2 = TREE_OPERAND (tem2, 0);
}
/* sign_bit_p only checks ARG1 bits within A's precision.
If <sign bit of A> has wider type than A, bits outside
of A's precision in <sign bit of A> need to be checked.
If they are all 0, this optimization needs to be done
in unsigned A's type, if they are all 1 in signed A's type,
otherwise this can't be done. */
if (TYPE_PRECISION (TREE_TYPE (tem))
< TYPE_PRECISION (TREE_TYPE (arg1))
if (tem
&& TYPE_PRECISION (TREE_TYPE (tem))
< TYPE_PRECISION (TREE_TYPE (arg1))
&& TYPE_PRECISION (TREE_TYPE (tem))
< TYPE_PRECISION (type))
{

View File

@ -1,6 +1,11 @@
2014-05-07 Jakub Jelinek <jakub@redhat.com>
Backported from mainline
2013-09-30 Jakub Jelinek <jakub@redhat.com>
PR middle-end/58564
* gcc.c-torture/execute/pr58564.c: New test.
2013-09-10 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/58365

View File

@ -0,0 +1,14 @@
/* PR middle-end/58564 */
extern void abort (void);
int a, b;
short *c, **d = &c;
int
main ()
{
b = (0, 0 > ((&c == d) & (1 && (a ^ 1)))) | 0U;
if (b != 0)
abort ();
return 0;
}