diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-02-19 06:43:34 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2013-02-19 06:43:34 +0000 |
commit | 15c27dda16beb7329cf438551ef235a095fa6ed6 (patch) | |
tree | b3583e4fae0a1048750972ca87d851d54b34ee13 | |
parent | 971d8427614e1309ba169c0b765cd58dff1c7c81 (diff) | |
download | gcc-15c27dda16beb7329cf438551ef235a095fa6ed6.tar.gz |
PR tree-optimization/56381
* tree-ssa-pre.c (create_expression_by_pieces): Fix up last argument
to fold_build3.
* g++.dg/opt/pr56381.C: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@196133 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/c-family/ChangeLog | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/pr56381.C | 156 | ||||
-rw-r--r-- | gcc/tree-ssa-pre.c | 2 |
5 files changed, 170 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 83a466e9a39..884826439bd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,4 +1,10 @@ -2013-02-15 Aldy Hernandez <aldyh@redhat.com> +2013-02-19 Jakub Jelinek <jakub@redhat.com> + + PR tree-optimization/56381 + * tree-ssa-pre.c (create_expression_by_pieces): Fix up last argument + to fold_build3. + +2013-02-18 Aldy Hernandez <aldyh@redhat.com> Jakub Jelinek <jakub@redhat.com> PR target/52555 diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index afa9cd7a39a..50ad1016f7c 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,4 +1,4 @@ -2013-02-11 Aldy Hernandez <aldyh@redhat.com> +2013-02-18 Aldy Hernandez <aldyh@redhat.com> PR target/52555 * c-common.c (handle_optimize_attribute): Call diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8458cce659e..1828629494c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-02-19 Jakub Jelinek <jakub@redhat.com> + + PR tree-optimization/56381 + * g++.dg/opt/pr56381.C: New test. + 2013-02-18 Jakub Jelinek <jakub@redhat.com> PR pch/54117 diff --git a/gcc/testsuite/g++.dg/opt/pr56381.C b/gcc/testsuite/g++.dg/opt/pr56381.C new file mode 100644 index 00000000000..38a121d979a --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr56381.C @@ -0,0 +1,156 @@ +// PR tree-optimization/56381 +// { dg-do compile } +// { dg-options "-std=c++11 -O2 -w" } + +template <class> +class intrusive_ptr {}; +class BasicReferenceCounted +{ +}; +template <class T> +class ReferenceCountingPointer : intrusive_ptr <T> +{ +}; +typedef BasicReferenceCounted ReferenceCountedInConditions; +class PointTag; +template <typename T, typename> +struct PreciseFloatType +{ + typedef T Type; +}; +template <typename T, int N> +struct ExtVecTraits +{ + typedef T __attribute__ ((vector_size (N * sizeof (T)))) type; +}; +template <typename T, int N> +using ExtVec = typename ExtVecTraits <T, N>::type; +template <typename T> using Vec4 = ExtVec <T, 4>; +template <typename Vec> +Vec cross3 (Vec x, Vec y) +{ + Vec x1200 = (Vec) { x[2], x[0] }; + Vec y2010 { y[2], y[0], y[1], y[0] }; + Vec x2010 = (Vec) { x[2], x[0], x[1], x[0] }; + Vec y1200 = (Vec) { y[1], y[0] }; + return x1200 * y2010 - x2010 * y1200; +} +template <typename T> +struct Rot3 +{ + typedef Vec4 <T> Vec; + Vec axis[3]; +}; +class Basic2DVector +{ +}; +template <typename T> +struct Basic3DVector +{ + typedef Vec4 <T> MathVector; + Basic3DVector (MathVector iv) : v { (iv[0]), (iv[1]), (iv[2]), (iv[3]) } {} + T mag2 () {} + Basic3DVector unit () + { + T my_mag = mag2 (); + return (my_mag) ? (*this) * (T () / (my_mag)) : *this; + } + Basic3DVector + cross (Basic3DVector lh) { return cross3 (v, lh.v); } + Vec4 <T> v; +}; +template <class T> +Basic3DVector <T> operator * (Basic3DVector <T>, T); +template <class T, class, class> +struct PV3DBase +{ + typedef Basic3DVector <T> BasicVectorType; + template <class U> + PV3DBase (Basic3DVector <U> v) : theVector (v) {} + BasicVectorType basicVector () { return theVector; } + T x (); + T y (); + BasicVectorType theVector; +}; +class VectorTag; +template <class T, class FrameTag> +struct Vector3DBase:public PV3DBase <T, VectorTag, FrameTag> +{ + typedef PV3DBase <T, VectorTag, FrameTag> BaseClass; + template <class U> + Vector3DBase (Basic3DVector <U> v) : BaseClass (v) {} + Vector3DBase unit () { return (this->basicVector ().unit ()); } + template <class U> + Vector3DBase <typename PreciseFloatType <T, U>::Type, FrameTag> cross (Vector3DBase <U, FrameTag> v) + { + return (this->theVector.cross (v.basicVector ())); + } +}; +template <class T, class FrameTag> +class Point3DBase : public PV3DBase <T, PointTag, FrameTag> +{ +}; +template <typename T, typename U, class Frame> +Vector3DBase <typename PreciseFloatType <T, U>::Type, Frame> operator - (Point3DBase <T, Frame>, Point3DBase <U, Frame>); +class GlobalTag; +template <class T> +struct TkRotation +{ + typedef Vector3DBase <T, GlobalTag> GlobalVector; + TkRotation (GlobalVector aX, GlobalVector aY) + { + GlobalVector uX = aX.unit (); + GlobalVector uY = aY.unit (); + GlobalVector uZ (uX.cross (uY)); + rot.axis[2] = uZ.basicVector ().v; + } + Basic3DVector <T> z (); + Rot3 <T> rot; +}; +template <class T> +struct GloballyPositioned +{ + typedef Point3DBase <T, GlobalTag> PositionType; + typedef TkRotation <T> RotationType; + typedef Point3DBase <T, GlobalTag> GlobalPoint; + typedef Vector3DBase <T, GlobalTag> GlobalVector; + T iniPhi () { return 999.9978; } + GloballyPositioned (PositionType pos, RotationType rot) : thePos (pos), theRot (rot) { resetCache (); } + PositionType position () const; + RotationType rotation () const; + PositionType thePos; + RotationType theRot; + void resetCache () + { + if ((thePos.x () == 0.) && (thePos.y () == 0.)) + thePhi = 0.; + else + thePhi = iniPhi (); + } + T thePhi; +}; +class Plane; +using TangentPlane = Plane; +struct Surface : public GloballyPositioned <float>, ReferenceCountedInConditions +{ + typedef GloballyPositioned <float> Base; + Surface (PositionType pos, RotationType rot): + Base (pos, rot) {} +}; +struct Plane : Surface +{ + template <typename ... Args> + Plane (Args ... args): + Surface ((args) ...) {} +}; +class Cylinder : Surface +{ + void tangentPlane (const GlobalPoint &) const; +}; +void +Cylinder::tangentPlane (const GlobalPoint & aPoint) const +{ + GlobalVector yPlane (rotation ().z ()); + GlobalVector xPlane (yPlane.cross (aPoint - position ())); + new TangentPlane (aPoint, RotationType (xPlane, yPlane)); +} diff --git a/gcc/tree-ssa-pre.c b/gcc/tree-ssa-pre.c index 9ccec2156eb..10c8091758e 100644 --- a/gcc/tree-ssa-pre.c +++ b/gcc/tree-ssa-pre.c @@ -2923,7 +2923,7 @@ create_expression_by_pieces (basic_block block, pre_expr expr, break; case 3: folded = fold_build3 (nary->opcode, nary->type, - genop[0], genop[1], genop[3]); + genop[0], genop[1], genop[2]); break; default: gcc_unreachable (); |