g++ optimization issue / useless instructions for stack access
Alec Teal
a.teal@warwick.ac.uk
Tue Jun 3 09:46:00 GMT 2014
On 27/05/14 10:40, Andrew Haley wrote:
> On 05/25/2014 01:32 PM, Niklas Gürtler wrote:
>> Hello GCC List,
>>
>> i am currently working on a hardware API in C++11 for ARM Cortex-M3
>> microcontrollers. It provides an object oriented way of accessing
>> hardware registers. The idea is that the user need not worry about
>> individual registers and their composition of bit fields but can access
>> these with symbolic names.
>> The API uses temporary objects and call chaining for syntactic sugar.
>> The problem is now that GCC produces correct, but way too slow and too
>> much code.
>>
>> See the attached simplified testcase (with a dummy linker script to
>> shorten disassembler output) and the function getInput. When compiling
>> with gcc-arm-embedded ( https://launchpad.net/gcc-arm-embedded ), this
>> is the code generated by GCC:
[snip]
>
> But really, I think you are going down the wrong path. If you want GCC
> to generate tight code, you should write tight code. Don't write lots
> of pointless stuff in the hope that GCC will notice it's pointless.
> Maybe it will, maybe not. Your API is rather complicated for what it
> does. You should be able to write it in a way that is less work.
>
> Andrew.
>
I agree with Andrew here only in part. You shouldn't worry about hitting
compiler optimisations as you write code, but you shouldn't convolute
code as a test either BTW. When you want to improve performance I urge
you to actually profile code, maybe learn how to do hypothesis tests,
you want to be able to say "it slows down here" and "after doing X it
now runs Y times better" and things like that.
It is odd that GCC misses this. One of the lower passes ought to have
spotted it right? I would have thought the RTL level stuff would have
cleared this up. Is this an old version thing? (Why is it being missed?)
I don't expect GCC to unravel convoluted code, but I would expect the
RTL passes to spot wasted (stack)space that can never ever be read. I'd
like to know more about how it was missed, because this shouldn't be a
target platform thing, this surely should be done at RTL?
Alec
More information about the Gcc-help
mailing list