annotate gcc/testsuite/g++.dg/opt/pr56381.C @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 // PR tree-optimization/56381
kono
parents:
diff changeset
2 // { dg-do compile { target c++11 } }
kono
parents:
diff changeset
3 // { dg-options "-O2 -w" }
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 template <class>
kono
parents:
diff changeset
6 class intrusive_ptr {};
kono
parents:
diff changeset
7 class BasicReferenceCounted
kono
parents:
diff changeset
8 {
kono
parents:
diff changeset
9 };
kono
parents:
diff changeset
10 template <class T>
kono
parents:
diff changeset
11 class ReferenceCountingPointer : intrusive_ptr <T>
kono
parents:
diff changeset
12 {
kono
parents:
diff changeset
13 };
kono
parents:
diff changeset
14 typedef BasicReferenceCounted ReferenceCountedInConditions;
kono
parents:
diff changeset
15 class PointTag;
kono
parents:
diff changeset
16 template <typename T, typename>
kono
parents:
diff changeset
17 struct PreciseFloatType
kono
parents:
diff changeset
18 {
kono
parents:
diff changeset
19 typedef T Type;
kono
parents:
diff changeset
20 };
kono
parents:
diff changeset
21 template <typename T, int N>
kono
parents:
diff changeset
22 struct ExtVecTraits
kono
parents:
diff changeset
23 {
kono
parents:
diff changeset
24 typedef T __attribute__ ((vector_size (N * sizeof (T)))) type;
kono
parents:
diff changeset
25 };
kono
parents:
diff changeset
26 template <typename T, int N>
kono
parents:
diff changeset
27 using ExtVec = typename ExtVecTraits <T, N>::type;
kono
parents:
diff changeset
28 template <typename T> using Vec4 = ExtVec <T, 4>;
kono
parents:
diff changeset
29 template <typename Vec>
kono
parents:
diff changeset
30 Vec cross3 (Vec x, Vec y)
kono
parents:
diff changeset
31 {
kono
parents:
diff changeset
32 Vec x1200 = (Vec) { x[2], x[0] };
kono
parents:
diff changeset
33 Vec y2010 { y[2], y[0], y[1], y[0] };
kono
parents:
diff changeset
34 Vec x2010 = (Vec) { x[2], x[0], x[1], x[0] };
kono
parents:
diff changeset
35 Vec y1200 = (Vec) { y[1], y[0] };
kono
parents:
diff changeset
36 return x1200 * y2010 - x2010 * y1200;
kono
parents:
diff changeset
37 }
kono
parents:
diff changeset
38 template <typename T>
kono
parents:
diff changeset
39 struct Rot3
kono
parents:
diff changeset
40 {
kono
parents:
diff changeset
41 typedef Vec4 <T> Vec;
kono
parents:
diff changeset
42 Vec axis[3];
kono
parents:
diff changeset
43 };
kono
parents:
diff changeset
44 class Basic2DVector
kono
parents:
diff changeset
45 {
kono
parents:
diff changeset
46 };
kono
parents:
diff changeset
47 template <typename T>
kono
parents:
diff changeset
48 struct Basic3DVector
kono
parents:
diff changeset
49 {
kono
parents:
diff changeset
50 typedef Vec4 <T> MathVector;
kono
parents:
diff changeset
51 Basic3DVector (MathVector iv) : v { (iv[0]), (iv[1]), (iv[2]), (iv[3]) } {}
kono
parents:
diff changeset
52 T mag2 () {}
kono
parents:
diff changeset
53 Basic3DVector unit ()
kono
parents:
diff changeset
54 {
kono
parents:
diff changeset
55 T my_mag = mag2 ();
kono
parents:
diff changeset
56 return (my_mag) ? (*this) * (T () / (my_mag)) : *this;
kono
parents:
diff changeset
57 }
kono
parents:
diff changeset
58 Basic3DVector
kono
parents:
diff changeset
59 cross (Basic3DVector lh) { return cross3 (v, lh.v); }
kono
parents:
diff changeset
60 Vec4 <T> v;
kono
parents:
diff changeset
61 };
kono
parents:
diff changeset
62 template <class T>
kono
parents:
diff changeset
63 Basic3DVector <T> operator * (Basic3DVector <T>, T);
kono
parents:
diff changeset
64 template <class T, class, class>
kono
parents:
diff changeset
65 struct PV3DBase
kono
parents:
diff changeset
66 {
kono
parents:
diff changeset
67 typedef Basic3DVector <T> BasicVectorType;
kono
parents:
diff changeset
68 template <class U>
kono
parents:
diff changeset
69 PV3DBase (Basic3DVector <U> v) : theVector (v) {}
kono
parents:
diff changeset
70 BasicVectorType basicVector () { return theVector; }
kono
parents:
diff changeset
71 T x ();
kono
parents:
diff changeset
72 T y ();
kono
parents:
diff changeset
73 BasicVectorType theVector;
kono
parents:
diff changeset
74 };
kono
parents:
diff changeset
75 class VectorTag;
kono
parents:
diff changeset
76 template <class T, class FrameTag>
kono
parents:
diff changeset
77 struct Vector3DBase:public PV3DBase <T, VectorTag, FrameTag>
kono
parents:
diff changeset
78 {
kono
parents:
diff changeset
79 typedef PV3DBase <T, VectorTag, FrameTag> BaseClass;
kono
parents:
diff changeset
80 template <class U>
kono
parents:
diff changeset
81 Vector3DBase (Basic3DVector <U> v) : BaseClass (v) {}
kono
parents:
diff changeset
82 Vector3DBase unit () { return (this->basicVector ().unit ()); }
kono
parents:
diff changeset
83 template <class U>
kono
parents:
diff changeset
84 Vector3DBase <typename PreciseFloatType <T, U>::Type, FrameTag> cross (Vector3DBase <U, FrameTag> v)
kono
parents:
diff changeset
85 {
kono
parents:
diff changeset
86 return (this->theVector.cross (v.basicVector ()));
kono
parents:
diff changeset
87 }
kono
parents:
diff changeset
88 };
kono
parents:
diff changeset
89 template <class T, class FrameTag>
kono
parents:
diff changeset
90 class Point3DBase : public PV3DBase <T, PointTag, FrameTag>
kono
parents:
diff changeset
91 {
kono
parents:
diff changeset
92 };
kono
parents:
diff changeset
93 template <typename T, typename U, class Frame>
kono
parents:
diff changeset
94 Vector3DBase <typename PreciseFloatType <T, U>::Type, Frame> operator - (Point3DBase <T, Frame>, Point3DBase <U, Frame>);
kono
parents:
diff changeset
95 class GlobalTag;
kono
parents:
diff changeset
96 template <class T>
kono
parents:
diff changeset
97 struct TkRotation
kono
parents:
diff changeset
98 {
kono
parents:
diff changeset
99 typedef Vector3DBase <T, GlobalTag> GlobalVector;
kono
parents:
diff changeset
100 TkRotation (GlobalVector aX, GlobalVector aY)
kono
parents:
diff changeset
101 {
kono
parents:
diff changeset
102 GlobalVector uX = aX.unit ();
kono
parents:
diff changeset
103 GlobalVector uY = aY.unit ();
kono
parents:
diff changeset
104 GlobalVector uZ (uX.cross (uY));
kono
parents:
diff changeset
105 rot.axis[2] = uZ.basicVector ().v;
kono
parents:
diff changeset
106 }
kono
parents:
diff changeset
107 Basic3DVector <T> z ();
kono
parents:
diff changeset
108 Rot3 <T> rot;
kono
parents:
diff changeset
109 };
kono
parents:
diff changeset
110 template <class T>
kono
parents:
diff changeset
111 struct GloballyPositioned
kono
parents:
diff changeset
112 {
kono
parents:
diff changeset
113 typedef Point3DBase <T, GlobalTag> PositionType;
kono
parents:
diff changeset
114 typedef TkRotation <T> RotationType;
kono
parents:
diff changeset
115 typedef Point3DBase <T, GlobalTag> GlobalPoint;
kono
parents:
diff changeset
116 typedef Vector3DBase <T, GlobalTag> GlobalVector;
kono
parents:
diff changeset
117 T iniPhi () { return 999.9978; }
kono
parents:
diff changeset
118 GloballyPositioned (PositionType pos, RotationType rot) : thePos (pos), theRot (rot) { resetCache (); }
kono
parents:
diff changeset
119 PositionType position () const;
kono
parents:
diff changeset
120 RotationType rotation () const;
kono
parents:
diff changeset
121 PositionType thePos;
kono
parents:
diff changeset
122 RotationType theRot;
kono
parents:
diff changeset
123 void resetCache ()
kono
parents:
diff changeset
124 {
kono
parents:
diff changeset
125 if ((thePos.x () == 0.) && (thePos.y () == 0.))
kono
parents:
diff changeset
126 thePhi = 0.;
kono
parents:
diff changeset
127 else
kono
parents:
diff changeset
128 thePhi = iniPhi ();
kono
parents:
diff changeset
129 }
kono
parents:
diff changeset
130 T thePhi;
kono
parents:
diff changeset
131 };
kono
parents:
diff changeset
132 class Plane;
kono
parents:
diff changeset
133 using TangentPlane = Plane;
kono
parents:
diff changeset
134 struct Surface : public GloballyPositioned <float>, ReferenceCountedInConditions
kono
parents:
diff changeset
135 {
kono
parents:
diff changeset
136 typedef GloballyPositioned <float> Base;
kono
parents:
diff changeset
137 Surface (PositionType pos, RotationType rot):
kono
parents:
diff changeset
138 Base (pos, rot) {}
kono
parents:
diff changeset
139 };
kono
parents:
diff changeset
140 struct Plane : Surface
kono
parents:
diff changeset
141 {
kono
parents:
diff changeset
142 template <typename ... Args>
kono
parents:
diff changeset
143 Plane (Args ... args):
kono
parents:
diff changeset
144 Surface ((args) ...) {}
kono
parents:
diff changeset
145 };
kono
parents:
diff changeset
146 class Cylinder : Surface
kono
parents:
diff changeset
147 {
kono
parents:
diff changeset
148 void tangentPlane (const GlobalPoint &) const;
kono
parents:
diff changeset
149 };
kono
parents:
diff changeset
150 void
kono
parents:
diff changeset
151 Cylinder::tangentPlane (const GlobalPoint & aPoint) const
kono
parents:
diff changeset
152 {
kono
parents:
diff changeset
153 GlobalVector yPlane (rotation ().z ());
kono
parents:
diff changeset
154 GlobalVector xPlane (yPlane.cross (aPoint - position ()));
kono
parents:
diff changeset
155 new TangentPlane (aPoint, RotationType (xPlane, yPlane));
kono
parents:
diff changeset
156 }