1  /* PR tree-optimization/86532 - Wrong code due to a wrong strlen folding  */
       2  
       3  extern __SIZE_TYPE__ strlen (const char*);
       4  
       5  static const char a[2][3] = { "1", "12" };
       6  static const char b[2][2][5] = { { "1", "12" }, { "123", "1234" } };
       7  
       8  volatile int v0 = 0;
       9  volatile int v1 = 1;
      10  volatile int v2 = 2;
      11  
      12  #define A(expr)								\
      13    ((expr) ? (void)0 : (__builtin_printf ("assertion on line %i: %s\n",	\
      14  					 __LINE__, #expr),		\
      15  		       __builtin_abort ()))
      16  
      17  void test_array_ref_2_3 (void)
      18  {
      19    A (strlen (a[v0]) == 1);
      20    A (strlen (&a[v0][v0]) == 1);
      21    A (strlen (&a[0][v0]) == 1);
      22    A (strlen (&a[v0][0]) == 1);
      23  
      24    A (strlen (a[v1]) == 2);
      25    A (strlen (&a[v1][0]) == 2);
      26    A (strlen (&a[1][v0]) == 2);
      27    A (strlen (&a[v1][v0]) == 2);
      28  
      29    A (strlen (&a[v1][1]) == 1);
      30    A (strlen (&a[v1][1]) == 1);
      31  
      32    A (strlen (&a[v1][2]) == 0);
      33    A (strlen (&a[v1][v2]) == 0);
      34  
      35    int i0 = 0;
      36    int i1 = i0 + 1;
      37    int i2 = i1 + 1;
      38  
      39    A (strlen (a[v0]) == 1);
      40    A (strlen (&a[v0][v0]) == 1);
      41    A (strlen (&a[i0][v0]) == 1);
      42    A (strlen (&a[v0][i0]) == 1);
      43  
      44    A (strlen (a[v1]) == 2);
      45    A (strlen (&a[v1][i0]) == 2);
      46    A (strlen (&a[i1][v0]) == 2);
      47    A (strlen (&a[v1][v0]) == 2);
      48  
      49    A (strlen (&a[v1][i1]) == 1);
      50    A (strlen (&a[v1][i1]) == 1);
      51  
      52    A (strlen (&a[v1][i2]) == 0);
      53    A (strlen (&a[v1][v2]) == 0);
      54  }
      55  
      56  void test_array_off_2_3 (void)
      57  {
      58    A (strlen (a[0] + 0) == 1);
      59    A (strlen (a[0] + v0) == 1);
      60    A (strlen (a[v0] + 0) == 1);
      61    A (strlen (a[v0] + v0) == 1);
      62  
      63    A (strlen (a[v1] + 0) == 2);
      64    A (strlen (a[1] + v0) == 2);
      65    A (strlen (a[v1] + 0) == 2);
      66    A (strlen (a[v1] + v0) == 2);
      67  
      68    A (strlen (a[v1] + 1) == 1);
      69    A (strlen (a[v1] + v1) == 1);
      70  
      71    A (strlen (a[v1] + 2) == 0);
      72    A (strlen (a[v1] + v2) == 0);
      73  
      74    int i0 = 0;
      75    int i1 = i0 + 1;
      76    int i2 = i1 + 1;
      77  
      78    A (strlen (a[i0] + i0) == 1);
      79    A (strlen (a[i0] + v0) == 1);
      80    A (strlen (a[v0] + i0) == 1);
      81    A (strlen (a[v0] + v0) == 1);
      82  
      83    A (strlen (a[v1] + i0) == 2);
      84    A (strlen (a[i1] + v0) == 2);
      85    A (strlen (a[v1] + i0) == 2);
      86    A (strlen (a[v1] + v0) == 2);
      87  
      88    A (strlen (a[v1] + i1) == 1);
      89    A (strlen (a[v1] + v1) == 1);
      90  
      91    A (strlen (a[v1] + i2) == 0);
      92    A (strlen (a[v1] + v2) == 0);
      93  }
      94  
      95  void test_array_ref_2_2_5 (void)
      96  {
      97    A (strlen (b[0][v0]) == 1);
      98    A (strlen (b[v0][0]) == 1);
      99  
     100    A (strlen (&b[0][0][v0]) == 1);
     101    A (strlen (&b[0][v0][0]) == 1);
     102    A (strlen (&b[v0][0][0]) == 1);
     103  
     104    A (strlen (&b[0][v0][v0]) == 1);
     105    A (strlen (&b[v0][0][v0]) == 1);
     106    A (strlen (&b[v0][v0][0]) == 1);
     107  
     108    A (strlen (b[0][v1]) == 2);
     109    A (strlen (b[v1][0]) == 3);
     110  
     111    A (strlen (&b[0][0][v1]) == 0);
     112    A (strlen (&b[0][v1][0]) == 2);
     113    A (strlen (&b[v0][0][0]) == 1);
     114  
     115    A (strlen (&b[0][v0][v0]) == 1);
     116    A (strlen (&b[v0][0][v0]) == 1);
     117    A (strlen (&b[v0][v0][0]) == 1);
     118  
     119    A (strlen (&b[0][v1][v1]) == 1);
     120    A (strlen (&b[v1][0][v1]) == 2);
     121    A (strlen (&b[v1][v1][0]) == 4);
     122    A (strlen (&b[v1][v1][1]) == 3);
     123    A (strlen (&b[v1][v1][2]) == 2);
     124  
     125    int i0 = 0;
     126    int i1 = i0 + 1;
     127    int i2 = i1 + 1;
     128  
     129    A (strlen (b[i0][v0]) == 1);
     130    A (strlen (b[v0][i0]) == 1);
     131  
     132    A (strlen (&b[i0][i0][v0]) == 1);
     133    A (strlen (&b[i0][v0][i0]) == 1);
     134    A (strlen (&b[v0][i0][i0]) == 1);
     135  
     136    A (strlen (&b[i0][v0][v0]) == 1);
     137    A (strlen (&b[v0][i0][v0]) == 1);
     138    A (strlen (&b[v0][v0][i0]) == 1);
     139  
     140    A (strlen (b[i0][v1]) == 2);
     141    A (strlen (b[v1][i0]) == 3);
     142  
     143    A (strlen (&b[i0][i0][v1]) == 0);
     144    A (strlen (&b[i0][v1][i0]) == 2);
     145    A (strlen (&b[v0][i0][i0]) == 1);
     146  
     147    A (strlen (&b[i0][v0][v0]) == 1);
     148    A (strlen (&b[v0][i0][v0]) == 1);
     149    A (strlen (&b[v0][v0][i0]) == 1);
     150  
     151    A (strlen (&b[i0][v1][v1]) == 1);
     152    A (strlen (&b[v1][i0][v1]) == 2);
     153    A (strlen (&b[v1][v1][i0]) == 4);
     154    A (strlen (&b[v1][v1][i1]) == 3);
     155    A (strlen (&b[v1][v1][i2]) == 2);
     156  }
     157  
     158  void test_array_off_2_2_5 (void)
     159  {
     160    A (strlen (b[0][0] + v0) == 1);
     161    A (strlen (b[0][v0] + v0) == 1);
     162    A (strlen (b[v0][0] + v0) == 1);
     163    A (strlen (b[v0][v0] + v0) == 1);
     164  
     165    A (strlen (b[0][0] + v1) == 0);
     166    A (strlen (b[0][v1] + 0) == 2);
     167    A (strlen (b[v0][0] + 0) == 1);
     168  
     169    A (strlen (b[0][v0] + v0) == 1);
     170    A (strlen (b[v0][0] + v0) == 1);
     171    A (strlen (b[v0][v0] + 0) == 1);
     172  
     173    A (strlen (b[0][v1] + v1) == 1);
     174    A (strlen (b[v1][0] + v1) == 2);
     175    A (strlen (b[v1][v1] + 0) == 4);
     176    A (strlen (b[v1][v1] + 1) == 3);
     177    A (strlen (b[v1][v1] + 2) == 2);
     178  
     179    int i0 = 0;
     180    int i1 = i0 + 1;
     181    int i2 = i1 + 1;
     182  
     183    A (strlen (b[i0][i0] + v0) == 1);
     184    A (strlen (b[i0][v0] + v0) == 1);
     185    A (strlen (b[v0][i0] + v0) == 1);
     186    A (strlen (b[v0][v0] + v0) == 1);
     187  
     188    A (strlen (b[i0][i0] + v1) == 0);
     189    A (strlen (b[i0][v1] + i0) == 2);
     190    A (strlen (b[v0][i0] + i0) == 1);
     191  
     192    A (strlen (b[i0][v0] + v0) == 1);
     193    A (strlen (b[v0][i0] + v0) == 1);
     194    A (strlen (b[v0][v0] + i0) == 1);
     195  
     196    A (strlen (b[i0][v1] + v1) == 1);
     197    A (strlen (b[v1][i0] + v1) == 2);
     198    A (strlen (b[v1][v1] + i0) == 4);
     199    A (strlen (b[v1][v1] + i1) == 3);
     200    A (strlen (b[v1][v1] + i2) == 2);
     201  }
     202  
     203  int main ()
     204  {
     205    test_array_ref_2_3 ();
     206    test_array_off_2_3 ();
     207  
     208    test_array_ref_2_2_5 ();
     209    test_array_off_2_2_5 ();
     210  }