summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/strlenopt-59.c
blob: 9bacf8748765d26d6cc89c30d946ef40f53ed31d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/* Verify that strlen() calls with constant conditional expressions are
   eliminated as expected.

   { dg-do compile }
   { dg-options "-O1 -fdump-tree-optimized" }  */

extern void abort (void);
extern __SIZE_TYPE__ strlen (const char*);


#define CAT(x, y) x ## y
#define CONCAT(x, y) CAT (x, y)
#define FAILNAME(name) CONCAT (call_ ## name ##_on_line_, __LINE__)

#define FAIL(name) do {				\
    extern void FAILNAME (name) (void);		\
    FAILNAME (name)();				\
  } while (0)

/* Macros to emit a call to funcation named
     call_failed_to_be_eliminated_on_line_NNN()
   for each call that's expected to be eliminated.  The dg-final
   scan-tree-dump-time directive at the bottom of the test verifies
   that no such call appears in output.  */
#define ELIM(expr) \
  if ((expr)) FAIL (test_not_eliminated); else (void)0

extern char a3[3];
extern char a7[7];

struct MemArrays { char a[7], b[9]; };

struct MemArrays ma;

void test_elim_condexpr (int i)
{
  ELIM (6 < strlen (i ? "" : "123456"));
  ELIM (6 < strlen (i ? "123456" : ""));

  ELIM (4 < strlen (i < 1 ? "a" : i == 1 ? "ab" : "abc"));

  ELIM (3 < strlen (i ? "" : a3));
  ELIM (3 < strlen (i ? a3 : "1"));

  ELIM (6 < strlen (i ? "12" : a7));
  ELIM (6 < strlen (i ? a7 : "123"));

  ELIM (6 < strlen (i ? "1234" : a7));
  ELIM (7 < strlen (i ? a7 : "1234567"));

  ELIM (3 < strlen (i < 1 ? "a" : i == 1 ? "ab" : a3));
  ELIM (3 < strlen (i < 1 ? "a" : i == 1 ? a3 : "abc"));
  ELIM (3 < strlen (i < 1 ? a3 : i == 1 ? "a" : "abc"));

  ELIM (6 < strlen (i < 1 ? "a" : i == 1 ? "ab" : a7));
  ELIM (6 < strlen (i < 1 ? "a" : i == 1 ? a7 : "abc"));
  ELIM (6 < strlen (i < 1 ? a7 : i == 1 ? "a" : "abc"));

  ELIM (6 < strlen (i < 1 ? "a" : i == 1 ? a7 : a3));
  ELIM (6 < strlen (i < 1 ? a7 : i == 1 ? "a" : a3));

  {
    enum { maxlen = sizeof ma - 1 };
    ELIM (maxlen < strlen (ma.a));
  }

  {
    enum { maxlen = sizeof ma - __builtin_offsetof (struct MemArrays, b) - 1 };
    ELIM (maxlen < strlen (ma.b));
  }
}

/* { dg-final { scan-tree-dump-times "test_not_eliminated_" 0 "optimized" } } */