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

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: r203042
This commit is contained in:
Jakub Jelinek 2013-09-30 22:15:20 +02:00 committed by Jakub Jelinek
parent 05357ac367
commit f66d089128
4 changed files with 42 additions and 3 deletions

View File

@ -1,3 +1,9 @@
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-30 Teresa Johnson <tejohnson@google.com> 2013-09-30 Teresa Johnson <tejohnson@google.com>
* tree-ssa-threadupdate.c (ssa_fix_duplicate_block_edges): * tree-ssa-threadupdate.c (ssa_fix_duplicate_block_edges):

View File

@ -14196,14 +14196,29 @@ fold_ternary_loc (location_t loc, enum tree_code code, tree type,
&& integer_zerop (op2) && integer_zerop (op2)
&& (tem = sign_bit_p (TREE_OPERAND (arg0, 0), arg1))) && (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. /* sign_bit_p only checks ARG1 bits within A's precision.
If <sign bit of A> has wider type than A, bits outside 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. of A's precision in <sign bit of A> need to be checked.
If they are all 0, this optimization needs to be done 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, in unsigned A's type, if they are all 1 in signed A's type,
otherwise this can't be done. */ otherwise this can't be done. */
if (TYPE_PRECISION (TREE_TYPE (tem)) if (tem
< TYPE_PRECISION (TREE_TYPE (arg1)) && TYPE_PRECISION (TREE_TYPE (tem))
< TYPE_PRECISION (TREE_TYPE (arg1))
&& TYPE_PRECISION (TREE_TYPE (tem)) && TYPE_PRECISION (TREE_TYPE (tem))
< TYPE_PRECISION (type)) < TYPE_PRECISION (type))
{ {

View File

@ -1,9 +1,13 @@
2013-09-30 Jakub Jelinek <jakub@redhat.com>
PR middle-end/58564
* gcc.c-torture/execute/pr58564.c: New test.
2013-09-30 Teresa Johnson <tejohnson@google.com> 2013-09-30 Teresa Johnson <tejohnson@google.com>
* testsuite/gcc.dg/tree-ssa/ssa-dom-thread-3.c (expand_one_var): * testsuite/gcc.dg/tree-ssa/ssa-dom-thread-3.c (expand_one_var):
Update for additional dump message. Update for additional dump message.
2013-09-30 Richard Biener <rguenther@suse.de> 2013-09-30 Richard Biener <rguenther@suse.de>
PR tree-optimization/58554 PR tree-optimization/58554

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;
}