/* { dg-do compile } */
/* { dg-options "-ftree-vrp" } */

typedef int FLAC__int32;
typedef int FLAC__bool;
typedef struct { } FLAC__Subframe;
typedef 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;
typedef struct {
  struct FLAC__StreamEncoderProtected *protected_;
  struct FLAC__StreamEncoderPrivate *private_;
} FLAC__StreamEncoder;
typedef struct FLAC__StreamEncoderProtected {
  FLAC__bool loose_mid_side_stereo;
  unsigned channels;
  unsigned blocksize;
} FLAC__StreamEncoderProtected;
typedef struct FLAC__StreamEncoderPrivate {
  FLAC__int32 *integer_signal[(8u)];
  FLAC__Subframe subframe_workspace_mid_side[2][2];
  unsigned best_subframe_mid_side[2];
  unsigned loose_mid_side_stereo_frame_count;
} FLAC__StreamEncoderPrivate;
static void get_wasted_bits_(FLAC__int32 signal[], unsigned samples)
{
  unsigned i;
  FLAC__int32 x = 0;
  for(i = 0; i < samples && !(x&1); i++)
    x |= signal[i];
}
FLAC__Subframe * process_subframes_(FLAC__StreamEncoder *encoder, unsigned *bits)
{
  unsigned channel;
  FLAC__Subframe *left_subframe = 0;
  FLAC__ChannelAssignment channel_assignment;
  for(channel = 0; channel < encoder->protected_->channels; channel++)
      get_wasted_bits_(encoder->private_->integer_signal[channel], encoder->protected_->blocksize);
  if(encoder->protected_->loose_mid_side_stereo && encoder->private_->loose_mid_side_stereo_frame_count > 0)
      channel_assignment = FLAC__CHANNEL_ASSIGNMENT_MID_SIDE;
  else {
      FLAC__ChannelAssignment ca = (FLAC__ChannelAssignment)1;
      unsigned min_bits = bits[0];
      for(channel_assignment = (FLAC__ChannelAssignment)0; (int)ca <= 3; ca = (FLAC__ChannelAssignment)((int)ca + 1))
	  if(bits[ca] < min_bits)
	      channel_assignment = ca;
  }
  switch(channel_assignment) {
      case FLAC__CHANNEL_ASSIGNMENT_INDEPENDENT:
      case FLAC__CHANNEL_ASSIGNMENT_LEFT_SIDE:
      case FLAC__CHANNEL_ASSIGNMENT_RIGHT_SIDE:
      case FLAC__CHANNEL_ASSIGNMENT_MID_SIDE:
	  left_subframe = &encoder->private_->subframe_workspace_mid_side[0][encoder->private_->best_subframe_mid_side[0]];
  }
  return left_subframe;
}
