1  /* PR tree-optimization/91294 - wrong strlen result of a conditional with
       2     an offset
       3     { dg-do run }
       4     { dg-options "-O2 -Wall" } */
       5  
       6  #include "strlenopt.h"
       7  
       8  #define NOIPA __attribute__ ((noclone, noinline, noipa))
       9  
      10  #define CAT(a, b) a ## b
      11  #define CONCAT(a, b) CAT (a, b)
      12  #define UNIQ_NAME(name) CONCAT (name, __LINE__)
      13  
      14  extern int last_line;
      15  int nfails;
      16  
      17  char buf[32];
      18  
      19  #define VERIFY(expr, nbytes, expect)					\
      20    NOIPA void UNIQ_NAME (test_)(void)					\
      21    {									\
      22      memcpy (buf, (expr), (nbytes));					\
      23      const size_t len = strlen (buf);					\
      24      if (len != expect)							\
      25        {									\
      26  	++nfails;							\
      27  	__builtin_printf ("line %i: strlen(%s) == %zu failed: "		\
      28  			  "got %zu\n",					\
      29  			  __LINE__ - 1000 + last_line + 2,		\
      30  			  #expr, (size_t)expect,			\
      31  			  len);						\
      32        }									\
      33    } typedef void DummyType
      34  
      35  const char a8[12] = "01234567";
      36  const char b8[12] = "76543210";
      37  const char c4[12] = "0123";
      38  
      39  int i0, i1 = 1, i2 = 2;
      40  
      41  int last_line = __LINE__;
      42  #line 1000
      43  VERIFY (i0 ? (a8 + 0) : (b8 + 0), 9, 8);
      44  VERIFY (i0 ? (a8 + 0) : (b8 + 1), 8, 7);
      45  VERIFY (i0 ? (a8 + 0) : (b8 + 2), 8, 6);
      46  VERIFY (i0 ? (a8 + 0) : (b8 + 2), 7, 6);
      47  VERIFY (i0 ? (a8 + 0) : (b8 + 3), 8, 5);
      48  VERIFY (i0 ? (a8 + 0) : (b8 + 3), 7, 5);
      49  VERIFY (i0 ? (a8 + 0) : (b8 + 3), 6, 5);
      50  VERIFY (i0 ? (a8 + 0) : (b8 + 4), 8, 4);
      51  VERIFY (i0 ? (a8 + 0) : (b8 + 4), 7, 4);
      52  VERIFY (i0 ? (a8 + 0) : (b8 + 4), 6, 4);
      53  VERIFY (i0 ? (a8 + 0) : (b8 + 4), 5, 4);
      54  VERIFY (i0 ? (a8 + 0) : (b8 + 5), 7, 3);
      55  VERIFY (i0 ? (a8 + 0) : (b8 + 5), 6, 3);
      56  VERIFY (i0 ? (a8 + 0) : (b8 + 5), 5, 3);
      57  VERIFY (i0 ? (a8 + 0) : (b8 + 5), 4, 3);
      58  VERIFY (i0 ? (a8 + 0) : (b8 + 6), 3, 2);
      59  VERIFY (i0 ? (a8 + 0) : (b8 + 7), 2, 1);
      60  VERIFY (i0 ? (a8 + 1) : (b8 + 0), 8, 8);
      61  VERIFY (i0 ? (a8 + 2) : (b8 + 0), 7, 7);
      62  VERIFY (i0 ? (a8 + 1) : (b8 + 1), 8, 7);
      63  VERIFY (i0 ? (a8 + 1) : (b8 + 2), 7, 6);
      64  VERIFY (i0 ? (a8 + 2) : (b8 + 1), 8, 7);   // FAIL
      65  VERIFY (i0 ? (a8 + 2) : (b8 + 2), 7, 6);
      66  VERIFY (i0 ? (a8 + 0) : (b8 + 0), 9, 8);
      67  VERIFY (i0 ? (a8 + 0) : (b8 + 1), 8, 7);
      68  VERIFY (i0 ? (a8 + 0) : (b8 + 2), 7, 6);
      69  VERIFY (i0 ? (a8 + 1) : (b8 + 0), 9, 8);
      70  VERIFY (i0 ? (a8 + 2) : (b8 + 0), 9, 8);
      71  VERIFY (i0 ? (a8 + 1) : (b8 + 1), 8, 7);
      72  VERIFY (i0 ? (a8 + 1) : (b8 + 2), 7, 6);
      73  VERIFY (i0 ? (a8 + 2) : (b8 + 1), 8, 7);   // FAIL
      74  VERIFY (i0 ? (a8 + 2) : (b8 + 2), 7, 6);
      75  VERIFY (i0 ? (a8 + 0) : (c4 + 0), 9, 4);
      76  VERIFY (i0 ? (a8 + 0) : (c4 + 1), 9, 3);
      77  VERIFY (i0 ? (a8 + 0) : (c4 + 3), 9, 1);
      78  VERIFY (i0 ? (a8 + 0) : (c4 + 4), 8, 0);
      79  VERIFY (i0 ? (a8 + 1) : (c4 + 0), 8, 4);
      80  VERIFY (i0 ? (a8 + 1) : (c4 + 1), 8, 3);
      81  VERIFY (i0 ? (a8 + 1) : (c4 + 2), 8, 2);
      82  VERIFY (i0 ? (a8 + 1) : (c4 + 3), 8, 1);
      83  VERIFY (i0 ? (a8 + 1) : (c4 + 4), 8, 0);
      84  VERIFY (i0 ? (a8 + 2) : (c4 + 0), 8, 4);
      85  VERIFY (i0 ? (a8 + 2) : (c4 + 1), 8, 3);
      86  VERIFY (i0 ? (a8 + 2) : (c4 + 2), 8, 2);
      87  VERIFY (i0 ? (a8 + 2) : (c4 + 3), 8, 1);
      88  VERIFY (i0 ? (a8 + 2) : (c4 + 4), 8, 0);
      89  VERIFY ((i0 ? a8 : b8) + 1, 8, 7);
      90  VERIFY ((i0 ? a8 : b8) + 2, 8, 6);
      91  VERIFY ((i0 ? a8 : b8) + 2, 7, 6);
      92  VERIFY ((i0 ? a8 : b8) + 3, 3, 3);
      93  VERIFY ((i0 ? a8 : b8) + 3, 1, 1);
      94  VERIFY ((i0 ? a8 : c4) + 1, 8, 3);
      95  VERIFY ((i0 ? a8 : c4) + 3, 8, 1);
      96  VERIFY ((i0 ? a8 : c4) + 4, 8, 0);
      97  VERIFY ((i0 ? a8 + 1: b8 + 2) + 1, 9, 5);
      98  VERIFY ((i0 ? a8 + i1: b8 + i2) + 1, 8, 5);
      99  VERIFY ((i0 ? a8 + i1: b8 + 2) + 1, 8, 5);
     100  VERIFY ((i0 ? a8 + i2: b8 + i1) + 1, 8, 6);
     101  VERIFY ((i0 ? a8 + 2: b8 + i1) + 1, 8, 6);
     102  
     103  #define T(N) test_ ## N (); memset (buf, 0, sizeof buf)
     104  
     105  int main (void)
     106  {
     107    T (1000);
     108    T (1001);
     109    T (1002);
     110    T (1003);
     111    T (1004);
     112    T (1005);
     113    T (1006);
     114    T (1007);
     115    T (1008);
     116    T (1009);
     117  
     118    T (1010);
     119    T (1011);
     120    T (1012);
     121    T (1013);
     122    T (1014);
     123    T (1015);
     124    T (1016);
     125    T (1017);
     126    T (1018);
     127    T (1019);
     128  
     129    T (1020);
     130    T (1021);
     131    T (1022);
     132    T (1023);
     133    T (1024);
     134    T (1025);
     135    T (1026);
     136    T (1027);
     137    T (1028);
     138    T (1029);
     139  
     140    T (1030);
     141    T (1031);
     142    T (1032);
     143    T (1033);
     144    T (1034);
     145    T (1035);
     146    T (1036);
     147    T (1037);
     148    T (1038);
     149    T (1039);
     150  
     151    T (1040);
     152    T (1041);
     153    T (1042);
     154    T (1043);
     155    T (1044);
     156    T (1045);
     157    T (1046);
     158    T (1047);
     159    T (1048);
     160    T (1049);
     161  
     162    T (1050);
     163    T (1051);
     164    T (1052);
     165    T (1053);
     166    T (1054);
     167    T (1055);
     168    T (1056);
     169    T (1057);
     170    T (1058);
     171  
     172    if (nfails)
     173      abort ();
     174  }
     175