On Wed, Jan 6, 2010 at 4:45 PM, Richard Guenther
<[email protected]> wrote:
> On Wed, Jan 6, 2010 at 4:25 PM, torbenh <[email protected]> wrote:
>> On Wed, Jan 06, 2010 at 02:27:15PM +0100, Richard Guenther wrote:
>>> On Tue, Jan 5, 2010 at 5:39 PM, torbenh <[email protected]> wrote:
>>> > On Tue, Jan 05, 2010 at 04:27:33PM +0100, Richard Guenther wrote:
>>> >> On Tue, Jan 5, 2010 at 4:03 PM, torbenh <[email protected]> wrote:
>>> >> > On Tue, Jan 05, 2010 at 02:46:30PM +0100, Richard Guenther wrote:
>>> >> >> On Tue, Jan 5, 2010 at 2:40 PM, torbenh <[email protected]> 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.