(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
strlenopt-52.c
       1  /* PR tree-optimization/77357 - strlen of constant strings not folded
       2     { dg-do compile }
       3     { dg-options "-O2 -Wall -fdump-tree-gimple -fdump-tree-ccp" } */
       4  
       5  #include "strlenopt.h"
       6  
       7  #define CONCAT(x, y) x ## y
       8  #define CAT(x, y) CONCAT (x, y)
       9  #define FAILNAME(name) CAT (call_ ## name ##_on_line_, __LINE__)
      10  
      11  #define FAIL(name) do {				\
      12      extern void FAILNAME (name) (void);		\
      13      FAILNAME (name)();				\
      14    } while (0)
      15  
      16  /* Macro to emit a call to funcation named
      17       call_in_true_branch_not_eliminated_on_line_NNN()
      18     for each call that's expected to be eliminated.  The dg-final
      19     scan-tree-dump-time directive at the bottom of the test verifies
      20     that no such call appears in output.  */
      21  #define ELIM(expr) \
      22    if (!(expr)) FAIL (in_true_branch_not_eliminated); else (void)0
      23  
      24  #define T(s, n) ELIM (strlen (s) == n)
      25  
      26  
      27  struct S
      28  {
      29    char a1[1], a2[2], a3[3], a4[4], a5[5], a6[6], a7[7], a8[8], a9[9];
      30  };
      31  
      32  #define S0 ""
      33  #define S1 "1"
      34  #define S2 "12"
      35  #define S3 "123"
      36  #define S4 "1234"
      37  #define S5 "12345"
      38  #define S6 "123456"
      39  #define S7 "1234567"
      40  #define S8 "12345678"
      41  
      42  const char a9[][9] = { S0, S1, S2, S3, S4, S5, S6, S7, S8 };
      43  
      44  const char a_1_9[1][9] = { S8 };
      45  const char a_2_9[2][9] = { S8, S7};
      46  
      47  const char a9_9[][9][9] = {
      48    { S0, S0, S0, S0, S0, S0, S0, S0, S0 },
      49    { S0, S1, S1, S1, S1, S1, S1, S1, S1 },
      50    { S0, S1, S2, S2, S2, S2, S2, S2, S2 },
      51    { S0, S1, S2, S3, S3, S3, S3, S3, S3 },
      52    { S0, S1, S2, S3, S4, S4, S4, S4, S4 },
      53    { S0, S1, S2, S3, S4, S5, S5, S5, S5 },
      54    { S0, S1, S2, S3, S4, S5, S6, S6, S6 },
      55    { S0, S1, S2, S3, S4, S5, S6, S7, S7 },
      56    { S0, S1, S2, S3, S4, S5, S6, S7, S8 }
      57  };
      58  
      59  const struct S s = { S0, S1, S2, S3, S4, S5, S6, S7, S8 };
      60  
      61  const struct S sa[9] = {
      62    { S0, S0, S0, S0, S0, S0, S0, S0, S0 },
      63    { S0, S1, S1, S1, S1, S1, S1, S1, S1 },
      64    { S0, S1, S2, S2, S2, S2, S2, S2, S2 },
      65    { S0, S1, S2, S3, S3, S3, S3, S3, S3 },
      66    { S0, S1, S2, S3, S4, S4, S4, S4, S4 },
      67    { S0, S1, S2, S3, S4, S5, S5, S5, S5 },
      68    { S0, S1, S2, S3, S4, S5, S6, S6, S6 },
      69    { S0, S1, S2, S3, S4, S5, S6, S7, S7 },
      70    { S0, S1, S2, S3, S4, S5, S6, S7, S8 }
      71  };
      72  
      73  const struct S sa3_5_7[3][5][7] = {
      74    [1][2][3].a2 = S1, [1][3][5].a3 = S2, [2][4][5].a4 = S3
      75  };
      76  
      77  
      78  void test_global_array (void)
      79  {
      80    T (a9[0], 0);  T (a9[0] + 0, 0);  T (a9[0] + 0, 0);  T (a9[0] + 0, 0);
      81    T (a9[1], 1);  T (a9[1] + 1, 0);  T (a9[1] + 1, 0);  T (a9[1] + 1, 0);
      82    T (a9[2], 2);
      83    T (a9[2] + 1, 1);
      84    T (a9[2] + 2, 0);
      85    T (a9[2] + 2, 0);
      86  
      87    T (a9[3], 3);  T (a9[3] + 1, 2);  T (a9[3] + 2, 1);  T (a9[3] + 3, 0);
      88    T (a9[4], 4);  T (a9[4] + 1, 3);  T (a9[4] + 2, 2);  T (a9[4] + 3, 1);
      89    T (a9[5], 5);  T (a9[5] + 1, 4);  T (a9[5] + 2, 3);  T (a9[5] + 3, 2);
      90    T (a9[6], 6);  T (a9[6] + 1, 5);  T (a9[6] + 2, 4);  T (a9[6] + 3, 3);
      91    T (a9[7], 7);  T (a9[7] + 1, 6);  T (a9[7] + 2, 5);  T (a9[7] + 3, 4);
      92    T (a9[8], 8);  T (a9[8] + 1, 7);  T (a9[8] + 2, 6);  T (a9[8] + 3, 5);
      93  
      94    T (a_1_9[0], 8);
      95    T (a_1_9[0] + 1, 7);
      96    T (a_1_9[0] + 7, 1);
      97    T (a_1_9[0] + 8, 0);
      98  
      99    T (a_2_9[0], 8);
     100    T (a_2_9[0] + 1, 7);
     101    T (a_2_9[0] + 7, 1);
     102    T (a_2_9[0] + 8, 0);
     103  
     104    T (a_2_9[1], 7);
     105    T (a_2_9[1] + 1, 6);
     106    T (a_2_9[1] + 6, 1);
     107    T (a_2_9[1] + 7, 0);
     108    T (a_2_9[1] + 8, 0);
     109  }
     110  
     111  void test_global_array_array (void)
     112  {
     113    T (a9_9[0][0], 0);  T (a9_9[1][0], 0);  T (a9_9[2][0], 0);
     114    T (a9_9[0][1], 0);  T (a9_9[1][1], 1);  T (a9_9[2][1], 1);
     115    T (a9_9[0][2], 0);  T (a9_9[1][2], 1);  T (a9_9[2][2], 2);
     116    T (a9_9[0][3], 0);  T (a9_9[1][3], 1);  T (a9_9[2][3], 2);
     117    T (a9_9[0][4], 0);  T (a9_9[1][4], 1);  T (a9_9[2][4], 2);
     118    T (a9_9[0][5], 0);  T (a9_9[1][5], 1);  T (a9_9[2][5], 2);
     119    T (a9_9[0][6], 0);  T (a9_9[1][6], 1);  T (a9_9[2][6], 2);
     120    T (a9_9[0][7], 0);  T (a9_9[1][7], 1);  T (a9_9[2][7], 2);
     121    T (a9_9[0][8], 0);  T (a9_9[1][8], 1);  T (a9_9[2][8], 2);
     122  
     123    T (a9_9[3][0], 0);  T (a9_9[4][0], 0);  T (a9_9[5][0], 0);
     124    T (a9_9[3][1], 1);  T (a9_9[4][1], 1);  T (a9_9[5][1], 1);
     125    T (a9_9[3][2], 2);  T (a9_9[4][2], 2);  T (a9_9[5][2], 2);
     126    T (a9_9[3][3], 3);  T (a9_9[4][3], 3);  T (a9_9[5][3], 3);
     127    T (a9_9[3][4], 3);  T (a9_9[4][4], 4);  T (a9_9[5][4], 4);
     128    T (a9_9[3][5], 3);  T (a9_9[4][5], 4);  T (a9_9[5][5], 5);
     129    T (a9_9[3][6], 3);  T (a9_9[4][6], 4);  T (a9_9[5][6], 5);
     130    T (a9_9[3][7], 3);  T (a9_9[4][7], 4);  T (a9_9[5][7], 5);
     131    T (a9_9[3][8], 3);  T (a9_9[4][8], 4);  T (a9_9[5][8], 5);
     132  
     133    T (a9_9[6][0], 0);  T (a9_9[7][0], 0);  T (a9_9[8][0], 0);
     134    T (a9_9[6][1], 1);  T (a9_9[7][1], 1);  T (a9_9[8][1], 1);
     135    T (a9_9[6][2], 2);  T (a9_9[7][2], 2);  T (a9_9[8][2], 2);
     136    T (a9_9[6][3], 3);  T (a9_9[7][3], 3);  T (a9_9[8][3], 3);
     137    T (a9_9[6][4], 4);  T (a9_9[7][4], 4);  T (a9_9[8][4], 4);
     138    T (a9_9[6][5], 5);  T (a9_9[7][5], 5);  T (a9_9[8][5], 5);
     139    T (a9_9[6][6], 6);  T (a9_9[7][6], 6);  T (a9_9[8][6], 6);
     140    T (a9_9[6][7], 6);  T (a9_9[7][7], 7);  T (a9_9[8][7], 7);
     141    T (a9_9[6][8], 6);  T (a9_9[7][8], 7);  T (a9_9[8][8], 8);
     142  
     143  
     144    T (a9_9[0][0] + 1, 0);  T (a9_9[1][0] + 1, 0);  T (a9_9[2][0] + 2, 0);
     145    T (a9_9[0][1] + 2, 0);  T (a9_9[1][1] + 1, 0);  T (a9_9[2][1] + 2, 0);
     146    T (a9_9[0][2] + 3, 0);  T (a9_9[1][2] + 1, 0);  T (a9_9[2][2] + 2, 0);
     147    T (a9_9[0][3] + 4, 0);  T (a9_9[1][3] + 1, 0);  T (a9_9[2][3] + 2, 0);
     148    T (a9_9[0][4] + 5, 0);  T (a9_9[1][4] + 1, 0);  T (a9_9[2][4] + 2, 0);
     149    T (a9_9[0][5] + 6, 0);  T (a9_9[1][5] + 1, 0);  T (a9_9[2][5] + 2, 0);
     150    T (a9_9[0][6] + 7, 0);  T (a9_9[1][6] + 1, 0);  T (a9_9[2][6] + 2, 0);
     151    T (a9_9[0][7] + 8, 0);  T (a9_9[1][7] + 1, 0);  T (a9_9[2][7] + 2, 0);
     152  }
     153  
     154  void test_global_struct (void)
     155  {
     156    T (s.a1, 0);
     157    T (s.a2, 1);
     158    T (s.a3, 2);
     159    T (s.a4, 3);
     160    T (s.a5, 4);
     161    T (s.a6, 5);
     162    T (s.a7, 6);
     163    T (s.a8, 7);
     164    T (s.a9, 8);
     165  }
     166  
     167  void test_global_struct_array (void)
     168  {
     169    T (sa[0].a1, 0);  T (sa[1].a1, 0);  T (sa[2].a1, 0);  T (sa[3].a1, 0);
     170    T (sa[0].a2, 0);  T (sa[1].a2, 1);  T (sa[2].a2, 1);  T (sa[3].a2, 1);
     171    T (sa[0].a3, 0);  T (sa[1].a3, 1);  T (sa[2].a3, 2);  T (sa[3].a3, 2);
     172    T (sa[0].a4, 0);  T (sa[1].a4, 1);  T (sa[2].a4, 2);  T (sa[3].a4, 3);
     173    T (sa[0].a5, 0);  T (sa[1].a5, 1);  T (sa[2].a5, 2);  T (sa[3].a5, 3);
     174    T (sa[0].a6, 0);  T (sa[1].a6, 1);  T (sa[2].a6, 2);  T (sa[3].a6, 3);
     175    T (sa[0].a7, 0);  T (sa[1].a7, 1);  T (sa[2].a7, 2);  T (sa[3].a7, 3);
     176    T (sa[0].a8, 0);  T (sa[1].a8, 1);  T (sa[2].a8, 2);  T (sa[3].a8, 3);
     177    T (sa[0].a9, 0);  T (sa[1].a9, 1);  T (sa[2].a9, 2);  T (sa[3].a9, 3);
     178  
     179    T (sa[4].a1, 0);  T (sa[5].a1, 0);  T (sa[6].a1, 0);  T (sa[7].a1, 0);
     180    T (sa[4].a2, 1);  T (sa[5].a2, 1);  T (sa[6].a2, 1);  T (sa[7].a2, 1);
     181    T (sa[4].a3, 2);  T (sa[5].a3, 2);  T (sa[6].a3, 2);  T (sa[7].a3, 2);
     182    T (sa[4].a4, 3);  T (sa[5].a4, 3);  T (sa[6].a4, 3);  T (sa[7].a4, 3);
     183    T (sa[4].a5, 4);  T (sa[5].a5, 4);  T (sa[6].a5, 4);  T (sa[7].a5, 4);
     184    T (sa[4].a6, 4);  T (sa[5].a6, 5);  T (sa[6].a6, 5);  T (sa[7].a6, 5);
     185    T (sa[4].a7, 4);  T (sa[5].a7, 5);  T (sa[6].a7, 6);  T (sa[7].a7, 6);
     186    T (sa[4].a8, 4);  T (sa[5].a8, 5);  T (sa[6].a8, 6);  T (sa[7].a8, 7);
     187    T (sa[4].a9, 4);  T (sa[5].a9, 5);  T (sa[6].a9, 6);  T (sa[7].a9, 7);
     188  
     189    T (sa[8].a1, 0);
     190    T (sa[8].a2, 1);  T (sa[8].a2 + 1, 0);
     191    T (sa[8].a3, 2);  T (sa[8].a3 + 1, 1);  T (sa[8].a3 + 2, 0);
     192    T (sa[8].a4, 3);  T (sa[8].a4 + 1, 2);  T (sa[8].a4 + 2, 1);
     193    T (sa[8].a5, 4);  T (sa[8].a5 + 1, 3);  T (sa[8].a5 + 2, 2);
     194    T (sa[8].a6, 5);  T (sa[8].a6 + 1, 4);  T (sa[8].a6 + 2, 3);
     195    T (sa[8].a7, 6);  T (sa[8].a7 + 1, 5);  T (sa[8].a7 + 2, 4);
     196    T (sa[8].a8, 7);  T (sa[8].a8 + 1, 6);  T (sa[8].a8 + 2, 5);
     197    T (sa[8].a9, 8);  T (sa[8].a9 + 1, 7);  T (sa[8].a9 + 2, 6);
     198  
     199  
     200    T (sa3_5_7[1][2][3].a2, 1);
     201    T (sa3_5_7[1][3][5].a3, 2);
     202    T (sa3_5_7[2][4][5].a4, 3);
     203  
     204    T (sa3_5_7[0][0][0].a1, 0);
     205    T (sa3_5_7[0][0][0].a2, 0);
     206    T (sa3_5_7[0][0][0].a3, 0);
     207    T (sa3_5_7[0][0][0].a4, 0);
     208    T (sa3_5_7[0][0][0].a5, 0);
     209    T (sa3_5_7[0][0][0].a6, 0);
     210    T (sa3_5_7[0][0][0].a7, 0);
     211    T (sa3_5_7[0][0][0].a8, 0);
     212    T (sa3_5_7[0][0][0].a9, 0);
     213  
     214    T (sa3_5_7[0][0][1].a1, 0);
     215    T (sa3_5_7[0][0][1].a2, 0);
     216    T (sa3_5_7[0][0][1].a3, 0);
     217    T (sa3_5_7[0][0][1].a4, 0);
     218    T (sa3_5_7[0][0][1].a5, 0);
     219    T (sa3_5_7[0][0][1].a6, 0);
     220    T (sa3_5_7[0][0][1].a7, 0);
     221    T (sa3_5_7[0][0][1].a8, 0);
     222    T (sa3_5_7[0][0][1].a9, 0);
     223  
     224    T (sa3_5_7[0][1][0].a1, 0);
     225    T (sa3_5_7[0][1][0].a2, 0);
     226    T (sa3_5_7[0][1][0].a3, 0);
     227    T (sa3_5_7[0][1][0].a4, 0);
     228    T (sa3_5_7[0][1][0].a5, 0);
     229    T (sa3_5_7[0][1][0].a6, 0);
     230    T (sa3_5_7[0][1][0].a7, 0);
     231    T (sa3_5_7[0][1][0].a8, 0);
     232    T (sa3_5_7[0][1][0].a9, 0);
     233  
     234    T (sa3_5_7[1][0][0].a1, 0);
     235    T (sa3_5_7[1][0][0].a2, 0);
     236    T (sa3_5_7[1][0][0].a3, 0);
     237    T (sa3_5_7[1][0][0].a4, 0);
     238    T (sa3_5_7[1][0][0].a5, 0);
     239    T (sa3_5_7[1][0][0].a6, 0);
     240    T (sa3_5_7[1][0][0].a7, 0);
     241    T (sa3_5_7[1][0][0].a8, 0);
     242    T (sa3_5_7[1][0][0].a9, 0);
     243  }
     244  
     245  
     246  struct SS {
     247    char a9[9][9];
     248    struct S sa9[9];
     249  };
     250  
     251  const struct SS ssa[] = {
     252    [1] = {
     253      .a9 = { [3] = S3, [7] = S7 },
     254      .sa9 = { [5] = { .a5 = S4, .a7 = S6 } }
     255    },
     256    [5] = {
     257      .a9 = { [1] = S8, [5] = S4 },
     258      .sa9 = { [3] = { .a3 = S2, .a6 = S3 } }
     259    }
     260  };
     261  
     262  void test_global_struct_struct_array (void)
     263  {
     264    T (ssa[0].a9[0], 0);
     265    T (ssa[0].a9[3], 0);
     266    T (ssa[0].sa9[5].a5, 0);
     267    T (ssa[0].sa9[5].a7, 0);
     268  
     269    T (ssa[1].a9[0], 0);
     270  
     271    T (ssa[1].a9[3], 3);
     272    T (ssa[1].a9[7], 7);
     273    T (ssa[1].sa9[5].a5, 4);
     274    T (ssa[1].sa9[5].a7, 6);
     275  
     276    T (ssa[2].a9[3], 0);
     277    T (ssa[2].a9[7], 0);
     278    T (ssa[2].sa9[5].a5, 0);
     279    T (ssa[2].sa9[5].a7, 0);
     280  
     281    T (ssa[5].a9[1], 8);
     282    T (ssa[5].a9[5], 4);
     283    T (ssa[5].sa9[3].a3, 2);
     284    T (ssa[5].sa9[3].a6, 3);
     285  }
     286  
     287  /* { dg-final { scan-tree-dump-times "strlen1" 0 "gimple" } }
     288     { dg-final { scan-tree-dump-times "call_in_true_branch_not_eliminated" 0 "ccp1" } } */