aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2007-11-19 12:52:09 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2007-11-19 12:52:09 +0000
commit0cedb9e94ed11da89cb8ee447415a86ad8bf11f6 (patch)
treedc74ecf418e243c8716a1cec9373a3f013075b5d /gcc
parentbc3e7a8cfc138ec0cdf1f7e39a8c856a25e9b3db (diff)
downloadgcc-0cedb9e94ed11da89cb8ee447415a86ad8bf11f6.zip
gcc-0cedb9e94ed11da89cb8ee447415a86ad8bf11f6.tar.gz
gcc-0cedb9e94ed11da89cb8ee447415a86ad8bf11f6.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr34099-2.c47
-rw-r--r--gcc/tree-ssa-ccp.c25
3 files changed, 57 insertions, 22 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4fafa8d..97f6a08 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
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 0000000..d335673
--- /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 fc40449..19d8256 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: