aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/opt/cfg1.C
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg/opt/cfg1.C')
-rw-r--r--gcc/testsuite/g++.dg/opt/cfg1.C36
1 files changed, 36 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/opt/cfg1.C b/gcc/testsuite/g++.dg/opt/cfg1.C
new file mode 100644
index 00000000000..dbc81fe9bd8
--- /dev/null
+++ b/gcc/testsuite/g++.dg/opt/cfg1.C
@@ -0,0 +1,36 @@
+// PR optimization/11083
+// Origin: <nick@ilm.com>
+// Reduced testcase by Wolfgang Bangerth <bangerth@ticam.utexas.edu>
+
+// The compiler used to keep unreachable basic blocks after dead edges
+// had been purged, which fooled the LCM code of the GCSE pass.
+
+// { dg-do compile }
+// { dg-options "-O2 -fnon-call-exceptions" }
+
+extern void *memmove (void *, const void *, unsigned int) throw ();
+
+struct S {
+ int *q;
+
+ S(int *i) : q(i) {}
+};
+
+struct X {
+ int *p;
+
+ void foo(S first, S last) {
+ try { memmove(0, 0, last.q - first.q); }
+ catch(...) { throw; }
+ }
+
+ void bar (const X& x);
+};
+
+void X::bar (const X& x)
+{
+ const unsigned int xlen = S(x.p).q - S(x.p).q;
+
+ if (xlen > 0)
+ foo(S(x.p), S(x.p));
+}