1139790Simp/* { dg-do compile } */
24Srgrimes/* { dg-options "-funsafe-loop-optimizations -ftree-vrp" } */
34Srgrimes
44Srgrimestypedef int FLAC__int32;
54Srgrimestypedef int FLAC__bool;
64Srgrimestypedef struct { } FLAC__Subframe;
74Srgrimestypedef enum { FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT = 0,  FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE = 1,  FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE = 2,  FLAC__CHANNEL_ASSIGNMENT_MID_SIDE = 3 } FLAC__ChannelAssignment;
84Srgrimestypedef struct {
94Srgrimes  struct FLAC__StreamEncoderProtected *protected_;
104Srgrimes  struct FLAC__StreamEncoderPrivate *private_;
114Srgrimes} FLAC__StreamEncoder;
124Srgrimestypedef struct FLAC__StreamEncoderProtected {
134Srgrimes  FLAC__bool loose_mid_side_stereo;
144Srgrimes  unsigned channels;
154Srgrimes  unsigned blocksize;
164Srgrimes} FLAC__StreamEncoderProtected;
174Srgrimestypedef struct FLAC__StreamEncoderPrivate {
184Srgrimes  FLAC__int32 *integer_signal[(8u)];
194Srgrimes  FLAC__Subframe subframe_workspace_mid_side[2][2];
204Srgrimes  unsigned best_subframe_mid_side[2];
214Srgrimes  unsigned loose_mid_side_stereo_frame_count;
224Srgrimes} FLAC__StreamEncoderPrivate;
234Srgrimesstatic void get_wasted_bits_(FLAC__int32 signal[], unsigned samples)
244Srgrimes{
254Srgrimes  unsigned i;
264Srgrimes  FLAC__int32 x = 0;
274Srgrimes  for(i = 0; i < samples && !(x&1); i++)
284Srgrimes    x |= signal[i];
29621Srgrimes}
3050477SpeterFLAC__Subframe * process_subframes_(FLAC__StreamEncoder *encoder, unsigned *bits)
314Srgrimes{
324Srgrimes  unsigned channel;
33719Swollman  FLAC__Subframe *left_subframe = 0;
3425549Speter  FLAC__ChannelAssignment channel_assignment;
35719Swollman  for(channel = 0; channel < encoder->protected_->channels; channel++)
3685449Sjhb      get_wasted_bits_(encoder->private_->integer_signal[channel], encoder->protected_->blocksize);
3746129Sluoqi  if(encoder->protected_->loose_mid_side_stereo && encoder->private_->loose_mid_side_stereo_frame_count > 0)
3885449Sjhb      channel_assignment = FLAC__CHANNEL_ASSIGNMENT_MID_SIDE;
3985449Sjhb  else {
4085449Sjhb      FLAC__ChannelAssignment ca = (FLAC__ChannelAssignment)1;
4185449Sjhb      unsigned min_bits = bits[0];
4285449Sjhb      for(channel_assignment = (FLAC__ChannelAssignment)0; (int)ca <= 3; ca = (FLAC__ChannelAssignment)((int)ca + 1))
4385449Sjhb	  if(bits[ca] < min_bits)
4485449Sjhb	      channel_assignment = ca;
4585449Sjhb  }
464Srgrimes  switch(channel_assignment) {
4715174Snate      case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT:
48169802Sjeff      case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE:
49169802Sjeff      case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE:
504Srgrimes      case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE:
5183366Sjulian	  left_subframe = &encoder->private_->subframe_workspace_mid_side[0][encoder->private_->best_subframe_mid_side[0]];
52144637Sjhb  }
53144637Sjhb  return left_subframe;
54233291Salc}
5583366Sjulian