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:
parent
05357ac367
commit
f66d089128
|
@ -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):
|
||||||
|
|
|
@ -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))
|
||||||
{
|
{
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
Loading…
Reference in New Issue