gmpxx and allocation
Marc Glisse
marc.glisse at inria.fr
Tue Mar 6 09:07:52 CET 2012
On Tue, 6 Mar 2012, bodrato at mail.dm.unipi.it wrote:
> Il Mar, 6 Marzo 2012 1:07 am, Marc Glisse ha scritto:
>> int main(){
>> mpz_class a=1;
>> for(int i=0;i<5000000;i++){
>> mpz_class b=2;
>> a=a+b-a*b;
>> }
>> return a.get_si()-1;
>> }
>
> ... If you substitute mpz_class with int, and compile it with gcc -O2, the
> assembler code generated for the function main is:
> xorl %eax, %eax
> ret
>
> I do not know C++ very well... but it would be very nice if we could
> suggest to the compiler how optimise operation when the "value" of classes
> could be argued at compile time.
Indeed. But that may be hard to do without compiler support (and my
compiler skills are not sufficient to write a gcc plugin for that).
> Is it possible to write something like
> if (__GMPXX_CONSTANT (SIZ (b)) && SIZ (b)==1) ... ?
> I don't know if this may have some chance to be optimised...
You can certainly write it, but since all those values are set in opaque
gmp functions, __builtin_constant_p will return false. I tried things like
that some time ago, and if I remember correctly gcc sometimes managed to
notice at compile time that a variable was 0 (I don't think it managed
to notice a variable was 1, but I am not sure).
With the small number optimization, if the fast path is inline and doesn't
use any asm (or has a __builtin_constant_p branch without asm), the
compiler should have a chance at simplifying at compile-time.
> My comment goes in a completely orthogonal direction, but I hope it is not
> meaningless :-)
Tangential, orthogonal, any angle is fine with me ;-)
--
Marc Glisse
More information about the gmp-discuss
mailing list