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.

Reply via email to