From b2f06c39b01335127308567e5e074c3218011420 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 22 Apr 2008 21:23:23 +0000 Subject: [PATCH] fold-const.c (pointer_may_wrap_p): Call int_size_in_bytes rather than size_in_bytes. ./: * fold-const.c (pointer_may_wrap_p): Call int_size_in_bytes rather than size_in_bytes. testsuite/: * gcc.c-torture/compile/20080419-1.c: New test. From-SVN: r134566 --- gcc/ChangeLog | 5 +++ gcc/fold-const.c | 42 +++++++++---------- gcc/testsuite/ChangeLog | 4 ++ .../gcc.c-torture/compile/20080419-1.c | 6 +++ 4 files changed, 34 insertions(+), 23 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/20080419-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 761cf7ff994..6132b7fdd09 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2008-04-22 Ian Lance Taylor + + * fold-const.c (pointer_may_wrap_p): Call int_size_in_bytes rather + than size_in_bytes. + 2008-04-22 Pat Haugen * config/rs6000/rs6000.c (rs6000_register_move_cost): Increase cost diff --git a/gcc/fold-const.c b/gcc/fold-const.c index f5ec30c1706..4015f62e5cd 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -8401,9 +8401,8 @@ maybe_canonicalize_comparison (enum tree_code code, tree type, static bool pointer_may_wrap_p (tree base, tree offset, HOST_WIDE_INT bitpos) { - tree size; unsigned HOST_WIDE_INT offset_low, total_low; - HOST_WIDE_INT offset_high, total_high; + HOST_WIDE_INT size, offset_high, total_high; if (!POINTER_TYPE_P (TREE_TYPE (base))) return true; @@ -8411,21 +8410,6 @@ pointer_may_wrap_p (tree base, tree offset, HOST_WIDE_INT bitpos) if (bitpos < 0) return true; - size = size_in_bytes (TREE_TYPE (TREE_TYPE (base))); - if (size == NULL_TREE || TREE_CODE (size) != INTEGER_CST) - return true; - - /* We can do slightly better for SIZE if we have an ADDR_EXPR of an - array. */ - if (TREE_CODE (base) == ADDR_EXPR) - { - tree base_size = size_in_bytes (TREE_TYPE (TREE_OPERAND (base, 0))); - if (base_size != NULL_TREE - && TREE_CODE (base_size) == INTEGER_CST - && INT_CST_LT_UNSIGNED (size, base_size)) - size = base_size; - } - if (offset == NULL_TREE) { offset_low = 0; @@ -8445,13 +8429,25 @@ pointer_may_wrap_p (tree base, tree offset, HOST_WIDE_INT bitpos) true)) return true; - if ((unsigned HOST_WIDE_INT) total_high - < (unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (size)) - return false; - if ((unsigned HOST_WIDE_INT) total_high - > (unsigned HOST_WIDE_INT) TREE_INT_CST_HIGH (size)) + if (total_high != 0) return true; - return total_low > TREE_INT_CST_LOW (size); + + size = int_size_in_bytes (TREE_TYPE (TREE_TYPE (base))); + if (size <= 0) + return true; + + /* We can do slightly better for SIZE if we have an ADDR_EXPR of an + array. */ + if (TREE_CODE (base) == ADDR_EXPR) + { + HOST_WIDE_INT base_size; + + base_size = int_size_in_bytes (TREE_TYPE (TREE_OPERAND (base, 0))); + if (base_size > 0 && size < base_size) + size = base_size; + } + + return total_low > (unsigned HOST_WIDE_INT) size; } /* Subroutine of fold_binary. This routine performs all of the diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cf06d4b0d1a..af0d3207a67 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2008-04-22 Ian Lance Taylor + + * gcc.c-torture/compile/20080419-1.c: New test. + 2008-04-22 Kris Van Hees PR testsuite/35981 diff --git a/gcc/testsuite/gcc.c-torture/compile/20080419-1.c b/gcc/testsuite/gcc.c-torture/compile/20080419-1.c new file mode 100644 index 00000000000..b257fea747f --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20080419-1.c @@ -0,0 +1,6 @@ +extern void *f(); +void dmi_scan_machine(void) { + char *p = f(), *q; + for (q = p; q < p + 10; q++) + ; +} -- 2.30.2