(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
strcmpopt_8.c
       1  /* PR tree-optimization/92683 - strncmp incorrect result with equal substrings
       2     and nonconst bound
       3     { dg-do compile }
       4     { dg-options "-O1 -Wall -fdump-tree-forwprop1" } */
       5  
       6  #define SIZE_MAX  __SIZE_MAX__
       7  
       8  #define S123  "123"
       9  #define S1234 "1234"
      10  
      11  typedef __SIZE_TYPE__ size_t;
      12  
      13  #ifndef ident
      14  #  define ident(n) n
      15  #endif
      16  
      17  extern void failure_on_line (int);
      18  
      19  /* Verify that the test in 'if (EQL strncmp (S, T, N))' is folded.  */
      20  #define T(eql, s, t, n) do {			\
      21      max = ident (n);				\
      22      if (!(eql __builtin_strncmp (s, t, max)))	\
      23        failure_on_line (__LINE__);		\
      24    } while (0)
      25  
      26  void test_literal (void)
      27  {
      28    size_t max;
      29  
      30    T (0 ==, S123, S1234, 0);
      31    T (0 ==, S123, S1234, 1);
      32    T (0 ==, S123, S1234, 2);
      33    T (0 ==, S123, S1234, 3);
      34    T (0 >,  S123, S1234, 4);
      35    T (0 >,  S123, S1234, 5);
      36    T (0 >,  S123, S1234, SIZE_MAX - 2);
      37    T (0 >,  S123, S1234, SIZE_MAX - 1);
      38    T (0 >,  S123, S1234, SIZE_MAX);
      39  
      40    T (0 ==, S123 + 1, S1234, 0);
      41    T (0 <,  S123 + 1, S1234, 1);
      42    T (0 <,  S123 + 1, S1234, 2);
      43    T (0 <,  S123 + 1, S1234, 3);
      44    T (0 <,  S123 + 1, S1234, 4);
      45    T (0 <,  S123 + 1, S1234, SIZE_MAX - 2);
      46    T (0 <,  S123 + 1, S1234, SIZE_MAX - 1);
      47    T (0 <,  S123 + 1, S1234, SIZE_MAX);
      48  
      49    T (0 ==, S123 + 1, S1234 + 1, 0);
      50    T (0 ==, S123 + 1, S1234 + 1, 1);
      51    T (0 ==, S123 + 1, S1234 + 1, 2);
      52    T (0 >,  S123 + 1, S1234 + 1, 3);
      53    T (0 >,  S123 + 1, S1234 + 1, SIZE_MAX - 1);
      54    T (0 >,  S123 + 1, S1234 + 1, SIZE_MAX);
      55  
      56    T (0 ==, S123 + 3, S1234 + 1, 0);
      57    T (0 >,  S123 + 3, S1234 + 1, 1);
      58    T (0 >,  S123 + 3, S1234 + 1, 2);
      59    T (0 >,  S123 + 3, S1234 + 1, 3);
      60    T (0 >,  S123 + 3, S1234 + 1, SIZE_MAX - 1);
      61    T (0 >,  S123 + 3, S1234 + 1, SIZE_MAX);
      62  
      63    int zero = 0;
      64  
      65    T (zero ==, S123, S1234, 0);
      66    T (zero ==, S123, S1234, 1);
      67    T (zero ==, S123, S1234, 2);
      68    T (zero ==, S123, S1234, 3);
      69    T (zero >,  S123, S1234, 4);
      70    T (zero >,  S123, S1234, 5);
      71    T (zero >,  S123, S1234, SIZE_MAX - 2);
      72    T (zero >,  S123, S1234, SIZE_MAX - 1);
      73    T (zero >,  S123, S1234, SIZE_MAX);
      74  
      75    T (zero ==, S123 + 1, S1234, 0);
      76    T (zero <,  S123 + 1, S1234, 1);
      77    T (zero <,  S123 + 1, S1234, 2);
      78    T (zero <,  S123 + 1, S1234, 3);
      79    T (zero <,  S123 + 1, S1234, 4);
      80    T (zero <,  S123 + 1, S1234, SIZE_MAX - 2);
      81    T (zero <,  S123 + 1, S1234, SIZE_MAX - 1);
      82    T (zero <,  S123 + 1, S1234, SIZE_MAX);
      83  
      84    T (zero ==, S123 + 1, S1234 + 1, 0);
      85    T (zero ==, S123 + 1, S1234 + 1, 1);
      86    T (zero ==, S123 + 1, S1234 + 1, 2);
      87    T (zero >,  S123 + 1, S1234 + 1, 3);
      88    T (zero >,  S123 + 1, S1234 + 1, SIZE_MAX - 1);
      89    T (zero >,  S123 + 1, S1234 + 1, SIZE_MAX);
      90  
      91    T (zero ==, S123 + 3, S1234 + 1, 0);
      92    T (zero >,  S123 + 3, S1234 + 1, 1);
      93    T (zero >,  S123 + 3, S1234 + 1, 2);
      94    T (zero >,  S123 + 3, S1234 + 1, 3);
      95    T (zero >,  S123 + 3, S1234 + 1, SIZE_MAX - 1);
      96    T (zero >,  S123 + 3, S1234 + 1, SIZE_MAX);
      97  }
      98  
      99  const char s123[] = S123;
     100  const char s1234[] = S1234;
     101  
     102  void test_cst_array (void)
     103  {
     104    size_t max;
     105  
     106    T (0 ==, s123, s1234, 0);
     107    T (0 ==, s123, s1234, 1);
     108    T (0 ==, s123, s1234, 2);
     109    T (0 ==, s123, s1234, 3);
     110    T (0 >,  s123, s1234, 4);
     111    T (0 >,  s123, s1234, 5);
     112    T (0 >,  s123, s1234, SIZE_MAX - 2);
     113    T (0 >,  s123, s1234, SIZE_MAX - 1);
     114    T (0 >,  s123, s1234, SIZE_MAX);
     115  
     116    T (0 ==, s123 + 1, s1234, 0);
     117    T (0 <,  s123 + 1, s1234, 1);
     118    T (0 <,  s123 + 1, s1234, 2);
     119    T (0 <,  s123 + 1, s1234, 3);
     120    T (0 <,  s123 + 1, s1234, 4);
     121    T (0 <,  s123 + 1, s1234, SIZE_MAX - 2);
     122    T (0 <,  s123 + 1, s1234, SIZE_MAX - 1);
     123    T (0 <,  s123 + 1, s1234, SIZE_MAX);
     124  
     125    T (0 ==, s123 + 1, s1234 + 1, 0);
     126    T (0 ==, s123 + 1, s1234 + 1, 1);
     127    T (0 ==, s123 + 1, s1234 + 1, 2);
     128    T (0 >,  s123 + 1, s1234 + 1, 3);
     129    T (0 >,  s123 + 1, s1234 + 1, SIZE_MAX - 1);
     130    T (0 >,  s123 + 1, s1234 + 1, SIZE_MAX);
     131  
     132    T (0 ==, s123 + 3, s1234 + 1, 0);
     133    T (0 >,  s123 + 3, s1234 + 1, 1);
     134    T (0 >,  s123 + 3, s1234 + 1, 2);
     135    T (0 >,  s123 + 3, s1234 + 1, 3);
     136    T (0 >,  s123 + 3, s1234 + 1, SIZE_MAX - 1);
     137    T (0 >,  s123 + 3, s1234 + 1, SIZE_MAX);
     138  
     139    int zero = 0;
     140  
     141    T (zero ==, s123, s1234, 0);
     142    T (zero ==, s123, s1234, 1);
     143    T (zero ==, s123, s1234, 2);
     144    T (zero ==, s123, s1234, 3);
     145    T (zero >,  s123, s1234, 4);
     146    T (zero >,  s123, s1234, 5);
     147    T (zero >,  s123, s1234, SIZE_MAX - 2);
     148    T (zero >,  s123, s1234, SIZE_MAX - 1);
     149    T (zero >,  s123, s1234, SIZE_MAX);
     150  
     151    T (zero ==, s123 + 1, s1234, 0);
     152    T (zero <,  s123 + 1, s1234, 1);
     153    T (zero <,  s123 + 1, s1234, 2);
     154    T (zero <,  s123 + 1, s1234, 3);
     155    T (zero <,  s123 + 1, s1234, 4);
     156    T (zero <,  s123 + 1, s1234, SIZE_MAX - 2);
     157    T (zero <,  s123 + 1, s1234, SIZE_MAX - 1);
     158    T (zero <,  s123 + 1, s1234, SIZE_MAX);
     159  
     160    T (zero ==, s123 + 1, s1234 + 1, 0);
     161    T (zero ==, s123 + 1, s1234 + 1, 1);
     162    T (zero ==, s123 + 1, s1234 + 1, 2);
     163    T (zero >,  s123 + 1, s1234 + 1, 3);
     164    T (zero >,  s123 + 1, s1234 + 1, SIZE_MAX - 1);
     165    T (zero >,  s123 + 1, s1234 + 1, SIZE_MAX);
     166  
     167    T (zero ==, s123 + 3, s1234 + 1, 0);
     168    T (zero >,  s123 + 3, s1234 + 1, 1);
     169    T (zero >,  s123 + 3, s1234 + 1, 2);
     170    T (zero >,  s123 + 3, s1234 + 1, 3);
     171    T (zero >,  s123 + 3, s1234 + 1, SIZE_MAX - 1);
     172    T (zero >,  s123 + 3, s1234 + 1, SIZE_MAX);
     173  }
     174  
     175  /* { dg-final { scan-tree-dump-not "strcmp" "forwprop1" } }
     176     { dg-final { scan-tree-dump-not "strncmp" "forwprop1" } }
     177     { dg-final { scan-tree-dump-not "failure_on_line_" "forwprop1" } } */