On Wed, Feb 19, 2014 at 04:43:06AM +0000, Iyer, Balaji V wrote: > Attached, please find a patch with the test case attached (for1.cc). The > patch is the same but the cp-changelog has been modified to reflect the > new test-case. Is this OK to install?
1) have you tested the patch at all? I see FAIL: g++.dg/gomp/for-1.C -std=c++98 (test for errors, line 27) FAIL: g++.dg/gomp/for-1.C -std=c++98 (test for excess errors) FAIL: g++.dg/gomp/for-1.C -std=c++11 (test for errors, line 27) FAIL: g++.dg/gomp/for-1.C -std=c++11 (test for excess errors) FAIL: g++.dg/gomp/for-19.C -std=gnu++98 (internal compiler error) FAIL: g++.dg/gomp/for-19.C -std=gnu++98 (test for warnings, line 30) FAIL: g++.dg/gomp/for-19.C -std=gnu++98 (test for warnings, line 37) FAIL: g++.dg/gomp/for-19.C -std=gnu++98 (test for warnings, line 40) FAIL: g++.dg/gomp/for-19.C -std=gnu++98 (test for excess errors) FAIL: g++.dg/gomp/for-19.C -std=gnu++11 (internal compiler error) FAIL: g++.dg/gomp/for-19.C -std=gnu++11 (test for warnings, line 30) FAIL: g++.dg/gomp/for-19.C -std=gnu++11 (test for warnings, line 37) FAIL: g++.dg/gomp/for-19.C -std=gnu++11 (test for warnings, line 40) FAIL: g++.dg/gomp/for-19.C -std=gnu++11 (test for excess errors) regressions caused by the patch, that is of course unacceptable. 2) try this updated cf3.cc, e.g. with -O2 -fcilkplus if you can't find out why calling something multiple times is a bad idea, actually the latest patch is even worse than the older one, you now create 3 calls to the end method and 3 calls to operator-. There should be just one call to that, before the #pragma omp parallel obviously, anything that doesn't do that is just bad. I don't see a point in having if clause on the _Cilk_for, just keep it on the #pragma omp parallel only, at ompexp time you can easily find it there, there is no point to check it again in the parallel body of the function. typedef __PTRDIFF_TYPE__ ptrdiff_t; template <typename T> class I { public: typedef ptrdiff_t difference_type; I (); ~I (); I (T *); I (const I &); T &operator * (); T *operator -> (); T &operator [] (const difference_type &) const; I &operator = (const I &); I &operator ++ (); I operator ++ (int); I &operator -- (); I operator -- (int); I &operator += (const difference_type &); I &operator -= (const difference_type &); I operator + (const difference_type &) const; I operator - (const difference_type &) const; template <typename S> friend bool operator == (I<S> &, I<S> &); template <typename S> friend bool operator == (const I<S> &, const I<S> &); template <typename S> friend bool operator < (I<S> &, I<S> &); template <typename S> friend bool operator < (const I<S> &, const I<S> &); template <typename S> friend bool operator <= (I<S> &, I<S> &); template <typename S> friend bool operator <= (const I<S> &, const I<S> &); template <typename S> friend bool operator > (I<S> &, I<S> &); template <typename S> friend bool operator > (const I<S> &, const I<S> &); template <typename S> friend bool operator >= (I<S> &, I<S> &); template <typename S> friend bool operator >= (const I<S> &, const I<S> &); template <typename S> friend typename I<S>::difference_type operator - (I<S> &, I<S> &); template <typename S> friend typename I<S>::difference_type operator - (const I<S> &, const I<S> &); template <typename S> friend I<S> operator + (typename I<S>::difference_type , const I<S> &); private: T *p; }; template <typename T> I<T>::I () : p (0) {} template <typename T> I<T>::~I () {} template <typename T> I<T>::I (T *x) : p (x) {} template <typename T> I<T>::I (const I &x) : p (x.p) {} template <typename T> T &I<T>::operator * () { return *p; } template <typename T> T *I<T>::operator -> () { return p; } template <typename T> T &I<T>::operator [] (const difference_type &x) const { return p[x]; } template <typename T> I<T> &I<T>::operator = (const I &x) { p = x.p; return *this; } template <typename T> I<T> &I<T>::operator ++ () { ++p; return *this; } template <typename T> I<T> I<T>::operator ++ (int) { return I (p++); } template <typename T> I<T> &I<T>::operator -- () { --p; return *this; } template <typename T> I<T> I<T>::operator -- (int) { return I (p--); } template <typename T> I<T> &I<T>::operator += (const difference_type &x) { p += x; return *this; } template <typename T> I<T> &I<T>::operator -= (const difference_type &x) { p -= x; return *this; } template <typename T> I<T> I<T>::operator + (const difference_type &x) const { return I (p + x); } template <typename T> __attribute__((noinline)) I<T> I<T>::operator - (const difference_type &x) const { __asm (""); return I (p - x); } template <typename T> bool operator == (I<T> &x, I<T> &y) { return x.p == y.p; } template <typename T> bool operator == (const I<T> &x, const I<T> &y) { return x.p == y.p; } template <typename T> bool operator != (I<T> &x, I<T> &y) { return !(x == y); } template <typename T> bool operator != (const I<T> &x, const I<T> &y) { return !(x == y); } template <typename T> bool operator < (I<T> &x, I<T> &y) { return x.p < y.p; } template <typename T> bool operator < (const I<T> &x, const I<T> &y) { return x.p < y.p; } template <typename T> bool operator <= (I<T> &x, I<T> &y) { return x.p <= y.p; } template <typename T> bool operator <= (const I<T> &x, const I<T> &y) { return x.p <= y.p; } template <typename T> bool operator > (I<T> &x, I<T> &y) { return x.p > y.p; } template <typename T> bool operator > (const I<T> &x, const I<T> &y) { return x.p > y.p; } template <typename T> bool operator >= (I<T> &x, I<T> &y) { return x.p >= y.p; } template <typename T> bool operator >= (const I<T> &x, const I<T> &y) { return x.p >= y.p; } template <typename T> __attribute__((noinline)) typename I<T>::difference_type operator - (I<T> &x, I<T> &y) { __asm (""); return x.p - y.p; } template <typename T> __attribute__((noinline)) typename I<T>::difference_type operator - (const I<T> &x, const I<T> &y) { __asm (""); return x.p - y.p; } template <typename T> I<T> operator + (typename I<T>::difference_type x, const I<T> &y) { return I<T> (x + y.p); } template <typename T> class J { public: J(const I<T> &x, const I<T> &y) : b (x), e (y) {} const I<T> &begin (); const I<T> &end (); private: I<T> b, e; }; template <typename T> const I<T> &J<T>::begin () { return b; } template <typename T> __attribute__((noinline)) const I<T> &J<T>::end () { __asm (""); return e; } template <typename T> void baz (I<T> &i); void foo (J<int> j) { _Cilk_for (I<int> i = j.begin (); i < j.end (); i += 2) baz (i); } Jakub