Commit f66d0891 by Jakub Jelinek Committed by Jakub Jelinek

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
parent 05357ac3
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, ...@@ -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))
{ {
......
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
......
/* 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment