Ciao,

Il 2020-09-21 18:16 t...@gmplib.org ha scritto:
overflow.  The overflow detection flags some false positives, which is
by design.

But maybe we could avoid the false positive at least for the following example:

#include <stdio.h>
#include "gmp.h"

int main (void)
{
  mpz_t z;

  mpz_init (z);
  mpz_setbit (z, 0xffffffdf);
  printf ("OK\n");
  mpz_sub_ui (z, z, 123);
  printf ("OK\n");

  return 0;
}

We can avoid it simply moving the REALLOC after the branch.
This may save some allocations in many cases.

The proposed patch follows:

diff -r b851f9336a86 mpz/aors_ui.h
--- a/mpz/aors_ui.h     Thu Sep 17 12:00:00 2020 +0200
+++ b/mpz/aors_ui.h     Mon Sep 21 18:36:33 2020 +0200
@@ -86,21 +86,26 @@

   abs_usize = ABS (usize);

-  /* If not space for W (and possible carry), increase space.  */
-  wp = MPZ_REALLOC (w, abs_usize + 1);
-
-  /* These must be after realloc (U may be the same as W).  */
-  up = PTR (u);
-
   if (usize VARIATION_CMP 0)
     {
       mp_limb_t cy;
+
+      /* If not space for W (and possible carry), increase space.  */
+      wp = MPZ_REALLOC (w, abs_usize + 1);
+      /* These must be after realloc (U may be the same as W).  */
+      up = PTR (u);
+
       cy = mpn_add_1 (wp, up, abs_usize, (mp_limb_t) vval);
       wp[abs_usize] = cy;
       wsize = VARIATION_NEG (abs_usize + cy);
     }
   else
     {
+      /* If not space for W, increase space.  */
+      wp = MPZ_REALLOC (w, abs_usize);
+      /* These must be after realloc (U may be the same as W).  */
+      up = PTR (u);
+
       /* The signs are different.  Need exact comparison to determine
         which operand to subtract from which.  */
       if (abs_usize == 1 && up[0] < vval)




Ĝis,
m

--
http://bodrato.it/papers/
_______________________________________________
gmp-bugs mailing list
gmp-bugs@gmplib.org
https://gmplib.org/mailman/listinfo/gmp-bugs

Reply via email to