re PR c++/62175 (Internal compiler error in gimplify_modify_expr gimplify.c:4616)
authorRichard Biener <rguenther@suse.de>
Tue, 26 Aug 2014 08:03:32 +0000 (08:03 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 26 Aug 2014 08:03:32 +0000 (08:03 +0000)
2014-08-26  Richard Biener  <rguenther@suse.de>

PR tree-optimization/62175
* tree-ssa-loop-niter.c (expand_simple_operations): Do not
expand possibly trapping operations.

* g++.dg/torture/pr62175.C: New testcase.

From-SVN: r214492

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr62175.C [new file with mode: 0644]
gcc/tree-ssa-loop-niter.c

index e1a1bea4a929452f5cbac130a48b59d456694ca2..fbfeccb93aae93630497b43193dac1019bed4b1f 100644 (file)
@@ -1,3 +1,9 @@
+2014-08-26  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/62175
+       * tree-ssa-loop-niter.c (expand_simple_operations): Do not
+       expand possibly trapping operations.
+
 2014-08-26  David Malcolm  <dmalcolm@redhat.com>
 
        * config/rs6000/rs6000.c (class swap_web_entry): Strengthen field
index eaacb5079d658d2eb9c52713063f5364fbcb6062..a71d281f7ba717499471c120bbb3b8561788c870 100644 (file)
@@ -1,3 +1,8 @@
+2014-08-26  Richard Biener  <rguenther@suse.de>
+
+       PR tree-optimization/62175
+       * g++.dg/torture/pr62175.C: New testcase.
+
 2014-08-25  Bernd Schmidt  <bernds@codesourcery.com>
 
        * gcc.c-torture/execute/execute.exp: Replace with slightly adapted
diff --git a/gcc/testsuite/g++.dg/torture/pr62175.C b/gcc/testsuite/g++.dg/torture/pr62175.C
new file mode 100644 (file)
index 0000000..bcdea61
--- /dev/null
@@ -0,0 +1,36 @@
+// { dg-do compile }
+// { dg-additional-options "-ftrapv" }
+
+struct B {
+    B(int = 0);
+};
+int c;
+int *d;
+struct G {
+    G();
+    int numProcs_;
+};
+int fn1();
+B fn2() {
+    if (c)
+      return 0;
+    return B();
+}
+
+long &fn3(long &p1, long &p2) {
+    if (p2 < p1)
+      return p2;
+    return p1;
+}
+
+void fn4(long p1) {
+    long a = fn1();
+    fn2();
+    int b = fn3(p1, a);
+    for (int i; i < b; ++i)
+      d[0] = 0;
+    for (; a < p1; ++a)
+      d[a] = 0;
+}
+
+G::G() { fn4(numProcs_ + 1); }
index d4d3e539771d83bd7dd8eb9014cff1d019c7dbdd..4da18556b7635c9d7b9db7d3ddc9431c9bcb4ab2 100644 (file)
@@ -1633,6 +1633,9 @@ expand_simple_operations (tree expr)
 
     case PLUS_EXPR:
     case MINUS_EXPR:
+      if (TYPE_OVERFLOW_TRAPS (TREE_TYPE (expr)))
+       return expr;
+      /* Fallthru.  */
     case POINTER_PLUS_EXPR:
       /* And increments and decrements by a constant are simple.  */
       e1 = gimple_assign_rhs2 (stmt);