1  /* { dg-do run } */
       2  /* { dg-options "-O2 -ftree-loop-distribution -fdump-tree-ldist-details" } */
       3  /* { dg-final { scan-tree-dump-times "generated strlenQI\n" 3 "ldist" } } */
       4  
       5  #include <assert.h>
       6  
       7  typedef __SIZE_TYPE__ size_t;
       8  extern void* malloc (size_t);
       9  extern void* memset (void*, int, size_t);
      10  
      11  __attribute__((noinline))
      12  int test_pos (char *s)
      13  {
      14    int i;
      15    for (i=42; s[i]; ++i);
      16    return i;
      17  }
      18  
      19  __attribute__((noinline))
      20  int test_neg (char *s)
      21  {
      22    int i;
      23    for (i=-42; s[i]; ++i);
      24    return i;
      25  }
      26  
      27  __attribute__((noinline))
      28  int test_including_null_char (char *s)
      29  {
      30    int i;
      31    for (i=1; s[i-1]; ++i);
      32    return i;
      33  }
      34  
      35  int main(void)
      36  {
      37    void *p = malloc (1024);
      38    assert (p);
      39    memset (p, 0xf, 1024);
      40    char *s = (char *)p + 100;
      41  
      42    s[42+13] = 0;
      43    assert (test_pos (s) == 42+13);
      44    s[42+13] = 0xf;
      45  
      46    s[13] = 0;
      47    assert (test_neg (s) == 13);
      48    s[13] = 0xf;
      49  
      50    s[-13] = 0;
      51    assert (test_neg (s) == -13);
      52    s[-13] = 0xf;
      53  
      54    s[13] = 0;
      55    assert (test_including_null_char (s) == 13+1);
      56  
      57    return 0;
      58  }