http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45983
Richard Guenther <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2010.10.12 14:24:28 CC| |rguenth at gcc dot gnu.org Ever Confirmed|0 |1 --- Comment #7 from Richard Guenther <rguenth at gcc dot gnu.org> 2010-10-12 14:24:28 UTC --- Reduced testcase for the LTO problem: typedef long unsigned int size_t; enum { chunk_size = 16, max_channels = 16 }; struct float4_t { }; template<size_t NumChans> class chunk_array_t { typedef float4_t value_type_t; typedef float scalar_type_t; typedef value_type_t value_array_t[chunk_size/4]; typedef scalar_type_t scalar_array_t[chunk_size]; value_array_t m[NumChans]; const scalar_array_t &decay(size_t c) const; }; template<size_t capacity> struct bitboard_t { struct scanner_t { scanner_t(const bitboard_t &b); size_t index() const; }; }; enum params_enum_t { PRM_VOL = 0, PRM_PAN, PRM_BND, PRM_MOD }; class midi_channels_params_t { float vals[4][max_channels]; public: template<params_enum_t p> float get_value(size_t cha) const { return vals[p][cha]; } }; class synth_t { typedef bitboard_t<max_channels> bb_channels_t; struct states_t { bb_channels_t mask_active_channels; }; midi_channels_params_t &channel_params; states_t &states; void output_audio(void); }; void synth_t::output_audio(void) { const bb_channels_t m(states.mask_active_channels); bb_channels_t::scanner_t cscan(m); const size_t chan = cscan.index(); float chan_vol = channel_params.get_value<PRM_VOL>(chan); }