[FFmpeg-devel] FATE & Regressions (and PPC is broken)

Vitor Sessak vitor1001
Sun Mar 16 13:03:50 CET 2008


Hi

Michael Niedermayer wrote:
> On Sun, Mar 16, 2008 at 10:25:50AM +0100, Vitor Sessak wrote:
>> Michael Niedermayer wrote:
>>> On Sun, Mar 16, 2008 at 12:25:41AM +0100, Vitor Sessak wrote:
>>>> Hi
>>>>
>>>> Mike Melanson wrote:
>>>>
>>>> [...]
>>>>
>>>>> x86_32/icc:
>>>>> This is weird; if I build icc and then run 'make test', it crashes here
>>>>> (tried twice with a 'make clean' in between):
>>>>> "/home/melanson/ffmpeg/build-icc"/tests/audiogen tests/asynth1.sw
>>>>> Segmentation fault (core dumped)
>>>>> make: *** [tests/asynth1.sw] Error 139
>>>> This can be fixed with the following patch, but I don't know if it is the 
>>>> right fix.
>>> Could you shed some light on the question where it crashes and why the
>>> patch fixes it?
>>>
>> In the code
>>
>>> static int int_cos(int a)
>>> {
>>>     int neg, v, f;
>>>     const unsigned short *p;
>>>
>>>     a = a & (FRAC_ONE - 1); /* modulo 2 * pi */
>>>     if (a >= (FRAC_ONE / 2))
>>>         a = FRAC_ONE - a;
>>>     neg = 0;
>>>     if (a > (FRAC_ONE / 4)) {
>>>         neg = -1;
>>>         a = (FRAC_ONE / 2) - a;
>>>     }
>>>
>>>     p = cos_table + (a >> CSHIFT);
>> When a is negative, (a >> CSHIFT) can be negative (not only in icc but 
>> in gcc too). So p[0] will dereference an invalid pointer.
> 
> a cannot be negative after
> a = a & (FRAC_ONE - 1);

Well, that's the error. This line has no effect in icc with -O3.

Code:

> static int int_cos(int a)
> {
>     int neg, v, f;
>     const unsigned short *p;
> 
>     printf("0: %d\n", a);
>     a = a & (FRAC_ONE - 1); /* modulo 2 * pi */
>     printf("1: %d\n", a);
>     if (a >= (FRAC_ONE / 2))
>         a = FRAC_ONE - a;
>     printf("2: %d\n", a);
>     neg = 0;
>     if (a > (FRAC_ONE / 4)) {
>         neg = -1;
>         a = (FRAC_ONE / 2) - a;
>     }
>     printf("3: %d\n", a);
> 
>     if ((a >> CSHIFT) < 0)
>         printf("4: error\n\n");
>     else
>         printf("4: ok\n\n");
>     p = cos_table + (a >> CSHIFT);
>     /* linear interpolation */
>     f = a & ((1 << CSHIFT) - 1);
>     v = p[0] + (((p[1] - p[0]) * f + (1 << (CSHIFT - 1))) >> CSHIFT);
>     v = (v ^ neg) - neg;
>     v = v << (FRAC_BITS - 15);
>     return v;
> }

icc -O3 output  |  gcc output

0: 66127           0: 66127
1: 66127           1: 591
2: -591            2: 591
3: -591            3: 591
4: error           4: ok

Note that (FRAC_ONE - 1) == 65535. Is there any non ugly way to work 
around this icc bug?

-Vitor





More information about the ffmpeg-devel mailing list