Switch iteration over channels to the do{}while(); construct in order to inform the compiler that the these loops execute at least once. (This results in more intelligent output from the clang static analysis tool and should also produce faster code on at least some architectures.)
diff --git a/libcelt/bands.c b/libcelt/bands.c
index 8c91889..8fd21d6 100644
--- a/libcelt/bands.c
+++ b/libcelt/bands.c
@@ -70,8 +70,7 @@
    const celt_int16 *eBands = m->eBands;
    const int C = CHANNELS(_C);
    N = M*m->shortMdctSize;
-   for (c=0;c<C;c++)
-   {
+   c=0; do {
       for (i=0;i<end;i++)
       {
          int j;
@@ -98,7 +97,7 @@
          }
          /*printf ("%f ", bank[i+c*m->nbEBands]);*/
       }
-   }
+   } while (++c<C);
    /*printf ("\n");*/
 }
 
@@ -109,8 +108,7 @@
    const celt_int16 *eBands = m->eBands;
    const int C = CHANNELS(_C);
    N = M*m->shortMdctSize;
-   for (c=0;c<C;c++)
-   {
+   c=0; do {
       i=0; do {
          celt_word16 g;
          int j,shift;
@@ -122,7 +120,7 @@
             X[j+c*N] = MULT16_16_Q15(VSHR32(freq[j+c*N],shift-1),g);
          } while (++j<M*eBands[i+1]);
       } while (++i<end);
-   }
+   } while (++c<C);
 }
 
 #else /* FIXED_POINT */
@@ -133,8 +131,7 @@
    const celt_int16 *eBands = m->eBands;
    const int C = CHANNELS(_C);
    N = M*m->shortMdctSize;
-   for (c=0;c<C;c++)
-   {
+   c=0; do {
       for (i=0;i<end;i++)
       {
          int j;
@@ -144,7 +141,7 @@
          bank[i+c*m->nbEBands] = celt_sqrt(sum);
          /*printf ("%f ", bank[i+c*m->nbEBands]);*/
       }
-   }
+   } while (++c<C);
    /*printf ("\n");*/
 }
 
@@ -155,8 +152,7 @@
    const celt_int16 *eBands = m->eBands;
    const int C = CHANNELS(_C);
    N = M*m->shortMdctSize;
-   for (c=0;c<C;c++)
-   {
+   c=0; do {
       for (i=0;i<end;i++)
       {
          int j;
@@ -164,7 +160,7 @@
          for (j=M*eBands[i];j<M*eBands[i+1];j++)
             X[j+c*N] = freq[j+c*N]*g;
       }
-   }
+   } while (++c<C);
 }
 
 #endif /* FIXED_POINT */
@@ -177,8 +173,7 @@
    const int C = CHANNELS(_C);
    N = M*m->shortMdctSize;
    celt_assert2(C<=2, "denormalise_bands() not implemented for >2 channels");
-   for (c=0;c<C;c++)
-   {
+   c=0; do {
       celt_sig * restrict f;
       const celt_norm * restrict x;
       f = freq+c*N;
@@ -196,7 +191,7 @@
       }
       for (i=M*eBands[m->nbEBands];i<N;i++)
          *f++ = 0;
-   }
+   } while (++c<C);
 }
 
 static void intensity_stereo(const CELTMode *m, celt_norm *X, celt_norm *Y, const celt_ener *bank, int bandID, int N)
@@ -299,8 +294,7 @@
 
    if (M*(eBands[end]-eBands[end-1]) <= 8)
       return 0;
-   for (c=0;c<C;c++)
-   {
+   c=0; do {
       for (i=0;i<end;i++)
       {
          int j, N, tmp=0;
@@ -327,7 +321,7 @@
          sum += tmp*256;
          nbBands++;
       }
-   }
+   } while (++c<C);
    sum /= nbBands;
    /* Recursive averaging */
    sum = (sum+*average)>>1;
@@ -386,12 +380,11 @@
       float g;
       if (bandE0[i]<10 || (C==2 && bandE0[i+m->nbEBands]<1))
          continue;
-      for (c=0;c<C;c++)
-      {
+      c=0; do {
          g = bandE[i+c*m->nbEBands]/(1e-15+bandE0[i+c*m->nbEBands]);
          for (j=M*m->eBands[i];j<M*m->eBands[i+1];j++)
             MSE[i] += (g*X[j+c*N]-X0[j+c*N])*(g*X[j+c*N]-X0[j+c*N]);
-      }
+      } while (++c<C);
       MSECount[i]+=C;
    }
    nbMSEBands = m->nbEBands;
@@ -509,8 +502,7 @@
    {
       int c;
       celt_norm *x = X;
-      for (c=0;c<1+stereo;c++)
-      {
+      c=0; do {
          int sign=0;
          if (*remaining_bits>=1<<BITRES)
          {
@@ -527,7 +519,7 @@
          if (resynth)
             x[0] = sign ? -NORM_SCALING : NORM_SCALING;
          x = Y;
-      }
+      } while (++c<1+stereo);
       if (lowband_out)
          lowband_out[0] = SHR16(X[0],4);
       return;
diff --git a/libcelt/celt.c b/libcelt/celt.c
index e34a45f..404a770 100644
--- a/libcelt/celt.c
+++ b/libcelt/celt.c
@@ -274,8 +274,7 @@
          B = shortBlocks;
       }
       ALLOC(tmp, N, celt_word32);
-      for (c=0;c<C;c++)
-      {
+      c=0; do {
          for (b=0;b<B;b++)
          {
             int j;
@@ -284,7 +283,7 @@
             for (j=0;j<N;j++)
                out[(j*B+b)+c*N*B] = tmp[j];
          }
-      }
+      } while (++c<C);
       RESTORE_STACK;
    }
 }
@@ -299,8 +298,7 @@
    const int C = CHANNELS(_C);
    const int N = mode->shortMdctSize<<LM;
    const int overlap = OVERLAP(mode);
-   for (c=0;c<C;c++)
-   {
+   c=0; do {
       int j;
          VARDECL(celt_word32, x);
          VARDECL(celt_word32, tmp);
@@ -335,15 +333,14 @@
          for (j=0;j<overlap;j++)
             overlap_mem[c][j] = x[N+j];
          RESTORE_STACK;
-   }
+   } while (++c<C);
 }
 
 static void deemphasis(celt_sig *in[], celt_word16 *pcm, int N, int _C, const celt_word16 *coef, celt_sig *mem)
 {
    const int C = CHANNELS(_C);
    int c;
-   for (c=0;c<C;c++)
-   {
+   c=0; do {
       int j;
       celt_sig * restrict x;
       celt_word16  * restrict y;
@@ -361,7 +358,7 @@
          y+=C;
       }
       mem[c] = m;
-   }
+   } while (++c<C);
 }
 
 #ifdef ENABLE_POSTFILTER
@@ -629,13 +626,12 @@
 #if 0
    float diff=0;
    int c;
-   for (c=0;c<C;c++)
-   {
+   c=0; do {
       for (i=0;i<nbEBands-1;i++)
       {
          diff += bandLogE[i+c*nbEBands]*(i-.5*nbEBands);
       }
-   }
+   } while (++c<0);
    diff /= C*(nbEBands-1);
    /*printf("%f\n", diff);*/
    if (diff > 4)
@@ -737,8 +733,7 @@
       pre[0] = _pre;
       pre[1] = _pre + (N+COMBFILTER_MAXPERIOD);
 
-      for (c=0;c<C;c++)
-      {
+      c=0; do {
          const celt_word16 * restrict pcmp = pcm+c;
          celt_sig * restrict inp = in+c*(N+st->overlap)+st->overlap;
 
@@ -754,7 +749,7 @@
          }
          CELT_COPY(pre[c], prefilter_mem+c*COMBFILTER_MAXPERIOD, COMBFILTER_MAXPERIOD);
          CELT_COPY(pre[c]+COMBFILTER_MAXPERIOD, in+c*(N+st->overlap)+st->overlap, N);
-      }
+      } while (++c<C);
 
 #ifdef ENABLE_POSTFILTER
       {
@@ -804,8 +799,7 @@
       ec_enc_bit_prob(enc, 0, 32768);
 #endif /* ENABLE_POSTFILTER */
 
-      for (c=0;c<C;c++)
-      {
+      c=0; do {
          CELT_COPY(in+c*(N+st->overlap), st->in_mem+c*(st->overlap), st->overlap);
 #ifdef ENABLE_POSTFILTER
          comb_filter(in+c*(N+st->overlap)+st->overlap, pre[c]+COMBFILTER_MAXPERIOD,
@@ -822,7 +816,7 @@
             CELT_MOVE(prefilter_mem+c*COMBFILTER_MAXPERIOD+COMBFILTER_MAXPERIOD-N, pre[c]+COMBFILTER_MAXPERIOD, N);
          }
 #endif /* ENABLE_POSTFILTER */
-      }
+      } while (++c<C);
 
       RESTORE_STACK;
    }
@@ -1018,9 +1012,10 @@
 #ifdef MEASURE_NORM_MSE
    float X0[3000];
    float bandE0[60];
-   for (c=0;c<C;c++)
+   c=0; do 
       for (i=0;i<N;i++)
          X0[i+c*N] = X[i+c*N];
+   while (++c<C);
    for (i=0;i<C*st->mode->nbEBands;i++)
       bandE0[i] = bandE[i];
 #endif
@@ -1050,30 +1045,32 @@
       if (C==2)
          CELT_MOVE(st->syn_mem[1], st->syn_mem[1]+N, MAX_PERIOD);
 
-      for (c=0;c<C;c++)
+      c=0; do
          for (i=0;i<M*st->mode->eBands[st->start];i++)
             freq[c*N+i] = 0;
-      for (c=0;c<C;c++)
+      while (++c<C);
+      c=0; do
          for (i=M*st->mode->eBands[st->end];i<N;i++)
             freq[c*N+i] = 0;
+      while (++c<C);
 
       out_mem[0] = st->syn_mem[0]+MAX_PERIOD;
       if (C==2)
          out_mem[1] = st->syn_mem[1]+MAX_PERIOD;
 
-      for (c=0;c<C;c++)
+      c=0; do
          overlap_mem[c] = _overlap_mem + c*st->overlap;
+      while (++c<C);
 
       compute_inv_mdcts(st->mode, shortBlocks, freq, out_mem, overlap_mem, C, LM);
 
 #ifdef ENABLE_POSTFILTER
-      for (c=0;c<C;c++)
-      {
+      c=0; do {
          comb_filter(out_mem[c], out_mem[c], st->prefilter_period, st->prefilter_period, st->overlap, C,
                st->prefilter_gain, st->prefilter_gain, NULL, 0);
          comb_filter(out_mem[c]+st->overlap, out_mem[c]+st->overlap, st->prefilter_period, pitch_index, N-st->overlap, C,
                st->prefilter_gain, gain1, st->mode->window, st->mode->overlap);
-      }
+      } while (++c<C);
 #endif /* ENABLE_POSTFILTER */
 
       deemphasis(out_mem, (celt_word16*)pcm, N, C, st->mode->preemph, st->preemph_memD);
@@ -1368,12 +1365,11 @@
    celt_word16 *lpc;
    SAVE_STACK;
    
-   for (c=0;c<C;c++)
-   {
+   c=0; do {
       decode_mem[c] = st->_decode_mem + c*(DECODE_BUFFER_SIZE+st->overlap);
       out_mem[c] = decode_mem[c]+DECODE_BUFFER_SIZE-MAX_PERIOD;
       overlap_mem[c] = decode_mem[c]+DECODE_BUFFER_SIZE;
-   }
+   } while (++c<C);
    lpc = (celt_word16*)(st->_decode_mem+(DECODE_BUFFER_SIZE+st->overlap)*C);
 
    len = N+st->mode->overlap;
@@ -1402,8 +1398,7 @@
          fade = 0;
    }
 
-   for (c=0;c<C;c++)
-   {
+   c=0; do {
       /* FIXME: This is more memory than necessary */
       celt_word32 e[2*MAX_PERIOD];
       celt_word16 exc[2*MAX_PERIOD];
@@ -1532,7 +1527,7 @@
 #endif /* ENABLE_POSTFILTER */
       for (i=0;i<overlap;i++)
          out_mem[c][MAX_PERIOD+i] = e[i];
-   }
+   } while (++c<C);
 
    {
       celt_word32 *out_syn[2];
@@ -1597,12 +1592,11 @@
       return CELT_BAD_ARG;
    M=1<<LM;
 
-   for (c=0;c<C;c++)
-   {
+   c=0; do {
       decode_mem[c] = st->_decode_mem + c*(DECODE_BUFFER_SIZE+st->overlap);
       out_mem[c] = decode_mem[c]+DECODE_BUFFER_SIZE-MAX_PERIOD;
       overlap_mem[c] = decode_mem[c]+DECODE_BUFFER_SIZE;
-   }
+   } while (++c<C);
    lpc = (celt_word16*)(st->_decode_mem+(DECODE_BUFFER_SIZE+st->overlap)*C);
    oldBandE = lpc+C*LPC_ORDER;
 
@@ -1615,12 +1609,14 @@
    ALLOC(freq, C*N, celt_sig); /**< Interleaved signal MDCTs */
    ALLOC(X, C*N, celt_norm);   /**< Interleaved normalised MDCTs */
    ALLOC(bandE, st->mode->nbEBands*C, celt_ener);
-   for (c=0;c<C;c++)
+   c=0; do
       for (i=0;i<M*st->mode->eBands[st->start];i++)
          X[c*N+i] = 0;
-   for (c=0;c<C;c++)
+   while (++c<C);
+   c=0; do   
       for (i=M*st->mode->eBands[effEnd];i<N;i++)
          X[c*N+i] = 0;
+   while (++c<C);
 
    if (data == NULL)
    {
@@ -1731,12 +1727,14 @@
    if (C==2)
       CELT_MOVE(decode_mem[1], decode_mem[1]+N, DECODE_BUFFER_SIZE-N);
 
-   for (c=0;c<C;c++)
+   c=0; do
       for (i=0;i<M*st->mode->eBands[st->start];i++)
          freq[c*N+i] = 0;
-   for (c=0;c<C;c++)
+   while (++c<C);
+   c=0; do
       for (i=M*st->mode->eBands[effEnd];i<N;i++)
          freq[c*N+i] = 0;
+   while (++c<C);
 
    out_syn[0] = out_mem[0]+MAX_PERIOD-N;
    if (C==2)
@@ -1746,13 +1744,12 @@
    compute_inv_mdcts(st->mode, shortBlocks, freq, out_syn, overlap_mem, C, LM);
 
 #ifdef ENABLE_POSTFILTER
-   for (c=0;c<C;c++)
-   {
+   c=0; do {
       comb_filter(out_syn[c], out_syn[c], st->postfilter_period, st->postfilter_period, st->overlap, C,
             st->postfilter_gain, st->postfilter_gain, NULL, 0);
       comb_filter(out_syn[c]+st->overlap, out_syn[c]+st->overlap, st->postfilter_period, postfilter_pitch, N-st->overlap, C,
             st->postfilter_gain, postfilter_gain, st->mode->window, st->mode->overlap);
-   }
+   } while (++c<C);
    st->postfilter_period = postfilter_pitch;
    st->postfilter_gain = postfilter_gain;
 #endif /* ENABLE_POSTFILTER */
diff --git a/libcelt/quant_bands.c b/libcelt/quant_bands.c
index b493ab9..e3fbb61 100644
--- a/libcelt/quant_bands.c
+++ b/libcelt/quant_bands.c
@@ -74,14 +74,13 @@
 {
    int c, i;
    celt_word32 dist = 0;
-   for (c=0;c<C;c++)
-   {
+   c=0; do {
       for (i=start;i<end;i++)
       {
          celt_word16 d = SHR16(SUB16(eBands[i+c*len], oldEBands[i+c*len]),2);
          dist = MAC16_16(dist, d,d);
       }
-   }
+   } while (++c<C);
    return SHR32(dist,2*DB_SHIFT-4) > 2*C*(end-start);
 }