diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index cbb10dab60468e394719c75a743cc743424e9364..057fd7c5973855b6fcd7ca89df9360fbc32a2b5a 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-11-02  Tom de Vries  <tom@codesourcery.com>
+
+	PR tree-optimization/50763
+	* g++.dg/pr50763-3.C: New test.
+
 2011-11-02  Tom de Vries  <tom@codesourcery.com>
 
 	PR tree-optimization/50672
diff --git a/gcc/testsuite/g++.dg/pr50763-3.C b/gcc/testsuite/g++.dg/pr50763-3.C
new file mode 100644
index 0000000000000000000000000000000000000000..b66be87b1b8821087a9e10436ac19baac448c711
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr50763-3.C
@@ -0,0 +1,57 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target ilp32 } */
+/* { dg-options "-O2 -ftree-tail-merge" } */
+
+class v2d {
+public:
+   double x;
+   double y;
+};
+
+class v3d {
+public:
+   double x;
+   v3d() {}
+   v3d(const v2d & cr2Dv) {}
+};
+
+class e2d {
+protected:
+   v2d _Min;
+   v2d _Max;
+public:
+   int cop2d(const v2d & rPnt) const;
+   v2d clp2d(const v2d & rPnt) const;
+};
+
+inline int e2d::cop2d(const v2d & rPnt) const {
+   int bRet = 1;
+   if (rPnt.x < _Min.x) bRet = 0;
+   else if (rPnt.x > _Max.x) bRet = 0;
+   else if (rPnt.y > _Max.y) bRet = 0;
+   return bRet;
+}
+
+inline v2d e2d::clp2d(const v2d & rPnt) const {
+   v2d sRet = rPnt;
+   if (rPnt.x < _Min.x) sRet.x = _Min.x;
+   if (rPnt.y < _Min.y) sRet.y = _Min.y;
+   if (rPnt.x > _Max.x) sRet.x = _Max.x;
+   if (rPnt.y > _Max.y) sRet.y = _Max.y;
+   return sRet;
+}
+
+class sExt {
+protected:
+   e2d _Dom;
+   long eval() const;
+   long evalPoint(const v2d & crUV, v3d & rPnt) const;
+};
+
+long sExt::evalPoint(const v2d & crUV, v3d & rPnt) const {
+   v3d sUV = crUV;
+   if (!_Dom.cop2d(crUV)) {
+      sUV = _Dom.clp2d(crUV);
+   }
+   eval();
+}