aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/fold-const.c4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr35163.c11
4 files changed, 25 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 36e3c46..61d1567 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2008-02-12 Richard Guenther <rguenther@suse.de>
+
+ PR middle-end/35163
+ * fold-const.c (fold_widened_comparison): Use get_unwidened in
+ value-preserving mode. Disallow final truncation.
+
2008-02-12 Eric Botcazou <ebotcazou@adacore.com>
PR middle-end/35136
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index ea0b43e..a33b2b0 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -7045,12 +7045,14 @@ fold_widened_comparison (enum tree_code code, tree type, tree arg0, tree arg1)
if (TYPE_PRECISION (TREE_TYPE (arg0)) <= TYPE_PRECISION (shorter_type))
return NULL_TREE;
- arg1_unw = get_unwidened (arg1, shorter_type);
+ arg1_unw = get_unwidened (arg1, NULL_TREE);
/* If possible, express the comparison in the shorter mode. */
if ((code == EQ_EXPR || code == NE_EXPR
|| TYPE_UNSIGNED (TREE_TYPE (arg0)) == TYPE_UNSIGNED (shorter_type))
&& (TREE_TYPE (arg1_unw) == shorter_type
+ || (TYPE_PRECISION (shorter_type)
+ >= TYPE_PRECISION (TREE_TYPE (arg1_unw)))
|| (TREE_CODE (arg1_unw) == INTEGER_CST
&& (TREE_CODE (shorter_type) == INTEGER_TYPE
|| TREE_CODE (shorter_type) == BOOLEAN_TYPE)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3fc12f5..00a713e 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2008-02-12 Richard Guenther <rguenther@suse.de>
+
+ PR middle-end/35163
+ * gcc.c-torture/execute/pr35163.c: New testcase.
+
2008-02-12 Uros Bizjak <ubizjak@gmail.com>
* gcc.target/i386/asm-3.c: Fix dg-skip-if for all 32bit PIC targets.
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr35163.c b/gcc/testsuite/gcc.c-torture/execute/pr35163.c
new file mode 100644
index 0000000..4950d6d
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr35163.c
@@ -0,0 +1,11 @@
+extern void abort(void);
+
+int main()
+{
+ signed char a = -30;
+ signed char b = -31;
+ if (a > (unsigned short)b)
+ abort ();
+ return 0;
+}
+