analyzer: testsuite fixes for alloca, getpass, and setjmp (PR 93316)
[gcc.git] / libgfortran / m4 / minloc0.m4
index 45b6e90880a648d2568738a3e36553a4ac4acd53..acbd28026f524e572549abaa6b366c762b0bd1a7 100644 (file)
@@ -1,5 +1,5 @@
 `/* Implementation of the MINLOC intrinsic
-   Copyright 2002, 2007, 2009 Free Software Foundation, Inc.
+   Copyright (C) 2002-2020 Free Software Foundation, Inc.
    Contributed by Paul Brook <paul@nowt.org>
 
 This file is part of the GNU Fortran 95 runtime library (libgfortran).
@@ -24,9 +24,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 <http://www.gnu.org/licenses/>.  */
 
 #include "libgfortran.h"
-#include <stdlib.h>
-#include <assert.h>
-#include <limits.h>'
+#include <assert.h>'
 
 include(iparm.m4)dnl
 include(iforeach.m4)dnl
@@ -34,28 +32,115 @@ include(iforeach.m4)dnl
 `#if defined (HAVE_'atype_name`) && defined (HAVE_'rtype_name`)'
 
 FOREACH_FUNCTION(
-`  atype_name minval;
-
-  minval = atype_max;'
-,
-`  if (*base < minval || !dest[0])
-    {
-      minval = *base;
-      for (n = 0; n < rank; n++)
-        dest[n * dstride] = count[n] + 1;
-    }')
+`    atype_name minval;
+#if defined('atype_nan`)
+    int fast = 0;
+#endif
 
+#if defined('atype_inf`)
+    minval = atype_inf;
+#else
+    minval = atype_max;
+#endif',
+`#if defined('atype_nan`)
+      if (unlikely (!fast))
+       {
+         do
+           {
+             if (*base <= minval)
+               {
+                 fast = 1;
+                 minval = *base;
+                 for (n = 0; n < rank; n++)
+                   dest[n * dstride] = count[n] + 1;
+                 break;
+               }
+             base += sstride[0];
+           }
+         while (++count[0] != extent[0]);
+         if (likely (fast))
+           continue;
+       }
+      else
+#endif
+      if (back)
+       do
+         {
+           if (unlikely (*base <= minval))
+             {
+               minval = *base;
+               for (n = 0; n < rank; n++)
+                 dest[n * dstride] = count[n] + 1;
+             }
+           base += sstride[0];
+         }
+       while (++count[0] != extent[0]);
+      else
+       do
+         {
+           if (unlikely (*base < minval))
+             {
+               minval = *base;
+               for (n = 0; n < rank; n++)
+                 dest[n * dstride] = count[n] + 1;
+             }')
 MASKED_FOREACH_FUNCTION(
 `  atype_name minval;
+   int fast = 0;
 
-  minval = atype_max;'
-,
-`  if (*mbase && (*base < minval || !dest[0]))
-    {
-      minval = *base;
-      for (n = 0; n < rank; n++)
-        dest[n * dstride] = count[n] + 1;
-    }')
-
+#if defined('atype_inf`)
+    minval = atype_inf;
+#else
+    minval = atype_max;
+#endif',
+`      if (unlikely (!fast))
+       {
+         do
+           {
+             if (*mbase)
+               {
+#if defined('atype_nan`)
+                 if (unlikely (dest[0] == 0))
+                   for (n = 0; n < rank; n++)
+                     dest[n * dstride] = count[n] + 1;
+                 if (*base <= minval)
+#endif
+                   {
+                     fast = 1;
+                     minval = *base;
+                     for (n = 0; n < rank; n++)
+                       dest[n * dstride] = count[n] + 1;
+                     break;
+                   }
+               }
+             base += sstride[0];
+             mbase += mstride[0];
+           }
+         while (++count[0] != extent[0]);
+         if (likely (fast))
+           continue;
+       }
+        else
+        if (back)
+         do
+           {
+             if (unlikely (*mbase && (*base <= minval)))
+               {
+                 minval = *base;
+                 for (n = 0; n < rank; n++)
+                   dest[n * dstride] = count[n] + 1;
+               }
+               base += sstride[0];
+           }
+           while (++count[0] != extent[0]);
+       else
+         do
+           {
+             if (unlikely (*mbase && (*base < minval)))
+               {
+                 minval = *base;
+                 for (n = 0; n < rank; n++)
+                   dest[n * dstride] = count[n] + 1;
+               }')
 SCALAR_FOREACH_FUNCTION(`0')
 #endif