111
|
1 /* { dg-do run } */
|
|
2 /* { dg-options "-O -fdump-tree-optimized-vops" } */
|
|
3
|
|
4 struct Value
|
|
5 {
|
|
6 double value;
|
|
7 Value(double value_) : value (value_) {}
|
|
8 operator double() const { return value; }
|
131
|
9 Value& operator=(double other) { value = other; return *this; }
|
111
|
10 };
|
|
11
|
|
12 struct Ref
|
|
13 {
|
|
14 const Value& m;
|
|
15 Ref(const Value& m_) : m(m_) {}
|
|
16 operator double() const { return m; }
|
|
17 };
|
|
18
|
|
19 struct Diff
|
|
20 {
|
|
21 const Ref lhs, rhs;
|
|
22 Diff(const Value& lhs_, const Value& rhs_) : lhs(lhs_), rhs(rhs_) {}
|
|
23 operator double() const { return lhs - rhs; }
|
|
24 };
|
|
25
|
|
26 extern "C" void abort (void);
|
|
27 int main(int argc, char *argv[])
|
|
28 {
|
|
29 Value I(1), m(4);
|
|
30 for(int a = 0; a < 1000; a++)
|
|
31 m = Diff (I, m);
|
|
32
|
|
33 if (!(m / 4 == I))
|
|
34 abort ();
|
|
35 return 0;
|
|
36 }
|
|
37
|
|
38 /* Check that we propagate
|
|
39 D.2182_13 = (struct Ref *) &D.2137.lhs;
|
|
40 to
|
|
41 D.2182_13->lhs.m ={v} &I;
|
|
42 yielding
|
|
43 D.2137.lhs.m ={v} &I;
|
|
44 so that SRA can promote all locals to registers and we end up
|
|
45 referencing two virtual operands at abort () and the return
|
|
46 after optimization. */
|
|
47
|
|
48 /* { dg-final { scan-tree-dump-times ".MEM_\[0-9\]*\\\(D\\\)" 2 "optimized" } } */
|