summaryrefslogtreecommitdiff
path: root/gcc/testsuite/g++.dg/tree-ssa/ssa-sra-1.C
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/g++.dg/tree-ssa/ssa-sra-1.C')
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/ssa-sra-1.C61
1 files changed, 61 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/tree-ssa/ssa-sra-1.C b/gcc/testsuite/g++.dg/tree-ssa/ssa-sra-1.C
new file mode 100644
index 000000000..b2d5f4b05
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tree-ssa/ssa-sra-1.C
@@ -0,0 +1,61 @@
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-optimized" } */
+
+void link_error();
+
+
+struct State {
+ int p0, p1, p2;
+ inline State(){p0=0;p1=0;p2=0;}
+ inline State(const State &s) {
+ p0 = s.p0;
+ p1 = s.p1;
+ p2 = s.p2;
+ }
+
+ inline void operator =(const State &s) {
+ p0 = s.p0;
+ p1 = s.p1;
+ p2 = s.p2;
+ }
+
+ inline void step(void) {
+ p0 = p1+p2;
+ p1 = p0*p1+p2;
+ p2 = p0-p2;
+ }
+};
+
+
+inline void iterate_ok(State &inS1, State &inS2, unsigned int n)
+{
+ State s1 = inS1;
+ for (unsigned int i = 0; i < n; i++) {
+ s1.step();
+ }
+ inS1 = s1;
+}
+
+void temp()
+{
+ State s1;
+ s1.p0 = 0;
+ s1.p1 = 0;
+ s1.p2 = 0;
+ State s2;
+ s2.p0 = 0;
+ s2.p1 = 0;
+ s2.p2 = 0;
+ iterate_ok (s1, s2, 1);
+ if (s1.p0)
+ link_error();
+ if (s1.p0)
+ link_error();
+ if (s1.p0)
+ link_error();
+}
+
+/* We should have removed the casts from pointers to references and caused SRA to happen. */
+
+/* { dg-final { scan-tree-dump-times "link_error" 0 "optimized"} } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */