OSDN Git Service

2008-08-22 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 22 Aug 2008 12:43:49 +0000 (12:43 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 22 Aug 2008 12:43:49 +0000 (12:43 +0000)
PR middle-end/36548
PR middle-end/37125
* fold-const.c (extract_muldiv_1): Optimize (X * C1) % C2 only
if the multiplication does not overflow.

* gcc.c-torture/execute/pr37125.c: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@139450 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr37125.c [new file with mode: 0644]

index f788ef8..592b28c 100644 (file)
@@ -1,3 +1,10 @@
+2008-08-22  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/36548
+       PR middle-end/37125
+       * fold-const.c (extract_muldiv_1): Optimize (X * C1) % C2 only
+       if the multiplication does not overflow.
+
 2008-08-21  Nathan Sidwell  <nathan@codesourcery.com>
 
        * c-ppoutput.c (init_pp_output): Initialize src_line to 1.
index cba8826..e6769a6 100644 (file)
@@ -5930,9 +5930,20 @@ extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type,
         (C * 8) % 4 since we know that's zero.  */
       if ((code == TRUNC_MOD_EXPR || code == CEIL_MOD_EXPR
           || code == FLOOR_MOD_EXPR || code == ROUND_MOD_EXPR)
+         /* If the multiplication can overflow we cannot optimize this.
+            ???  Until we can properly mark individual operations as
+            not overflowing we need to treat sizetype special here as
+            stor-layout relies on this opimization to make
+            DECL_FIELD_BIT_OFFSET always a constant.  */
+         && (TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (t))
+             || (TREE_CODE (TREE_TYPE (t)) == INTEGER_TYPE
+                 && TYPE_IS_SIZETYPE (TREE_TYPE (t))))
          && TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST
          && integer_zerop (const_binop (TRUNC_MOD_EXPR, op1, c, 0)))
-       return omit_one_operand (type, integer_zero_node, op0);
+       {
+         *strict_overflow_p = true;
+         return omit_one_operand (type, integer_zero_node, op0);
+       }
 
       /* ... fall through ...  */
 
index ae16c70..061c219 100644 (file)
@@ -1,3 +1,9 @@
+2008-08-22  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/36548
+       PR middle-end/37125
+       * gcc.c-torture/execute/pr37125.c: New testcase.
+
 2008-08-22  Daniel Kraft  <d@domob.eu>
 
        * gfortran.dg/used_before_typed_4.f90: New test.
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr37125.c b/gcc/testsuite/gcc.c-torture/execute/pr37125.c
new file mode 100644 (file)
index 0000000..f29209e
--- /dev/null
@@ -0,0 +1,23 @@
+extern void abort (void);
+
+static inline unsigned int
+mod_rhs(int rhs)
+{
+  if (rhs == 0) return 1;
+  return rhs;
+}
+
+void func_44 (unsigned int p_45);
+void func_44 (unsigned int p_45)
+{
+  if (!((p_45 * -9) % mod_rhs (-9))) {
+      abort();
+  }
+}
+
+int main (void)
+{
+  func_44 (2);
+  return 0;
+}
+