[FFmpeg-devel] [PATCH] strict-aliasing-safe aes.c
Måns Rullgård
mans
Tue Jun 29 13:28:50 CEST 2010
Michael Niedermayer <michaelni at gmx.at> writes:
> On Tue, Jun 29, 2010 at 02:02:41AM +0100, M?ns Rullg?rd wrote:
>> Michael Niedermayer <michaelni at gmx.at> writes:
>>
>> > On Mon, Jun 28, 2010 at 10:13:31PM +0200, Reimar D?ffinger wrote:
>> >> On Mon, Jun 28, 2010 at 10:02:15PM +0200, Michael Niedermayer wrote:
>> >> > On Mon, Jun 28, 2010 at 05:55:30PM +0200, Reimar D?ffinger wrote:
>> >> > > Hello,
>> >> > > this uses AV_WN32A, AV_WN64A etc. macros.
>> >> > > The generated code is the same on x86_64 (assuming I did not mess up that test).
>> >> >
>> >> > > aes.c | 20 +++++++++++++-------
>> >> > > 1 file changed, 13 insertions(+), 7 deletions(-)
>> >> > > 76705b63949d4abbe51b0d7d59537045ae91179a aesalias.diff
>> >> >
>> >> > this makes the code unreadable, iam thus against it.
>> >>
>> >> Well, what is the alternative? The current code seems to not work with some compilers.
>> >
>> > Fix the compiler.
>>
>> There is nothing wrong with the compiler. It implements the C99
>> language exactly as specified.
>
> The C99 standard isnt everything, a mpeg2 encoder also could return
> nothing but a black picture independant of the input, yet it wouldnt be a
> reasonable mpeg encoder or a usefull one.
It would still have to output a bitstream compatible with the
specification.
> I know you are the one who prefered the mpeg demuxer to comply to the spec
> even at the cost of not demuxing actual existing files.
I fail to see the relevance.
>> > This language lawyering and pedantic gnu style compliance crussade is
>>
>> This has nothing to do with GNU and everything to do with the C99 standard.
>
> yes, that comment was about something else
Then why bring it up here?
>> > really annoying. Anything that gnu considers to be worth warning
>> > about makes people run and change their code, and often to the
>> > worse.
>>
>> In this particular case the code is in violation of the spec. That
>> the compiler only recently got the ability to detect this does not
>> make it less of a violation.
>
> again the comment is not about aliassing violations but warnings in general
But here we have some very real errors that gcc has been warning about
for YEARS.
>> > what i think should be done is: people should post a feature
>> > request on the <put affected compiler here> bug tracker about it
>> > acting a bit more reasonable and handle such trivial aliassing
>> > cases. And everyone who considers this important should reply
>> > there and express his oppinon.
>>
>> THERE IS NO BUG IN THE COMPILER!
>
> please send your strawman back as well, i never said theres a bug.
> I said the compiler behaves unreasonable and i clearly was talking about
> a feature request.
The compiler behaves according the C spec. What is unreasonable about
that?
> we arent talking about the same thing it seems.
How about we start doing that then? I'm talking about the patch for
aes.c Reimar sent.
> I guess we agree that the compiler should generate fast code.
Yes, but it _also_ must be correct code. The generated code must be
correct for any possible intent of the programmer. This means some
pointers must be assumed to alias.
> I guess we agree that fast code needs types sometimes accessed
> through different types.
Yes.
> I guess we agree that there must be some way for the programmer to
> specify how pointers can alias and some default rules about aliasing
> in absence.
Yes, and the defaults must be chosen to allow a decent level of
performance without detailed
> What iam saying is that a compiler should detect
> *(uint32_t*)p
> and accept it as correct code
This _is_ correct code provided whatever "p" points to is always
accessed as uint32_t. If it is ever accessed as another type, this is
a strict aliasing violation.
> like it per spec has to accept ((magic_union_type*)p)->u32
The union trick exists so type punning can be done in a safe way
without sacrificing the optimisations possible with strict aliasing
rules.
> I also think that the aliassing model used by gcc is severly lacking.
> It for example lacks the possibility of the programmer specifying how
> 2 pointers can alias exactly. The issue just came up with the dct
> optimization and forced us to adapt our design of it.
> I dont like having to design our code around shortcommings of the compiler
You are not adequately distinguishing between the language spec and
the compiler.
>> > I dont mind us working around it here if theres some effort
>> > toward fixing this where the problem is (aka compilers and the C
>> > spec) even if that effort is small and unlikely to be successfull
>> > but if everything thats done is directed toward turning every
>> > file into a unmaintaunable mess with not one second spend on
>> > solving the actual problem then i dont think i will approve such
>> > workarounds. Id like to have at least some hope even if small
>> > that this red tape around every bit of optimized code one day
>> > would become unneeded
>>
>> The main author of libswscale is in no position to speak about an
>> unmaintainable mess.
>
> I have less problem maintaining it
Then why don't you fix it?
> besides instead of continuing to reply to your language lawyering trolling
> ill refer you to linus torvalds:
> http://kerneltrap.org/mailarchive/linux-kernel/2007/10/26/359162
> http://lkml.org/lkml/2003/2/26/158
> Ive seen better quotes from him about it but i cant find them atm
This is the opposite of our situation. Linus dislikes optimisations
that are allowed by the spec but cause trouble for real-world code.
Not performing these optimisations would never break anything.
Your sloppy aliasing would break perfectly valid code, and that is not
acceptable.
--
M?ns Rullg?rd
mans at mansr.com
More information about the ffmpeg-devel
mailing list