On Wed, Jan 6, 2010 at 4:45 PM, Richard Guenther <richard.guent...@gmail.com> wrote: > On Wed, Jan 6, 2010 at 4:25 PM, torbenh <torb...@gmx.de> wrote: >> On Wed, Jan 06, 2010 at 02:27:15PM +0100, Richard Guenther wrote: >>> On Tue, Jan 5, 2010 at 5:39 PM, torbenh <torb...@gmx.de> wrote: >>> > On Tue, Jan 05, 2010 at 04:27:33PM +0100, Richard Guenther wrote: >>> >> On Tue, Jan 5, 2010 at 4:03 PM, torbenh <torb...@gmx.de> wrote: >>> >> > On Tue, Jan 05, 2010 at 02:46:30PM +0100, Richard Guenther wrote: >>> >> >> On Tue, Jan 5, 2010 at 2:40 PM, torbenh <torb...@gmx.de> wrote: >>> >> >> >>> >> >> The -fno-alias-X things do not make much sense for user code (they >>> >> >> have been historically used from Frontends). If restrict doesn't work >>> >> >> for you (do you have a testcase that can reproduce your issue?) >>> >> >> then you probably need to wait for IPA pointer analysis to be >>> >> >> fixed in GCC 4.6. >>> >> > >>> >> > sorry... forget the attachment :S >>> >> >>> >> Yes, in this case you can fix it by making ramp static. Otherwise its >>> >> address may be takein in another translation unit. For Fortran we >>> >> have the DECL_RESTRICTED_P which we could expose to other >>> >> languages via an attribute. It tells that a decl is not aliased by >>> >> restrict qualified pointers, so >>> >> >>> >> struct Ramp { >>> >> float phase; >>> >> inline float process() { return phase++; } >>> >> } ramp __attribute__((restrict)); >>> >> >>> >> void fill_buffer( float * __restrict buf, size_t nframes ) >>> >> { >>> >> for( size_t i=0; i<nframes; i++ ) >>> >> buf[i] = ramp.process(); >>> >> } >>> > >>> > would that also work with this stuff: >>> > >>> > >>> > template<typename ... Args> >>> > class Mixer; >>> > >>> > template<typename T1, typename ... Args> >>> > class Mixer<T1, Args...> : public Block >>> > { >>> > private: >>> > T1 t1 __attribute__((restrict)); >>> > Mixer<Args...> t2; >>> > public: >>> > inline float process() { >>> > return t1.process() + t2.process(); >>> > } >>> > }; >>> > >>> > template<typename T1, typename T2> >>> > class Mixer<T1,T2> : public Block >>> > { >>> > private: >>> > T1 t1 __attribute__((restrict)); >>> > T2 t2 __attribute__((restrict)); >>> > public: >>> > inline float process() { >>> > return t1.process() + t2.process(); >>> > } >>> > }; >>> > >>> > Mixer<Ramp,Ramp,Ramp,Ramp> mix __attribute__((restrict)) >> >> void fill_buffer( float * __restrict buf, size_t nframes ) >> { >> for( size_t i=0; i<nframes; i++ ) >> buf[i] = mix.process(); >> }
Btw, the same effect can be obtained by instead writing void fill_buffer( float * __restrict buf, size_t nframes ) { Mixer<Ramp,Ramp,Ramp,Ramp> * restrict mixp = &mix; for( size_t i=0; i<nframes; i++ ) buf[i] = mix->process(); } at least in theory (if it doesn't work its worth to try to fix it). Richard.