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:
parent
bc3e7a8cfc
commit
0cedb9e94e
gcc
@ -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
|
||||
|
47
gcc/testsuite/gcc.c-torture/execute/pr34099-2.c
Normal file
47
gcc/testsuite/gcc.c-torture/execute/pr34099-2.c
Normal file
@ -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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user