text: /* { dg-require-effective-target vect_int } */
  /* { dg-additional-options "-fno-tree-scev-cprop" } */
  
  #include "tree-vect.h"
  
  /* Statement in SLP vectorization used outside the loop.
     NOTE: SCEV disabled to ensure the live operation is not removed before
     vectorization.  */
  #define LIVELOOP(RET) \
  __attribute__ ((noinline)) int \
  liveloop##RET (int n, int *x, int *y) \
  { \
    int n0, n1, j; \
    for (j = 0; j < n; ++j) \
      { \
        n0 = x[(j*2)]; \
        n1 = x[(j*2)+1]; \
        y[(j*2)] = n0 + 1; \
        y[(j*2)+1] = n1 + 2; \
      } \
    return n##RET; \
  }
  
  LIVELOOP (0)
  LIVELOOP (1)
  typedef int (*FP)(int n, int *x, int *y);
  const FP llf[]= {&liveloop0, &liveloop1};
  
  #define MAX 137
  
  int
  main (void)
  {
    int a[MAX*4];
    int b[MAX*4];
    int i;
  
    check_vect ();
  
    for (i=0; i<MAX*2; i++)
      {
        __asm__ volatile ("");
        a[i] = i;
      }
  
    for (i=0; i<2; i++)
      {
        __asm__ volatile ("");
  
        int ret = llf[i] (MAX, a, b);
  
        if (ret != (MAX * 2) - 2 + i)
  	abort ();
  
        for (i=0; i<MAX*2; i++)
  	{
  	  __asm__ volatile ("");
  	  if (b[i] != i + (i%2) + 1)
  	    abort ();
  	}
      }
  }
  
  /* { dg-final { scan-tree-dump-times "vectorized 1 loops" 2 "vect" } } */
  /* { dg-final { scan-tree-dump-times "vectorizing stmts using SLP" 2 "vect" } } */
  /* { dg-final { scan-tree-dump-times "vec_stmt_relevant_p: stmt live but not relevant" 2 "vect" } } */
  