From 0cedb9e94ed11da89cb8ee447415a86ad8bf11f6 Mon Sep 17 00:00:00 2001 From: Richard Guenther Date: Mon, 19 Nov 2007 12:52:09 +0000 Subject: [PATCH] re PR tree-optimization/34099 (optimizer problem) 2007-11-19 Richard Guenther 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 --- gcc/ChangeLog | 7 +++ .../gcc.c-torture/execute/pr34099-2.c | 47 +++++++++++++++++++ gcc/tree-ssa-ccp.c | 25 ++-------- 3 files changed, 57 insertions(+), 22 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr34099-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4fafa8dc9363..97f6a0806ea6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2007-11-19 Richard Guenther + + 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 PR tree-optimization/34036 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr34099-2.c b/gcc/testsuite/gcc.c-torture/execute/pr34099-2.c new file mode 100644 index 000000000000..d335673e30f2 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr34099-2.c @@ -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; +} + diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c index fc40449be8db..19d82563a813 100644 --- a/gcc/tree-ssa-ccp.c +++ b/gcc/tree-ssa-ccp.c @@ -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: