Commit 0cedb9e9 by Richard Guenther Committed by Richard Biener

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
parent bc3e7a8c
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> 2007-11-19 Eric Botcazou <ebotcazou@libertysurf.fr>
PR tree-optimization/34036 PR tree-optimization/34036
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) ...@@ -582,32 +582,13 @@ likely_value (tree stmt)
/* Unary operators are handled with all_undefined_operands. */ /* Unary operators are handled with all_undefined_operands. */
case PLUS_EXPR: case PLUS_EXPR:
case MINUS_EXPR: case MINUS_EXPR:
case MULT_EXPR:
case POINTER_PLUS_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 MIN_EXPR, MAX_EXPR. One VARYING operand may be selected.
Not bitwise operators, one VARYING operand may specify the Not bitwise operators, one VARYING operand may specify the
result completely. Not logical operators for the same reason. result completely. Not logical operators for the same reason.
Not LE/GE comparisons or unordered comparisons. Not Not COMPLEX_EXPR as one VARYING operand makes the result partly
COMPLEX_EXPR as one VARYING operand makes the result partly not UNDEFINED. Not *DIV_EXPR, comparisons and shifts because
not UNDEFINED. */ the undefined operand may be promoted. */
return UNDEFINED; return UNDEFINED;
default: default:
......
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