G++ could optimize ASM code more

Marc Glisse marc.glisse@inria.fr
Wed May 9 22:16:00 GMT 2012


On Wed, 9 May 2012, Daniel Marschall wrote:

> I could sucessfully do a benchmark of my code. I found out that the 
> no-typecast-version (imull+movslq) needed 47 secs for 12 working packages, 
> while the typecast-version (imulq) needed only 38 secs per 12 working 
> packages. That is incredible!
>
> Maybe you should still consider preferring imulq instead of imull+movslq ?
>
> I wonder if GCC has an optimization which optimizes the machine code itself, 
> without knowledge of the underlaying C code, e.g. it could eliminate 
> unnecessary mov commands if a register is not used resp. using operations 
> which do have lower latency. I think such an "assembler-only" optimization 
> still can get additional performance since the rules of the underlaying 
> programming language (e.g. the expansion to signed int) can be ignored if the 
> end-result is the same. But I fear that this is rather a hard task and maybe 
> not possible.

A lot of optimizations in gcc completely ignore the original code. At the 
rtl level, you could try matching:

(set (reg:SI 1) (zero_extend:SI (match_operand:QI 4))
(set (reg:SI 2) (zero_extend:SI (match_operand:QI 3))
(set (reg:SI 5) (mult:SI (match_dup 1) (match_dup 2)))
(set (reg:DI 6) (sign_extend:DI (match_dup 5)))

and replacing it with your version that zero-extends to DI and does the 
multiplication there.

-- 
Marc Glisse



More information about the Gcc mailing list