2
0
mirror of git://gcc.gnu.org/git/gcc.git synced 2025-03-24 12:31:25 +08:00

re PR tree-optimization/34099 (optimizer problem)

2007-11-19  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/34099
	* tree-ssa-ccp.c (likely_value): Exclude all but PLUS_EXPR,
	MINUS_EXPR and POINTER_PLUS_EXPR from handling as UNDEFINED
	if only one operand is undefined.

	* gcc.c-torture/execute/pr34099-2.c: New testcase.

From-SVN: r130289
This commit is contained in:
Richard Guenther 2007-11-19 12:52:09 +00:00 committed by Richard Biener
parent bc3e7a8cfc
commit 0cedb9e94e
3 changed files with 57 additions and 22 deletions
gcc
ChangeLog
testsuite/gcc.c-torture/execute
tree-ssa-ccp.c

@ -1,3 +1,10 @@
2007-11-19 Richard Guenther <rguenther@suse.de>
PR tree-optimization/34099
* tree-ssa-ccp.c (likely_value): Exclude all but PLUS_EXPR,
MINUS_EXPR and POINTER_PLUS_EXPR from handling as UNDEFINED
if only one operand is undefined.
2007-11-19 Eric Botcazou <ebotcazou@libertysurf.fr>
PR tree-optimization/34036

@ -0,0 +1,47 @@
int test1 (int b, int c)
{
char x;
if (b)
return x / c;
else
return 1;
}
int test2 (int b, int c)
{
int x;
if (b)
return x * c;
else
return 1;
}
int test3 (int b, int c)
{
int x;
if (b)
return x % c;
else
return 1;
}
int test4 (int b, int c)
{
char x;
if (b)
return x == c;
else
return 1;
}
extern void abort (void);
int main()
{
if (test1(1, 1000) != 0)
abort ();
if (test2(1, 0) != 0)
abort ();
if (test3(1, 1) != 0)
abort ();
if (test4(1, 1000) != 0)
abort ();
return 0;
}

@ -582,32 +582,13 @@ likely_value (tree stmt)
/* Unary operators are handled with all_undefined_operands. */
case PLUS_EXPR:
case MINUS_EXPR:
case MULT_EXPR:
case POINTER_PLUS_EXPR:
case TRUNC_DIV_EXPR:
case CEIL_DIV_EXPR:
case FLOOR_DIV_EXPR:
case ROUND_DIV_EXPR:
case TRUNC_MOD_EXPR:
case CEIL_MOD_EXPR:
case FLOOR_MOD_EXPR:
case ROUND_MOD_EXPR:
case RDIV_EXPR:
case EXACT_DIV_EXPR:
case LSHIFT_EXPR:
case RSHIFT_EXPR:
case LROTATE_EXPR:
case RROTATE_EXPR:
case EQ_EXPR:
case NE_EXPR:
case LT_EXPR:
case GT_EXPR:
/* Not MIN_EXPR, MAX_EXPR. One VARYING operand may be selected.
Not bitwise operators, one VARYING operand may specify the
result completely. Not logical operators for the same reason.
Not LE/GE comparisons or unordered comparisons. Not
COMPLEX_EXPR as one VARYING operand makes the result partly
not UNDEFINED. */
Not COMPLEX_EXPR as one VARYING operand makes the result partly
not UNDEFINED. Not *DIV_EXPR, comparisons and shifts because
the undefined operand may be promoted. */
return UNDEFINED;
default: