summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/strcmpopt_10.c
blob: 94fda596901fbb516d7852e496cda4ab4b95e9c4 (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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/* Verify that strncmp equalities aren't eliminated when the trailing array
   type referenced by a member pointer is smaller than the string in cases
   when the pointer pointed to by the enclosing object references an object
   sufficiently large to store a string of equal length.
  { dg-do compile }
  { dg-options "-O2 -Wall -Wextra -fdump-tree-optimized" } */

void init (void*);

struct A1 { char i, a[1]; };

void f1_arr (void)
{
  char a[9];
  init (a);

  struct A1 *p = (struct A1*)a;

  if (__builtin_strncmp (p->a, "01234567", 8) == 0)
    {
      extern void array_test (void);
      array_test ();
    }
}

void f1_ptr (void)
{
  void *p;
  init (&p);

  struct A1 *q = (struct A1*)p;

  if (__builtin_strncmp (q->a, "0123456789", 10) == 0)
    {
      extern void pointer_test (void);
      pointer_test ();
    }
}

void f1_struct (void)
{
  struct { char a[9]; } b;
  init (&b);

  struct A1 *p = (struct A1*)&b;

  if (__builtin_strncmp (p->a, "01234567", 8) == 0)
    {
      extern void struct_test (void);
      struct_test ();
    }
}

void f1_memptr (void)
{
  struct { void *p; } b;
  init (&b);

  struct A1 *p = (struct A1*)b.p;

  if (__builtin_strncmp (p->a, "0123456789", 10) == 0)
    {
      extern void memptr_test (void);
      memptr_test ();
    }
}


struct A2 { char i, a[2]; };

void f2_arr (void)
{
  char a[8];
  init (a);

  struct A2 *p = (struct A2*)a;

  if (__builtin_strncmp (p->a, "0123456", 7) == 0)
    {
      extern void array_test (void);
      array_test ();
    }
}

void f2_ptr (void)
{
  void *p;
  init (&p);

  struct A2 *q = (struct A2*)p;

  if (__builtin_strncmp (q->a, "0123456789", 10) == 0)
    {
      extern void pointer_test (void);
      pointer_test ();
    }
}

void f2_struct (void)
{
  struct { char a[8]; } b;
  init (&b);

  struct A2 *p = (struct A2*)&b;

  if (__builtin_strncmp (p->a, "0123456", 7) == 0)
    {
      extern void struct_test (void);
      struct_test ();
    }
}

void f2_memptr (void)
{
  struct { void *p; } b;
  init (&b);

  struct A2 *p = (struct A2*)b.p;

  if (__builtin_strncmp (p->a, "0123456789", 10) == 0)
    {
      extern void memptr_test (void);
      memptr_test ();
    }
}

/* { dg-final { scan-tree-dump-times "array_test" 2 "optimized" } }
   { dg-final { scan-tree-dump-times "pointer_test" 2 "optimized" } }
   { dg-final { scan-tree-dump-times "struct_test" 2 "optimized" } }
   { dg-final { scan-tree-dump-times "memptr_test" 2 "optimized" } } */