diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr37327.c | 48 | ||||
-rw-r--r-- | gcc/tree-vrp.c | 8 |
4 files changed, 67 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 37a3959571f..0766ec35d10 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-09-02 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/37327 + * tree-vrp.c (register_new_assert_for): Make sure to not have + TREE_OVERFLOW set on the bound. + 2008-09-02 Alexander Monakov <amonakov@ispras.ru> Fixed typo in date of the 2008-09-01 MOVE_RATIO commit. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 304e76c0cca..fa07075d089 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-09-02 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/37327 + * gcc.c-torture/compile/pr37327.c: New testcase. + 2008-09-02 Victor Kaplansky <victork@il.ibm.com> * gcc.dg/fastmath-2.c: New. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr37327.c b/gcc/testsuite/gcc.c-torture/compile/pr37327.c new file mode 100644 index 00000000000..7041d834ea2 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr37327.c @@ -0,0 +1,48 @@ +typedef signed char int8_t; +typedef short int int16_t; +typedef int int32_t; +typedef unsigned short int uint16_t; +typedef unsigned int uint32_t; +static inline uint32_t +safe_add_int8_t_s_s (int8_t si1, int16_t si2) +{ + if ((si1) && (si2) && (si1 > (1 - si2)) || (si1) && (si2 < 0) + && (si1 < (-128 - si2))) + return si1; + return si1 + si2; +} + +uint32_t g_2; +uint32_t g_113; +uint32_t g_145; +int32_t +func_17 (int32_t p_18, uint32_t p_19, uint32_t p_21) +{ + uint32_t l_23 = -1L; + return l_23; +} + +uint32_t +func_26 (uint16_t p_27) +{ + uint32_t l_424; + if (func_93 (func_59 (safe_add_int8_t_s_s (p_27, 1))), + func_124 (l_424, -7L, 1, g_145, 1, (safe_add_int8_t_s_s (1, 1)), 1), 1, + 1, 1) + func_117 (1, 1, + (safe_add_uint64_t_u_u + (1, (safe_add_int8_t_s_s (1, 0xCDF4BE7A1B7E4629LL)))), 1); + uint32_t l_210; + if (func_17 + ((safe_add_int8_t_s_s (g_2, (0x6C79A83AL | func_17 (1, 1, 1)))), + 0x4C9FL, 1)) + { + uint32_t l_212; + if (safe_mul_int32_t_s_s + ((1, 1, l_212, (1, (safe_add_int8_t_s_s (l_210, 1)), 1, 1)), 1)) + if (func_59 (1, (safe_add_int8_t_s_s (g_113, 1)))) + { + } + } +} + diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index 348382ecae3..8db35ca42d9 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -3785,6 +3785,14 @@ register_new_assert_for (tree name, tree expr, && gimple_code (gsi_stmt (si)) != GIMPLE_SWITCH); #endif + /* Never build an assert comparing against an integer constant with + TREE_OVERFLOW set. This confuses our undefined overflow warning + machinery. */ + if (TREE_CODE (val) == INTEGER_CST + && TREE_OVERFLOW (val)) + val = build_int_cst_wide (TREE_TYPE (val), + TREE_INT_CST_LOW (val), TREE_INT_CST_HIGH (val)); + /* The new assertion A will be inserted at BB or E. We need to determine if the new location is dominated by a previously registered location for A. If we are doing an edge insertion, |