summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.target/arm/pr65710.c
blob: 139bc6414aa62c57004ec2e02f5f7f5082e6e330 (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
/* { dg-do compile } */
/* { dg-options "-march=armv6-m -mthumb -O3 -w -mfloat-abi=soft" } */

struct ST {
  char *buffer;
  int used;
};

struct ST *h;

enum { no_op, duplicate, pop_failure_jump, dummy_failure_jump };

typedef struct {
  unsigned pointer;
} byte_fail_stack_elt_t;

typedef struct { unsigned avail; } byte_fail_stack_type;

typedef union {
  byte_fail_stack_elt_t word;
  struct {
    unsigned match_null_string_p : 2;
    unsigned is_active : 1;
    unsigned ever_matched_something : 1;
  } bits;
} byte_register_info_type;

static int a;
int b = 0;
int c, e, f;
int *d, *g;

int
byte_re_match_2_internal_size2(const int p2, int p3, const int p4) {
  int i, p;
  char *j;
  char k, l, m, n = h;
  byte_fail_stack_type o;
  byte_fail_stack_elt_t *q;
  unsigned int s = (unsigned int)h;
  long t, u;
  char **v, *w, **x, **y, **t1;
  byte_register_info_type *z, *t2 = __builtin_alloca(s);
  x = __builtin_alloca(s);
  y = __builtin_alloca(s);
  z = __builtin_alloca(sizeof(byte_register_info_type));
  k = p4 + byte_re_match_2_internal_size2;
  if (p3)
    f = p4;
  for (;;) {
    if (h == h->used) {
      g = f;
      if (o.avail) {
        b = 1;
        for (; i < s; i++)
          t1[i] = w;
        goto fail;
      }
      e = 30 > s;
      d = p4;
      d[s] = 1;
      return;
    }
    switch (*h->buffer++) {
    case no_op:
      while (m && n ?: *g)
        ;
      y[*h->buffer] = z[*h->buffer].bits.match_null_string_p ? w == &a ?: w : w;
      w = g;
      if (t) {
        char r = h;
        while (r && z[r].bits.is_active)
          r--;
        if (r == 0)
          ;
        else
          u = r;
      }
      switch (*j++)
      case dummy_failure_jump:
      i = j;
      if (i)
        if (z[*h->buffer].bits.ever_matched_something) {
          unsigned r;
          z[*h->buffer].bits.ever_matched_something = r = *h->buffer;
          for (; r + *(h->buffer + 1); r++) {
            v = x[r];
            w[r] = y[r];
          }
        }
      break;
    case duplicate: {
      char *t3 = p2 + p3;
      if (t3)
        break;
    }
      if ((p3 ?: p4) == k)
        goto fail;
    case pop_failure_jump:
      for (; c; c--)
        t2[c].word = q[o.avail];
      char t4;
      q = t4 = __builtin_allocamemcpy(t4 ?: (p <<= 1));
    }
    continue;
  fail : {
    unsigned t5;
    t = q;
    t5 = u;
    for (; t5 >= t; t5--)
      v[t5] = q[--o.avail].pointer;
    switch (*h->buffer)
    case pop_failure_jump:
    goto fail;
  }
    m = &l;
  }
}