summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/torture/pr36066.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/gcc.dg/torture/pr36066.c')
-rw-r--r--gcc/testsuite/gcc.dg/torture/pr36066.c54
1 files changed, 54 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/torture/pr36066.c b/gcc/testsuite/gcc.dg/torture/pr36066.c
new file mode 100644
index 000000000..0e1d1ce30
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr36066.c
@@ -0,0 +1,54 @@
+/* { dg-do compile } */
+/* { dg-options "-funsafe-loop-optimizations -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;
+}