Coverage Report

Created: 2025-11-16 06:23

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/php-src/ext/opcache/jit/ir/ir_private.h
Line
Count
Source
1
/*
2
 * IR - Lightweight JIT Compilation Framework
3
 * (Common data structures and non public definitions)
4
 * Copyright (C) 2022 Zend by Perforce.
5
 * Authors: Dmitry Stogov <dmitry@php.net>
6
 */
7
8
#ifndef IR_PRIVATE_H
9
#define IR_PRIVATE_H
10
#include <string.h>
11
#include <stdlib.h>
12
#include <stddef.h>
13
14
#ifdef IR_DEBUG
15
# include <assert.h>
16
0
# define IR_ASSERT(x) assert(x)
17
#else
18
# define IR_ASSERT(x)
19
#endif
20
21
#ifdef _WIN32
22
# include <intrin.h>
23
# ifdef _M_X64
24
#  pragma intrinsic(_BitScanForward64)
25
#  pragma intrinsic(_BitScanReverse64)
26
# endif
27
# pragma intrinsic(_BitScanForward)
28
# pragma intrinsic(_BitScanReverse)
29
#endif
30
31
#ifdef __has_builtin
32
# if __has_builtin(__builtin_expect)
33
0
#   define EXPECTED(condition)   __builtin_expect(!!(condition), 1)
34
0
#   define UNEXPECTED(condition) __builtin_expect(!!(condition), 0)
35
# endif
36
# if __has_attribute(__aligned__)
37
#  define IR_SET_ALIGNED(alignment, decl) decl __attribute__ ((__aligned__ (alignment)))
38
# endif
39
# if __has_attribute(__fallthrough__)
40
0
#  define IR_FALLTHROUGH __attribute__((__fallthrough__))
41
# endif
42
#elif defined(_WIN32)
43
# define IR_SET_ALIGNED(alignment, decl) __declspec(align(alignment)) decl
44
#else /* GCC prior to 10 or non-clang/msvc compilers */
45
#define __has_builtin(x) 0
46
#endif
47
#ifndef EXPECTED
48
# define EXPECTED(condition)   (condition)
49
# define UNEXPECTED(condition) (condition)
50
#endif
51
#ifndef IR_SET_ALIGNED
52
#  define IR_SET_ALIGNED(alignment, decl) decl
53
#endif
54
#ifndef IR_FALLTHROUGH
55
#  define IR_FALLTHROUGH ((void)0)
56
#endif
57
58
/*** Helper routines ***/
59
60
#define IR_ALIGNED_SIZE(size, alignment) \
61
0
  (((size) + ((alignment) - 1)) & ~((alignment) - 1))
62
63
0
#define IR_MAX(a, b)          (((a) > (b)) ? (a) : (b))
64
0
#define IR_MIN(a, b)          (((a) < (b)) ? (a) : (b))
65
66
0
#define IR_IS_POWER_OF_TWO(x) ((x) && (!((x) & ((x) - 1))))
67
68
0
#define IR_LOG2(x) ir_ntzl(x)
69
70
IR_ALWAYS_INLINE uint8_t ir_rol8(uint8_t op1, uint8_t op2)
71
0
{
72
0
  return (op1 << op2) | (op1 >> (8 - op2));
73
0
}
Unexecuted instantiation: ir_cfg.c:ir_rol8
Unexecuted instantiation: ir_check.c:ir_rol8
Unexecuted instantiation: ir_dump.c:ir_rol8
Unexecuted instantiation: ir_emit.c:ir_rol8
Unexecuted instantiation: ir_gcm.c:ir_rol8
Unexecuted instantiation: ir_gdb.c:ir_rol8
Unexecuted instantiation: ir_patch.c:ir_rol8
Unexecuted instantiation: ir_ra.c:ir_rol8
Unexecuted instantiation: ir_save.c:ir_rol8
Unexecuted instantiation: ir_sccp.c:ir_rol8
Unexecuted instantiation: ir_strtab.c:ir_rol8
Unexecuted instantiation: ir.c:ir_rol8
74
75
IR_ALWAYS_INLINE uint16_t ir_rol16(uint16_t op1, uint16_t op2)
76
0
{
77
0
  return (op1 << op2) | (op1 >> (16 - op2));
78
0
}
Unexecuted instantiation: ir_cfg.c:ir_rol16
Unexecuted instantiation: ir_check.c:ir_rol16
Unexecuted instantiation: ir_dump.c:ir_rol16
Unexecuted instantiation: ir_emit.c:ir_rol16
Unexecuted instantiation: ir_gcm.c:ir_rol16
Unexecuted instantiation: ir_gdb.c:ir_rol16
Unexecuted instantiation: ir_patch.c:ir_rol16
Unexecuted instantiation: ir_ra.c:ir_rol16
Unexecuted instantiation: ir_save.c:ir_rol16
Unexecuted instantiation: ir_sccp.c:ir_rol16
Unexecuted instantiation: ir_strtab.c:ir_rol16
Unexecuted instantiation: ir.c:ir_rol16
79
80
IR_ALWAYS_INLINE uint32_t ir_rol32(uint32_t op1, uint32_t op2)
81
0
{
82
0
  return (op1 << op2) | (op1 >> (32 - op2));
83
0
}
Unexecuted instantiation: ir_cfg.c:ir_rol32
Unexecuted instantiation: ir_check.c:ir_rol32
Unexecuted instantiation: ir_dump.c:ir_rol32
Unexecuted instantiation: ir_emit.c:ir_rol32
Unexecuted instantiation: ir_gcm.c:ir_rol32
Unexecuted instantiation: ir_gdb.c:ir_rol32
Unexecuted instantiation: ir_patch.c:ir_rol32
Unexecuted instantiation: ir_ra.c:ir_rol32
Unexecuted instantiation: ir_save.c:ir_rol32
Unexecuted instantiation: ir_sccp.c:ir_rol32
Unexecuted instantiation: ir_strtab.c:ir_rol32
Unexecuted instantiation: ir.c:ir_rol32
84
85
IR_ALWAYS_INLINE uint64_t ir_rol64(uint64_t op1, uint64_t op2)
86
0
{
87
0
  return (op1 << op2) | (op1 >> (64 - op2));
88
0
}
Unexecuted instantiation: ir_cfg.c:ir_rol64
Unexecuted instantiation: ir_check.c:ir_rol64
Unexecuted instantiation: ir_dump.c:ir_rol64
Unexecuted instantiation: ir_emit.c:ir_rol64
Unexecuted instantiation: ir_gcm.c:ir_rol64
Unexecuted instantiation: ir_gdb.c:ir_rol64
Unexecuted instantiation: ir_patch.c:ir_rol64
Unexecuted instantiation: ir_ra.c:ir_rol64
Unexecuted instantiation: ir_save.c:ir_rol64
Unexecuted instantiation: ir_sccp.c:ir_rol64
Unexecuted instantiation: ir_strtab.c:ir_rol64
Unexecuted instantiation: ir.c:ir_rol64
89
90
IR_ALWAYS_INLINE uint8_t ir_ror8(uint8_t op1, uint8_t op2)
91
0
{
92
0
  return (op1 >> op2) | (op1 << (8 - op2));
93
0
}
Unexecuted instantiation: ir_cfg.c:ir_ror8
Unexecuted instantiation: ir_check.c:ir_ror8
Unexecuted instantiation: ir_dump.c:ir_ror8
Unexecuted instantiation: ir_emit.c:ir_ror8
Unexecuted instantiation: ir_gcm.c:ir_ror8
Unexecuted instantiation: ir_gdb.c:ir_ror8
Unexecuted instantiation: ir_patch.c:ir_ror8
Unexecuted instantiation: ir_ra.c:ir_ror8
Unexecuted instantiation: ir_save.c:ir_ror8
Unexecuted instantiation: ir_sccp.c:ir_ror8
Unexecuted instantiation: ir_strtab.c:ir_ror8
Unexecuted instantiation: ir.c:ir_ror8
94
95
IR_ALWAYS_INLINE uint16_t ir_ror16(uint16_t op1, uint16_t op2)
96
0
{
97
0
  return (op1 >> op2) | (op1 << (16 - op2));
98
0
}
Unexecuted instantiation: ir_cfg.c:ir_ror16
Unexecuted instantiation: ir_check.c:ir_ror16
Unexecuted instantiation: ir_dump.c:ir_ror16
Unexecuted instantiation: ir_emit.c:ir_ror16
Unexecuted instantiation: ir_gcm.c:ir_ror16
Unexecuted instantiation: ir_gdb.c:ir_ror16
Unexecuted instantiation: ir_patch.c:ir_ror16
Unexecuted instantiation: ir_ra.c:ir_ror16
Unexecuted instantiation: ir_save.c:ir_ror16
Unexecuted instantiation: ir_sccp.c:ir_ror16
Unexecuted instantiation: ir_strtab.c:ir_ror16
Unexecuted instantiation: ir.c:ir_ror16
99
100
IR_ALWAYS_INLINE uint32_t ir_ror32(uint32_t op1, uint32_t op2)
101
0
{
102
0
  return (op1 >> op2) | (op1 << (32 - op2));
103
0
}
Unexecuted instantiation: ir_cfg.c:ir_ror32
Unexecuted instantiation: ir_check.c:ir_ror32
Unexecuted instantiation: ir_dump.c:ir_ror32
Unexecuted instantiation: ir_emit.c:ir_ror32
Unexecuted instantiation: ir_gcm.c:ir_ror32
Unexecuted instantiation: ir_gdb.c:ir_ror32
Unexecuted instantiation: ir_patch.c:ir_ror32
Unexecuted instantiation: ir_ra.c:ir_ror32
Unexecuted instantiation: ir_save.c:ir_ror32
Unexecuted instantiation: ir_sccp.c:ir_ror32
Unexecuted instantiation: ir_strtab.c:ir_ror32
Unexecuted instantiation: ir.c:ir_ror32
104
105
IR_ALWAYS_INLINE uint64_t ir_ror64(uint64_t op1, uint64_t op2)
106
0
{
107
0
  return (op1 >> op2) | (op1 << (64 - op2));
108
0
}
Unexecuted instantiation: ir_cfg.c:ir_ror64
Unexecuted instantiation: ir_check.c:ir_ror64
Unexecuted instantiation: ir_dump.c:ir_ror64
Unexecuted instantiation: ir_emit.c:ir_ror64
Unexecuted instantiation: ir_gcm.c:ir_ror64
Unexecuted instantiation: ir_gdb.c:ir_ror64
Unexecuted instantiation: ir_patch.c:ir_ror64
Unexecuted instantiation: ir_ra.c:ir_ror64
Unexecuted instantiation: ir_save.c:ir_ror64
Unexecuted instantiation: ir_sccp.c:ir_ror64
Unexecuted instantiation: ir_strtab.c:ir_ror64
Unexecuted instantiation: ir.c:ir_ror64
109
110
/* Number of trailing zero bits (0x01 -> 0; 0x40 -> 6; 0x00 -> LEN) */
111
IR_ALWAYS_INLINE uint32_t ir_ntz(uint32_t num)
112
0
{
113
0
#if (defined(__GNUC__) || __has_builtin(__builtin_ctz))
114
0
  return __builtin_ctz(num);
115
#elif defined(_WIN32)
116
  uint32_t index;
117
118
  if (!_BitScanForward(&index, num)) {
119
    /* undefined behavior */
120
    return 32;
121
  }
122
123
  return index;
124
#else
125
  int n;
126
127
  if (num == 0) return 32;
128
129
  n = 1;
130
  if ((num & 0x0000ffff) == 0) {n += 16; num = num >> 16;}
131
  if ((num & 0x000000ff) == 0) {n +=  8; num = num >>  8;}
132
  if ((num & 0x0000000f) == 0) {n +=  4; num = num >>  4;}
133
  if ((num & 0x00000003) == 0) {n +=  2; num = num >>  2;}
134
  return n - (num & 1);
135
#endif
136
0
}
Unexecuted instantiation: ir_cfg.c:ir_ntz
Unexecuted instantiation: ir_check.c:ir_ntz
Unexecuted instantiation: ir_dump.c:ir_ntz
Unexecuted instantiation: ir_emit.c:ir_ntz
Unexecuted instantiation: ir_gcm.c:ir_ntz
Unexecuted instantiation: ir_gdb.c:ir_ntz
Unexecuted instantiation: ir_patch.c:ir_ntz
Unexecuted instantiation: ir_ra.c:ir_ntz
Unexecuted instantiation: ir_save.c:ir_ntz
Unexecuted instantiation: ir_sccp.c:ir_ntz
Unexecuted instantiation: ir_strtab.c:ir_ntz
Unexecuted instantiation: ir.c:ir_ntz
137
138
/* Number of trailing zero bits (0x01 -> 0; 0x40 -> 6; 0x00 -> LEN) */
139
IR_ALWAYS_INLINE uint32_t ir_ntzl(uint64_t num)
140
0
{
141
  // Note that the _WIN64 case should come before __has_builtin() below so that
142
  // clang-cl on Windows will use the uint64_t version, not the "long" uint32_t
143
  // version.
144
#if defined(_WIN64)
145
  unsigned long index;
146
147
  if (!_BitScanForward64(&index, num)) {
148
    /* undefined behavior */
149
    return 64;
150
  }
151
152
  return (uint32_t) index;
153
#elif (defined(__GNUC__) || __has_builtin(__builtin_ctzl))
154
  return __builtin_ctzl(num);
155
#else
156
  uint32_t n;
157
158
  if (num == 0) return 64;
159
160
  n = 1;
161
  if ((num & 0xffffffff) == 0) {n += 32; num = num >> 32;}
162
  if ((num & 0x0000ffff) == 0) {n += 16; num = num >> 16;}
163
  if ((num & 0x000000ff) == 0) {n +=  8; num = num >>  8;}
164
  if ((num & 0x0000000f) == 0) {n +=  4; num = num >>  4;}
165
  if ((num & 0x00000003) == 0) {n +=  2; num = num >>  2;}
166
  return n - (uint32_t)(num & 1);
167
#endif
168
0
}
Unexecuted instantiation: ir_cfg.c:ir_ntzl
Unexecuted instantiation: ir_check.c:ir_ntzl
Unexecuted instantiation: ir_dump.c:ir_ntzl
Unexecuted instantiation: ir_emit.c:ir_ntzl
Unexecuted instantiation: ir_gcm.c:ir_ntzl
Unexecuted instantiation: ir_gdb.c:ir_ntzl
Unexecuted instantiation: ir_patch.c:ir_ntzl
Unexecuted instantiation: ir_ra.c:ir_ntzl
Unexecuted instantiation: ir_save.c:ir_ntzl
Unexecuted instantiation: ir_sccp.c:ir_ntzl
Unexecuted instantiation: ir_strtab.c:ir_ntzl
Unexecuted instantiation: ir.c:ir_ntzl
169
170
/* Number of leading zero bits (Undefined for zero) */
171
IR_ALWAYS_INLINE int ir_nlz(uint32_t num)
172
0
{
173
0
#if (defined(__GNUC__) || __has_builtin(__builtin_clz))
174
0
  return __builtin_clz(num);
175
0
#elif defined(_WIN32)
176
0
  uint32_t index;
177
0
178
0
  if (!_BitScanReverse(&index, num)) {
179
0
    /* undefined behavior */
180
0
    return 32;
181
0
  }
182
0
183
0
  return (int) (32 - 1) - index;
184
0
#else
185
0
  uint32_t x;
186
0
  uint32_t n;
187
0
188
0
  n = 32;
189
0
  x = num >> 16; if (x != 0) {n -= 16; num = x;}
190
0
  x = num >> 8;  if (x != 0) {n -=  8; num = x;}
191
0
  x = num >> 4;  if (x != 0) {n -=  4; num = x;}
192
0
  x = num >> 2;  if (x != 0) {n -=  2; num = x;}
193
0
  x = num >> 1;  if (x != 0) return n - 2;
194
0
  return n - num;
195
0
#endif
196
0
}
Unexecuted instantiation: ir_cfg.c:ir_nlz
Unexecuted instantiation: ir_check.c:ir_nlz
Unexecuted instantiation: ir_dump.c:ir_nlz
Unexecuted instantiation: ir_emit.c:ir_nlz
Unexecuted instantiation: ir_gcm.c:ir_nlz
Unexecuted instantiation: ir_gdb.c:ir_nlz
Unexecuted instantiation: ir_patch.c:ir_nlz
Unexecuted instantiation: ir_ra.c:ir_nlz
Unexecuted instantiation: ir_save.c:ir_nlz
Unexecuted instantiation: ir_sccp.c:ir_nlz
Unexecuted instantiation: ir_strtab.c:ir_nlz
Unexecuted instantiation: ir.c:ir_nlz
197
198
IR_ALWAYS_INLINE int ir_nlzl(uint64_t num)
199
0
{
200
0
#if (defined(__GNUC__) || __has_builtin(__builtin_clzll))
201
0
  return __builtin_clzll(num);
202
0
#elif defined(_WIN64)
203
0
  unsigned long index;
204
0
205
0
  if (!_BitScanReverse64(&index, num)) {
206
0
    /* undefined behavior */
207
0
    return 64;
208
0
  }
209
0
210
0
  return (int) (64 - 1) - index;
211
0
#else
212
0
  uint64_t x;
213
0
  uint32_t n;
214
0
215
0
  n = 64;
216
0
  x = num >> 32; if (x != 0) {n -= 32; num = x;}
217
0
  x = num >> 16; if (x != 0) {n -= 16; num = x;}
218
0
  x = num >> 8;  if (x != 0) {n -=  8; num = x;}
219
0
  x = num >> 4;  if (x != 0) {n -=  4; num = x;}
220
0
  x = num >> 2;  if (x != 0) {n -=  2; num = x;}
221
0
  x = num >> 1;  if (x != 0) return n - 2;
222
0
  return n - (uint32_t)num;
223
0
#endif
224
0
}
Unexecuted instantiation: ir_cfg.c:ir_nlzl
Unexecuted instantiation: ir_check.c:ir_nlzl
Unexecuted instantiation: ir_dump.c:ir_nlzl
Unexecuted instantiation: ir_emit.c:ir_nlzl
Unexecuted instantiation: ir_gcm.c:ir_nlzl
Unexecuted instantiation: ir_gdb.c:ir_nlzl
Unexecuted instantiation: ir_patch.c:ir_nlzl
Unexecuted instantiation: ir_ra.c:ir_nlzl
Unexecuted instantiation: ir_save.c:ir_nlzl
Unexecuted instantiation: ir_sccp.c:ir_nlzl
Unexecuted instantiation: ir_strtab.c:ir_nlzl
Unexecuted instantiation: ir.c:ir_nlzl
225
226
/*** Helper data types ***/
227
228
/* Arena */
229
struct _ir_arena {
230
  char     *ptr;
231
  char     *end;
232
  ir_arena *prev;
233
};
234
235
IR_ALWAYS_INLINE ir_arena* ir_arena_create(size_t size)
236
0
{
237
0
  ir_arena *arena;
238
239
0
  IR_ASSERT(size >= IR_ALIGNED_SIZE(sizeof(ir_arena), 8));
240
0
  arena = (ir_arena*)ir_mem_malloc(size);
241
0
  if (UNEXPECTED(!arena))return NULL;
242
0
  arena->ptr = (char*) arena + IR_ALIGNED_SIZE(sizeof(ir_arena), 8);
243
0
  arena->end = (char*) arena + size;
244
0
  arena->prev = NULL;
245
0
  return arena;
246
0
}
Unexecuted instantiation: ir_cfg.c:ir_arena_create
Unexecuted instantiation: ir_check.c:ir_arena_create
Unexecuted instantiation: ir_dump.c:ir_arena_create
Unexecuted instantiation: ir_emit.c:ir_arena_create
Unexecuted instantiation: ir_gcm.c:ir_arena_create
Unexecuted instantiation: ir_gdb.c:ir_arena_create
Unexecuted instantiation: ir_patch.c:ir_arena_create
Unexecuted instantiation: ir_ra.c:ir_arena_create
Unexecuted instantiation: ir_save.c:ir_arena_create
Unexecuted instantiation: ir_sccp.c:ir_arena_create
Unexecuted instantiation: ir_strtab.c:ir_arena_create
Unexecuted instantiation: ir.c:ir_arena_create
247
248
IR_ALWAYS_INLINE void ir_arena_free(ir_arena *arena)
249
0
{
250
0
  do {
251
0
    ir_arena *prev = arena->prev;
252
0
    ir_mem_free(arena);
253
0
    arena = prev;
254
0
  } while (arena);
255
0
}
Unexecuted instantiation: ir_cfg.c:ir_arena_free
Unexecuted instantiation: ir_check.c:ir_arena_free
Unexecuted instantiation: ir_dump.c:ir_arena_free
Unexecuted instantiation: ir_emit.c:ir_arena_free
Unexecuted instantiation: ir_gcm.c:ir_arena_free
Unexecuted instantiation: ir_gdb.c:ir_arena_free
Unexecuted instantiation: ir_patch.c:ir_arena_free
Unexecuted instantiation: ir_ra.c:ir_arena_free
Unexecuted instantiation: ir_save.c:ir_arena_free
Unexecuted instantiation: ir_sccp.c:ir_arena_free
Unexecuted instantiation: ir_strtab.c:ir_arena_free
Unexecuted instantiation: ir.c:ir_arena_free
256
257
IR_ALWAYS_INLINE void* ir_arena_alloc(ir_arena **arena_ptr, size_t size)
258
0
{
259
0
  ir_arena *arena = *arena_ptr;
260
0
  char *ptr = (char*)IR_ALIGNED_SIZE((uintptr_t)arena->ptr, 8);
261
262
0
  if (EXPECTED((ptrdiff_t)size <= (ptrdiff_t)(arena->end - ptr))) {
263
0
    arena->ptr = ptr + size;
264
0
  } else {
265
0
    size_t arena_size =
266
0
      UNEXPECTED((size + IR_ALIGNED_SIZE(sizeof(ir_arena), 8)) > (size_t)(arena->end - (char*) arena)) ?
267
0
        (size + IR_ALIGNED_SIZE(sizeof(ir_arena), 8)) :
268
0
        (size_t)(arena->end - (char*) arena);
269
0
    ir_arena *new_arena = (ir_arena*)ir_mem_malloc(arena_size);
270
271
0
    if (UNEXPECTED(!new_arena)) return NULL;
272
0
    ptr = (char*) new_arena + IR_ALIGNED_SIZE(sizeof(ir_arena), 8);
273
0
    new_arena->ptr = (char*) new_arena + IR_ALIGNED_SIZE(sizeof(ir_arena), 8) + size;
274
0
    new_arena->end = (char*) new_arena + arena_size;
275
0
    new_arena->prev = arena;
276
0
    *arena_ptr = new_arena;
277
0
  }
278
279
0
  return (void*) ptr;
280
0
}
Unexecuted instantiation: ir_cfg.c:ir_arena_alloc
Unexecuted instantiation: ir_check.c:ir_arena_alloc
Unexecuted instantiation: ir_dump.c:ir_arena_alloc
Unexecuted instantiation: ir_emit.c:ir_arena_alloc
Unexecuted instantiation: ir_gcm.c:ir_arena_alloc
Unexecuted instantiation: ir_gdb.c:ir_arena_alloc
Unexecuted instantiation: ir_patch.c:ir_arena_alloc
Unexecuted instantiation: ir_ra.c:ir_arena_alloc
Unexecuted instantiation: ir_save.c:ir_arena_alloc
Unexecuted instantiation: ir_sccp.c:ir_arena_alloc
Unexecuted instantiation: ir_strtab.c:ir_arena_alloc
Unexecuted instantiation: ir.c:ir_arena_alloc
281
282
IR_ALWAYS_INLINE void* ir_arena_checkpoint(ir_arena *arena)
283
0
{
284
0
  return arena->ptr;
285
0
}
Unexecuted instantiation: ir_cfg.c:ir_arena_checkpoint
Unexecuted instantiation: ir_check.c:ir_arena_checkpoint
Unexecuted instantiation: ir_dump.c:ir_arena_checkpoint
Unexecuted instantiation: ir_emit.c:ir_arena_checkpoint
Unexecuted instantiation: ir_gcm.c:ir_arena_checkpoint
Unexecuted instantiation: ir_gdb.c:ir_arena_checkpoint
Unexecuted instantiation: ir_patch.c:ir_arena_checkpoint
Unexecuted instantiation: ir_ra.c:ir_arena_checkpoint
Unexecuted instantiation: ir_save.c:ir_arena_checkpoint
Unexecuted instantiation: ir_sccp.c:ir_arena_checkpoint
Unexecuted instantiation: ir_strtab.c:ir_arena_checkpoint
Unexecuted instantiation: ir.c:ir_arena_checkpoint
286
287
IR_ALWAYS_INLINE void ir_arena_release(ir_arena **arena_ptr, void *checkpoint)
288
0
{
289
0
  ir_arena *arena = *arena_ptr;
290
0
291
0
  while (UNEXPECTED((char*)checkpoint > arena->end) ||
292
0
         UNEXPECTED((char*)checkpoint <= (char*)arena)) {
293
0
    ir_arena *prev = arena->prev;
294
0
    ir_mem_free(arena);
295
0
    *arena_ptr = arena = prev;
296
0
  }
297
0
  IR_ASSERT((char*)checkpoint > (char*)arena && (char*)checkpoint <= arena->end);
298
0
  arena->ptr = (char*)checkpoint;
299
0
}
Unexecuted instantiation: ir_cfg.c:ir_arena_release
Unexecuted instantiation: ir_check.c:ir_arena_release
Unexecuted instantiation: ir_dump.c:ir_arena_release
Unexecuted instantiation: ir_emit.c:ir_arena_release
Unexecuted instantiation: ir_gcm.c:ir_arena_release
Unexecuted instantiation: ir_gdb.c:ir_arena_release
Unexecuted instantiation: ir_patch.c:ir_arena_release
Unexecuted instantiation: ir_ra.c:ir_arena_release
Unexecuted instantiation: ir_save.c:ir_arena_release
Unexecuted instantiation: ir_sccp.c:ir_arena_release
Unexecuted instantiation: ir_strtab.c:ir_arena_release
Unexecuted instantiation: ir.c:ir_arena_release
300
301
/* Bitsets */
302
#if defined(IR_TARGET_X86)
303
# define IR_BITSET_BITS 32
304
# define IR_BITSET_ONE  1U
305
# define ir_bitset_base_t uint32_t
306
# define ir_bitset_ntz  ir_ntz
307
#else
308
0
# define IR_BITSET_BITS   64
309
# ifdef _M_X64 /* MSVC*/
310
#  define IR_BITSET_ONE    1ui64
311
# else
312
0
#  define IR_BITSET_ONE    1UL
313
# endif
314
0
# define ir_bitset_base_t uint64_t
315
0
# define ir_bitset_ntz    ir_ntzl
316
#endif
317
318
typedef ir_bitset_base_t *ir_bitset;
319
320
IR_ALWAYS_INLINE uint32_t ir_bitset_len(uint32_t n)
321
0
{
322
0
  return (n + (IR_BITSET_BITS - 1)) / IR_BITSET_BITS;
323
0
}
Unexecuted instantiation: ir_cfg.c:ir_bitset_len
Unexecuted instantiation: ir_check.c:ir_bitset_len
Unexecuted instantiation: ir_dump.c:ir_bitset_len
Unexecuted instantiation: ir_emit.c:ir_bitset_len
Unexecuted instantiation: ir_gcm.c:ir_bitset_len
Unexecuted instantiation: ir_gdb.c:ir_bitset_len
Unexecuted instantiation: ir_patch.c:ir_bitset_len
Unexecuted instantiation: ir_ra.c:ir_bitset_len
Unexecuted instantiation: ir_save.c:ir_bitset_len
Unexecuted instantiation: ir_sccp.c:ir_bitset_len
Unexecuted instantiation: ir_strtab.c:ir_bitset_len
Unexecuted instantiation: ir.c:ir_bitset_len
324
325
IR_ALWAYS_INLINE ir_bitset ir_bitset_malloc(uint32_t n)
326
0
{
327
0
  return ir_mem_calloc(ir_bitset_len(n), IR_BITSET_BITS / 8);
328
0
}
Unexecuted instantiation: ir_cfg.c:ir_bitset_malloc
Unexecuted instantiation: ir_check.c:ir_bitset_malloc
Unexecuted instantiation: ir_dump.c:ir_bitset_malloc
Unexecuted instantiation: ir_emit.c:ir_bitset_malloc
Unexecuted instantiation: ir_gcm.c:ir_bitset_malloc
Unexecuted instantiation: ir_gdb.c:ir_bitset_malloc
Unexecuted instantiation: ir_patch.c:ir_bitset_malloc
Unexecuted instantiation: ir_ra.c:ir_bitset_malloc
Unexecuted instantiation: ir_save.c:ir_bitset_malloc
Unexecuted instantiation: ir_sccp.c:ir_bitset_malloc
Unexecuted instantiation: ir_strtab.c:ir_bitset_malloc
Unexecuted instantiation: ir.c:ir_bitset_malloc
329
330
IR_ALWAYS_INLINE void ir_bitset_incl(ir_bitset set, uint32_t n)
331
0
{
332
0
  set[n / IR_BITSET_BITS] |= IR_BITSET_ONE << (n % IR_BITSET_BITS);
333
0
}
Unexecuted instantiation: ir_cfg.c:ir_bitset_incl
Unexecuted instantiation: ir_check.c:ir_bitset_incl
Unexecuted instantiation: ir_dump.c:ir_bitset_incl
Unexecuted instantiation: ir_emit.c:ir_bitset_incl
Unexecuted instantiation: ir_gcm.c:ir_bitset_incl
Unexecuted instantiation: ir_gdb.c:ir_bitset_incl
Unexecuted instantiation: ir_patch.c:ir_bitset_incl
Unexecuted instantiation: ir_ra.c:ir_bitset_incl
Unexecuted instantiation: ir_save.c:ir_bitset_incl
Unexecuted instantiation: ir_sccp.c:ir_bitset_incl
Unexecuted instantiation: ir_strtab.c:ir_bitset_incl
Unexecuted instantiation: ir.c:ir_bitset_incl
334
335
IR_ALWAYS_INLINE void ir_bitset_excl(ir_bitset set, uint32_t n)
336
0
{
337
0
  set[n / IR_BITSET_BITS] &= ~(IR_BITSET_ONE << (n % IR_BITSET_BITS));
338
0
}
Unexecuted instantiation: ir_cfg.c:ir_bitset_excl
Unexecuted instantiation: ir_check.c:ir_bitset_excl
Unexecuted instantiation: ir_dump.c:ir_bitset_excl
Unexecuted instantiation: ir_emit.c:ir_bitset_excl
Unexecuted instantiation: ir_gcm.c:ir_bitset_excl
Unexecuted instantiation: ir_gdb.c:ir_bitset_excl
Unexecuted instantiation: ir_patch.c:ir_bitset_excl
Unexecuted instantiation: ir_ra.c:ir_bitset_excl
Unexecuted instantiation: ir_save.c:ir_bitset_excl
Unexecuted instantiation: ir_sccp.c:ir_bitset_excl
Unexecuted instantiation: ir_strtab.c:ir_bitset_excl
Unexecuted instantiation: ir.c:ir_bitset_excl
339
340
IR_ALWAYS_INLINE bool ir_bitset_in(const ir_bitset set, uint32_t n)
341
0
{
342
0
  return (set[(n / IR_BITSET_BITS)] & (IR_BITSET_ONE << (n % IR_BITSET_BITS))) != 0;
343
0
}
Unexecuted instantiation: ir_cfg.c:ir_bitset_in
Unexecuted instantiation: ir_check.c:ir_bitset_in
Unexecuted instantiation: ir_dump.c:ir_bitset_in
Unexecuted instantiation: ir_emit.c:ir_bitset_in
Unexecuted instantiation: ir_gcm.c:ir_bitset_in
Unexecuted instantiation: ir_gdb.c:ir_bitset_in
Unexecuted instantiation: ir_patch.c:ir_bitset_in
Unexecuted instantiation: ir_ra.c:ir_bitset_in
Unexecuted instantiation: ir_save.c:ir_bitset_in
Unexecuted instantiation: ir_sccp.c:ir_bitset_in
Unexecuted instantiation: ir_strtab.c:ir_bitset_in
Unexecuted instantiation: ir.c:ir_bitset_in
344
345
IR_ALWAYS_INLINE void ir_bitset_clear(ir_bitset set, uint32_t len)
346
0
{
347
0
  memset(set, 0, len * (IR_BITSET_BITS / 8));
348
0
}
Unexecuted instantiation: ir_cfg.c:ir_bitset_clear
Unexecuted instantiation: ir_check.c:ir_bitset_clear
Unexecuted instantiation: ir_dump.c:ir_bitset_clear
Unexecuted instantiation: ir_emit.c:ir_bitset_clear
Unexecuted instantiation: ir_gcm.c:ir_bitset_clear
Unexecuted instantiation: ir_gdb.c:ir_bitset_clear
Unexecuted instantiation: ir_patch.c:ir_bitset_clear
Unexecuted instantiation: ir_ra.c:ir_bitset_clear
Unexecuted instantiation: ir_save.c:ir_bitset_clear
Unexecuted instantiation: ir_sccp.c:ir_bitset_clear
Unexecuted instantiation: ir_strtab.c:ir_bitset_clear
Unexecuted instantiation: ir.c:ir_bitset_clear
349
350
IR_ALWAYS_INLINE void ir_bitset_fill(ir_bitset set, uint32_t len)
351
0
{
352
0
  memset(set, 0xff, len * (IR_BITSET_BITS / 8));
353
0
}
Unexecuted instantiation: ir_cfg.c:ir_bitset_fill
Unexecuted instantiation: ir_check.c:ir_bitset_fill
Unexecuted instantiation: ir_dump.c:ir_bitset_fill
Unexecuted instantiation: ir_emit.c:ir_bitset_fill
Unexecuted instantiation: ir_gcm.c:ir_bitset_fill
Unexecuted instantiation: ir_gdb.c:ir_bitset_fill
Unexecuted instantiation: ir_patch.c:ir_bitset_fill
Unexecuted instantiation: ir_ra.c:ir_bitset_fill
Unexecuted instantiation: ir_save.c:ir_bitset_fill
Unexecuted instantiation: ir_sccp.c:ir_bitset_fill
Unexecuted instantiation: ir_strtab.c:ir_bitset_fill
Unexecuted instantiation: ir.c:ir_bitset_fill
354
355
IR_ALWAYS_INLINE bool ir_bitset_empty(const ir_bitset set, uint32_t len)
356
0
{
357
0
  uint32_t i;
358
0
  for (i = 0; i < len; i++) {
359
0
    if (set[i]) {
360
0
      return 0;
361
0
    }
362
0
  }
363
0
  return 1;
364
0
}
Unexecuted instantiation: ir_cfg.c:ir_bitset_empty
Unexecuted instantiation: ir_check.c:ir_bitset_empty
Unexecuted instantiation: ir_dump.c:ir_bitset_empty
Unexecuted instantiation: ir_emit.c:ir_bitset_empty
Unexecuted instantiation: ir_gcm.c:ir_bitset_empty
Unexecuted instantiation: ir_gdb.c:ir_bitset_empty
Unexecuted instantiation: ir_patch.c:ir_bitset_empty
Unexecuted instantiation: ir_ra.c:ir_bitset_empty
Unexecuted instantiation: ir_save.c:ir_bitset_empty
Unexecuted instantiation: ir_sccp.c:ir_bitset_empty
Unexecuted instantiation: ir_strtab.c:ir_bitset_empty
Unexecuted instantiation: ir.c:ir_bitset_empty
365
366
IR_ALWAYS_INLINE bool ir_bitset_equal(const ir_bitset set1, const ir_bitset set2, uint32_t len)
367
0
{
368
0
    return memcmp(set1, set2, len * (IR_BITSET_BITS / 8)) == 0;
369
0
}
Unexecuted instantiation: ir_cfg.c:ir_bitset_equal
Unexecuted instantiation: ir_check.c:ir_bitset_equal
Unexecuted instantiation: ir_dump.c:ir_bitset_equal
Unexecuted instantiation: ir_emit.c:ir_bitset_equal
Unexecuted instantiation: ir_gcm.c:ir_bitset_equal
Unexecuted instantiation: ir_gdb.c:ir_bitset_equal
Unexecuted instantiation: ir_patch.c:ir_bitset_equal
Unexecuted instantiation: ir_ra.c:ir_bitset_equal
Unexecuted instantiation: ir_save.c:ir_bitset_equal
Unexecuted instantiation: ir_sccp.c:ir_bitset_equal
Unexecuted instantiation: ir_strtab.c:ir_bitset_equal
Unexecuted instantiation: ir.c:ir_bitset_equal
370
371
IR_ALWAYS_INLINE void ir_bitset_copy(ir_bitset set1, const ir_bitset set2, uint32_t len)
372
0
{
373
0
    memcpy(set1, set2, len * (IR_BITSET_BITS / 8));
374
0
}
Unexecuted instantiation: ir_cfg.c:ir_bitset_copy
Unexecuted instantiation: ir_check.c:ir_bitset_copy
Unexecuted instantiation: ir_dump.c:ir_bitset_copy
Unexecuted instantiation: ir_emit.c:ir_bitset_copy
Unexecuted instantiation: ir_gcm.c:ir_bitset_copy
Unexecuted instantiation: ir_gdb.c:ir_bitset_copy
Unexecuted instantiation: ir_patch.c:ir_bitset_copy
Unexecuted instantiation: ir_ra.c:ir_bitset_copy
Unexecuted instantiation: ir_save.c:ir_bitset_copy
Unexecuted instantiation: ir_sccp.c:ir_bitset_copy
Unexecuted instantiation: ir_strtab.c:ir_bitset_copy
Unexecuted instantiation: ir.c:ir_bitset_copy
375
376
IR_ALWAYS_INLINE void ir_bitset_intersection(ir_bitset set1, const ir_bitset set2, uint32_t len)
377
0
{
378
0
    uint32_t i;
379
380
0
    for (i = 0; i < len; i++) {
381
0
    set1[i] &= set2[i];
382
0
  }
383
0
}
Unexecuted instantiation: ir_cfg.c:ir_bitset_intersection
Unexecuted instantiation: ir_check.c:ir_bitset_intersection
Unexecuted instantiation: ir_dump.c:ir_bitset_intersection
Unexecuted instantiation: ir_emit.c:ir_bitset_intersection
Unexecuted instantiation: ir_gcm.c:ir_bitset_intersection
Unexecuted instantiation: ir_gdb.c:ir_bitset_intersection
Unexecuted instantiation: ir_patch.c:ir_bitset_intersection
Unexecuted instantiation: ir_ra.c:ir_bitset_intersection
Unexecuted instantiation: ir_save.c:ir_bitset_intersection
Unexecuted instantiation: ir_sccp.c:ir_bitset_intersection
Unexecuted instantiation: ir_strtab.c:ir_bitset_intersection
Unexecuted instantiation: ir.c:ir_bitset_intersection
384
385
IR_ALWAYS_INLINE void ir_bitset_union(ir_bitset set1, const ir_bitset set2, uint32_t len)
386
0
{
387
0
  uint32_t i;
388
389
0
  for (i = 0; i < len; i++) {
390
0
    set1[i] |= set2[i];
391
0
  }
392
0
}
Unexecuted instantiation: ir_cfg.c:ir_bitset_union
Unexecuted instantiation: ir_check.c:ir_bitset_union
Unexecuted instantiation: ir_dump.c:ir_bitset_union
Unexecuted instantiation: ir_emit.c:ir_bitset_union
Unexecuted instantiation: ir_gcm.c:ir_bitset_union
Unexecuted instantiation: ir_gdb.c:ir_bitset_union
Unexecuted instantiation: ir_patch.c:ir_bitset_union
Unexecuted instantiation: ir_ra.c:ir_bitset_union
Unexecuted instantiation: ir_save.c:ir_bitset_union
Unexecuted instantiation: ir_sccp.c:ir_bitset_union
Unexecuted instantiation: ir_strtab.c:ir_bitset_union
Unexecuted instantiation: ir.c:ir_bitset_union
393
394
IR_ALWAYS_INLINE void ir_bitset_difference(ir_bitset set1, const ir_bitset set2, uint32_t len)
395
0
{
396
0
  uint32_t i;
397
398
0
  for (i = 0; i < len; i++) {
399
0
    set1[i] = set1[i] & ~set2[i];
400
0
  }
401
0
}
Unexecuted instantiation: ir_cfg.c:ir_bitset_difference
Unexecuted instantiation: ir_check.c:ir_bitset_difference
Unexecuted instantiation: ir_dump.c:ir_bitset_difference
Unexecuted instantiation: ir_emit.c:ir_bitset_difference
Unexecuted instantiation: ir_gcm.c:ir_bitset_difference
Unexecuted instantiation: ir_gdb.c:ir_bitset_difference
Unexecuted instantiation: ir_patch.c:ir_bitset_difference
Unexecuted instantiation: ir_ra.c:ir_bitset_difference
Unexecuted instantiation: ir_save.c:ir_bitset_difference
Unexecuted instantiation: ir_sccp.c:ir_bitset_difference
Unexecuted instantiation: ir_strtab.c:ir_bitset_difference
Unexecuted instantiation: ir.c:ir_bitset_difference
402
403
IR_ALWAYS_INLINE bool ir_bitset_is_subset(const ir_bitset set1, const ir_bitset set2, uint32_t len)
404
0
{
405
0
  uint32_t i;
406
0
407
0
  for (i = 0; i < len; i++) {
408
0
    if (set1[i] & ~set2[i]) {
409
0
      return 0;
410
0
    }
411
0
  }
412
0
  return 1;
413
0
}
Unexecuted instantiation: ir_cfg.c:ir_bitset_is_subset
Unexecuted instantiation: ir_check.c:ir_bitset_is_subset
Unexecuted instantiation: ir_dump.c:ir_bitset_is_subset
Unexecuted instantiation: ir_emit.c:ir_bitset_is_subset
Unexecuted instantiation: ir_gcm.c:ir_bitset_is_subset
Unexecuted instantiation: ir_gdb.c:ir_bitset_is_subset
Unexecuted instantiation: ir_patch.c:ir_bitset_is_subset
Unexecuted instantiation: ir_ra.c:ir_bitset_is_subset
Unexecuted instantiation: ir_save.c:ir_bitset_is_subset
Unexecuted instantiation: ir_sccp.c:ir_bitset_is_subset
Unexecuted instantiation: ir_strtab.c:ir_bitset_is_subset
Unexecuted instantiation: ir.c:ir_bitset_is_subset
414
415
IR_ALWAYS_INLINE int ir_bitset_first(const ir_bitset set, uint32_t len)
416
0
{
417
0
  uint32_t i;
418
419
0
  for (i = 0; i < len; i++) {
420
0
    if (set[i]) {
421
0
      return IR_BITSET_BITS * i + ir_bitset_ntz(set[i]);
422
0
    }
423
0
  }
424
0
  return -1; /* empty set */
425
0
}
Unexecuted instantiation: ir_cfg.c:ir_bitset_first
Unexecuted instantiation: ir_check.c:ir_bitset_first
Unexecuted instantiation: ir_dump.c:ir_bitset_first
Unexecuted instantiation: ir_emit.c:ir_bitset_first
Unexecuted instantiation: ir_gcm.c:ir_bitset_first
Unexecuted instantiation: ir_gdb.c:ir_bitset_first
Unexecuted instantiation: ir_patch.c:ir_bitset_first
Unexecuted instantiation: ir_ra.c:ir_bitset_first
Unexecuted instantiation: ir_save.c:ir_bitset_first
Unexecuted instantiation: ir_sccp.c:ir_bitset_first
Unexecuted instantiation: ir_strtab.c:ir_bitset_first
Unexecuted instantiation: ir.c:ir_bitset_first
426
427
IR_ALWAYS_INLINE int ir_bitset_last(const ir_bitset set, uint32_t len)
428
0
{
429
0
  uint32_t i = len;
430
0
431
0
  while (i > 0) {
432
0
    i--;
433
0
    if (set[i]) {
434
0
      uint32_t j = IR_BITSET_BITS * i - 1;
435
0
      ir_bitset_base_t x = set[i];
436
0
      do {
437
0
        x = x >> 1;
438
0
        j++;
439
0
      } while (x != 0);
440
0
      return j;
441
0
    }
442
0
  }
443
0
  return -1; /* empty set */
444
0
}
Unexecuted instantiation: ir_cfg.c:ir_bitset_last
Unexecuted instantiation: ir_check.c:ir_bitset_last
Unexecuted instantiation: ir_dump.c:ir_bitset_last
Unexecuted instantiation: ir_emit.c:ir_bitset_last
Unexecuted instantiation: ir_gcm.c:ir_bitset_last
Unexecuted instantiation: ir_gdb.c:ir_bitset_last
Unexecuted instantiation: ir_patch.c:ir_bitset_last
Unexecuted instantiation: ir_ra.c:ir_bitset_last
Unexecuted instantiation: ir_save.c:ir_bitset_last
Unexecuted instantiation: ir_sccp.c:ir_bitset_last
Unexecuted instantiation: ir_strtab.c:ir_bitset_last
Unexecuted instantiation: ir.c:ir_bitset_last
445
446
IR_ALWAYS_INLINE int ir_bitset_pop_first(ir_bitset set, uint32_t len)
447
0
{
448
0
  uint32_t i;
449
450
0
  for (i = 0; i < len; i++) {
451
0
    ir_bitset_base_t x = set[i];
452
453
0
    if (x) {
454
0
      int bit = IR_BITSET_BITS * i + ir_bitset_ntz(x);
455
0
      set[i] = x & (x - 1);
456
0
      return bit;
457
0
    }
458
0
  }
459
0
  return -1; /* empty set */
460
0
}
Unexecuted instantiation: ir_cfg.c:ir_bitset_pop_first
Unexecuted instantiation: ir_check.c:ir_bitset_pop_first
Unexecuted instantiation: ir_dump.c:ir_bitset_pop_first
Unexecuted instantiation: ir_emit.c:ir_bitset_pop_first
Unexecuted instantiation: ir_gcm.c:ir_bitset_pop_first
Unexecuted instantiation: ir_gdb.c:ir_bitset_pop_first
Unexecuted instantiation: ir_patch.c:ir_bitset_pop_first
Unexecuted instantiation: ir_ra.c:ir_bitset_pop_first
Unexecuted instantiation: ir_save.c:ir_bitset_pop_first
Unexecuted instantiation: ir_sccp.c:ir_bitset_pop_first
Unexecuted instantiation: ir_strtab.c:ir_bitset_pop_first
Unexecuted instantiation: ir.c:ir_bitset_pop_first
461
462
0
#define IR_BITSET_FOREACH(set, len, bit) do { \
463
0
  ir_bitset _set = (set); \
464
0
  uint32_t _i, _len = (len); \
465
0
  for (_i = 0; _i < _len; _set++, _i++) { \
466
0
    ir_bitset_base_t _x = *_set; \
467
0
    while (_x) { \
468
0
      (bit) = IR_BITSET_BITS * _i + ir_bitset_ntz(_x); \
469
0
      _x &= _x - 1;
470
471
0
#define IR_BITSET_FOREACH_DIFFERENCE(set1, set2, len, bit) do { \
472
0
  ir_bitset _set1 = (set1); \
473
0
  ir_bitset _set2 = (set2); \
474
0
  uint32_t _i, _len = (len); \
475
0
  for (_i = 0; _i < _len; _i++) { \
476
0
    ir_bitset_base_t _x = _set1[_i] & ~_set2[_i]; \
477
0
    while (_x) { \
478
0
      (bit) = IR_BITSET_BITS * _i + ir_bitset_ntz(_x); \
479
0
      _x &= _x - 1;
480
481
#define IR_BITSET_FOREACH_END() \
482
0
    } \
483
0
  } \
484
0
} while (0)
485
486
/* Sparse Set */
487
typedef struct _ir_sparse_set {
488
  uint32_t size;
489
  uint32_t len;
490
  uint32_t *data;
491
} ir_sparse_set;
492
493
0
#define IR_SPARSE_SET_DENSE(set,  n) (set)->data[n]
494
0
#define IR_SPARSE_SET_SPARSE(set, n) (set)->data[-1 - ((int32_t)(n))]
495
496
IR_ALWAYS_INLINE void ir_sparse_set_init(ir_sparse_set *set, uint32_t size)
497
0
{
498
0
  set->size = size;
499
0
  set->len = 0;
500
0
  set->data = (uint32_t*)ir_mem_malloc(sizeof(uint32_t) * 2 * size) + size;
501
0
#ifdef IR_DEBUG
502
  /* initialize sparse part to avoid valgrind warnings */
503
0
  memset(&IR_SPARSE_SET_SPARSE(set, size - 1), 0, size * sizeof(uint32_t));
504
0
#endif
505
0
}
Unexecuted instantiation: ir_cfg.c:ir_sparse_set_init
Unexecuted instantiation: ir_check.c:ir_sparse_set_init
Unexecuted instantiation: ir_dump.c:ir_sparse_set_init
Unexecuted instantiation: ir_emit.c:ir_sparse_set_init
Unexecuted instantiation: ir_gcm.c:ir_sparse_set_init
Unexecuted instantiation: ir_gdb.c:ir_sparse_set_init
Unexecuted instantiation: ir_patch.c:ir_sparse_set_init
Unexecuted instantiation: ir_ra.c:ir_sparse_set_init
Unexecuted instantiation: ir_save.c:ir_sparse_set_init
Unexecuted instantiation: ir_sccp.c:ir_sparse_set_init
Unexecuted instantiation: ir_strtab.c:ir_sparse_set_init
Unexecuted instantiation: ir.c:ir_sparse_set_init
506
507
IR_ALWAYS_INLINE void ir_sparse_set_clear(ir_sparse_set *set)
508
0
{
509
0
  set->len = 0;
510
0
}
Unexecuted instantiation: ir_cfg.c:ir_sparse_set_clear
Unexecuted instantiation: ir_check.c:ir_sparse_set_clear
Unexecuted instantiation: ir_dump.c:ir_sparse_set_clear
Unexecuted instantiation: ir_emit.c:ir_sparse_set_clear
Unexecuted instantiation: ir_gcm.c:ir_sparse_set_clear
Unexecuted instantiation: ir_gdb.c:ir_sparse_set_clear
Unexecuted instantiation: ir_patch.c:ir_sparse_set_clear
Unexecuted instantiation: ir_ra.c:ir_sparse_set_clear
Unexecuted instantiation: ir_save.c:ir_sparse_set_clear
Unexecuted instantiation: ir_sccp.c:ir_sparse_set_clear
Unexecuted instantiation: ir_strtab.c:ir_sparse_set_clear
Unexecuted instantiation: ir.c:ir_sparse_set_clear
511
512
IR_ALWAYS_INLINE void ir_sparse_set_free(ir_sparse_set *set)
513
0
{
514
0
  ir_mem_free(set->data - set->size);
515
0
}
Unexecuted instantiation: ir_cfg.c:ir_sparse_set_free
Unexecuted instantiation: ir_check.c:ir_sparse_set_free
Unexecuted instantiation: ir_dump.c:ir_sparse_set_free
Unexecuted instantiation: ir_emit.c:ir_sparse_set_free
Unexecuted instantiation: ir_gcm.c:ir_sparse_set_free
Unexecuted instantiation: ir_gdb.c:ir_sparse_set_free
Unexecuted instantiation: ir_patch.c:ir_sparse_set_free
Unexecuted instantiation: ir_ra.c:ir_sparse_set_free
Unexecuted instantiation: ir_save.c:ir_sparse_set_free
Unexecuted instantiation: ir_sccp.c:ir_sparse_set_free
Unexecuted instantiation: ir_strtab.c:ir_sparse_set_free
Unexecuted instantiation: ir.c:ir_sparse_set_free
516
517
IR_ALWAYS_INLINE bool ir_sparse_set_empty(const ir_sparse_set *set)
518
0
{
519
0
  return set->len == 0;
520
0
}
Unexecuted instantiation: ir_cfg.c:ir_sparse_set_empty
Unexecuted instantiation: ir_check.c:ir_sparse_set_empty
Unexecuted instantiation: ir_dump.c:ir_sparse_set_empty
Unexecuted instantiation: ir_emit.c:ir_sparse_set_empty
Unexecuted instantiation: ir_gcm.c:ir_sparse_set_empty
Unexecuted instantiation: ir_gdb.c:ir_sparse_set_empty
Unexecuted instantiation: ir_patch.c:ir_sparse_set_empty
Unexecuted instantiation: ir_ra.c:ir_sparse_set_empty
Unexecuted instantiation: ir_save.c:ir_sparse_set_empty
Unexecuted instantiation: ir_sccp.c:ir_sparse_set_empty
Unexecuted instantiation: ir_strtab.c:ir_sparse_set_empty
Unexecuted instantiation: ir.c:ir_sparse_set_empty
521
522
IR_ALWAYS_INLINE bool ir_sparse_set_in(const ir_sparse_set *set, uint32_t n)
523
0
{
524
0
  uint32_t idx = IR_SPARSE_SET_SPARSE(set, n);
525
526
0
  return idx < set->len && IR_SPARSE_SET_DENSE(set, idx) == n;
527
0
}
Unexecuted instantiation: ir_cfg.c:ir_sparse_set_in
Unexecuted instantiation: ir_check.c:ir_sparse_set_in
Unexecuted instantiation: ir_dump.c:ir_sparse_set_in
Unexecuted instantiation: ir_emit.c:ir_sparse_set_in
Unexecuted instantiation: ir_gcm.c:ir_sparse_set_in
Unexecuted instantiation: ir_gdb.c:ir_sparse_set_in
Unexecuted instantiation: ir_patch.c:ir_sparse_set_in
Unexecuted instantiation: ir_ra.c:ir_sparse_set_in
Unexecuted instantiation: ir_save.c:ir_sparse_set_in
Unexecuted instantiation: ir_sccp.c:ir_sparse_set_in
Unexecuted instantiation: ir_strtab.c:ir_sparse_set_in
Unexecuted instantiation: ir.c:ir_sparse_set_in
528
529
IR_ALWAYS_INLINE void ir_sparse_set_add(ir_sparse_set *set, uint32_t n)
530
0
{
531
0
  uint32_t idx;
532
533
0
  IR_ASSERT(!ir_sparse_set_in(set, n));
534
0
  idx = set->len++;
535
0
  IR_SPARSE_SET_DENSE(set, idx) = n;
536
0
  IR_SPARSE_SET_SPARSE(set, n) = idx;
537
0
}
Unexecuted instantiation: ir_cfg.c:ir_sparse_set_add
Unexecuted instantiation: ir_check.c:ir_sparse_set_add
Unexecuted instantiation: ir_dump.c:ir_sparse_set_add
Unexecuted instantiation: ir_emit.c:ir_sparse_set_add
Unexecuted instantiation: ir_gcm.c:ir_sparse_set_add
Unexecuted instantiation: ir_gdb.c:ir_sparse_set_add
Unexecuted instantiation: ir_patch.c:ir_sparse_set_add
Unexecuted instantiation: ir_ra.c:ir_sparse_set_add
Unexecuted instantiation: ir_save.c:ir_sparse_set_add
Unexecuted instantiation: ir_sccp.c:ir_sparse_set_add
Unexecuted instantiation: ir_strtab.c:ir_sparse_set_add
Unexecuted instantiation: ir.c:ir_sparse_set_add
538
539
IR_ALWAYS_INLINE void ir_sparse_set_del(ir_sparse_set *set, uint32_t n)
540
0
{
541
0
  uint32_t last;
542
0
543
0
  IR_ASSERT(ir_sparse_set_in(set, n));
544
0
  last = IR_SPARSE_SET_DENSE(set, set->len - 1);
545
0
  if (last != n) {
546
0
    uint32_t idx = IR_SPARSE_SET_SPARSE(set, n);
547
0
548
0
    IR_SPARSE_SET_DENSE(set, idx) = last;
549
0
    IR_SPARSE_SET_SPARSE(set, last) = idx;
550
0
551
0
  }
552
0
  set->len--;
553
0
}
Unexecuted instantiation: ir_cfg.c:ir_sparse_set_del
Unexecuted instantiation: ir_check.c:ir_sparse_set_del
Unexecuted instantiation: ir_dump.c:ir_sparse_set_del
Unexecuted instantiation: ir_emit.c:ir_sparse_set_del
Unexecuted instantiation: ir_gcm.c:ir_sparse_set_del
Unexecuted instantiation: ir_gdb.c:ir_sparse_set_del
Unexecuted instantiation: ir_patch.c:ir_sparse_set_del
Unexecuted instantiation: ir_ra.c:ir_sparse_set_del
Unexecuted instantiation: ir_save.c:ir_sparse_set_del
Unexecuted instantiation: ir_sccp.c:ir_sparse_set_del
Unexecuted instantiation: ir_strtab.c:ir_sparse_set_del
Unexecuted instantiation: ir.c:ir_sparse_set_del
554
555
IR_ALWAYS_INLINE uint32_t ir_sparse_set_pop(ir_sparse_set *set)
556
0
{
557
0
  if (set->len > 0) {
558
0
    set->len--;
559
0
    return IR_SPARSE_SET_DENSE(set, set->len);
560
0
  }
561
0
  return -1; /* empty set */
562
0
}
Unexecuted instantiation: ir_cfg.c:ir_sparse_set_pop
Unexecuted instantiation: ir_check.c:ir_sparse_set_pop
Unexecuted instantiation: ir_dump.c:ir_sparse_set_pop
Unexecuted instantiation: ir_emit.c:ir_sparse_set_pop
Unexecuted instantiation: ir_gcm.c:ir_sparse_set_pop
Unexecuted instantiation: ir_gdb.c:ir_sparse_set_pop
Unexecuted instantiation: ir_patch.c:ir_sparse_set_pop
Unexecuted instantiation: ir_ra.c:ir_sparse_set_pop
Unexecuted instantiation: ir_save.c:ir_sparse_set_pop
Unexecuted instantiation: ir_sccp.c:ir_sparse_set_pop
Unexecuted instantiation: ir_strtab.c:ir_sparse_set_pop
Unexecuted instantiation: ir.c:ir_sparse_set_pop
563
564
0
#define IR_SPARSE_SET_FOREACH(set, bit) do { \
565
0
  ir_sparse_set *_set = (set); \
566
0
  uint32_t _i, _len = _set->len; \
567
0
  uint32_t *_p = _set->data; \
568
0
  for (_i = 0; _i < _len; _p++, _i++) { \
569
0
    (bit) = *_p; \
570
571
#define IR_SPARSE_SET_FOREACH_END() \
572
0
  } \
573
0
} while (0)
574
575
/* Bit Queue */
576
typedef struct _ir_bitqueue {
577
  uint32_t  len;
578
  uint32_t  pos;
579
  ir_bitset set;
580
} ir_bitqueue;
581
582
IR_ALWAYS_INLINE void ir_bitqueue_init(ir_bitqueue *q, uint32_t n)
583
0
{
584
0
  q->len = ir_bitset_len(n);
585
0
  q->pos = q->len - 1;
586
0
  q->set = ir_bitset_malloc(n);
587
0
}
Unexecuted instantiation: ir_cfg.c:ir_bitqueue_init
Unexecuted instantiation: ir_check.c:ir_bitqueue_init
Unexecuted instantiation: ir_dump.c:ir_bitqueue_init
Unexecuted instantiation: ir_emit.c:ir_bitqueue_init
Unexecuted instantiation: ir_gcm.c:ir_bitqueue_init
Unexecuted instantiation: ir_gdb.c:ir_bitqueue_init
Unexecuted instantiation: ir_patch.c:ir_bitqueue_init
Unexecuted instantiation: ir_ra.c:ir_bitqueue_init
Unexecuted instantiation: ir_save.c:ir_bitqueue_init
Unexecuted instantiation: ir_sccp.c:ir_bitqueue_init
Unexecuted instantiation: ir_strtab.c:ir_bitqueue_init
Unexecuted instantiation: ir.c:ir_bitqueue_init
588
589
IR_ALWAYS_INLINE void ir_bitqueue_grow(ir_bitqueue *q, uint32_t n)
590
0
{
591
0
  uint32_t len = ir_bitset_len(n);
592
0
  IR_ASSERT(len >= q->len);
593
0
  if (len > q->len) {
594
0
    q->set = ir_mem_realloc(q->set, len * (IR_BITSET_BITS / 8));
595
0
    memset(q->set + q->len, 0, (len - q->len) * (IR_BITSET_BITS / 8));
596
0
    q->len = len;
597
0
  }
598
0
}
Unexecuted instantiation: ir_cfg.c:ir_bitqueue_grow
Unexecuted instantiation: ir_check.c:ir_bitqueue_grow
Unexecuted instantiation: ir_dump.c:ir_bitqueue_grow
Unexecuted instantiation: ir_emit.c:ir_bitqueue_grow
Unexecuted instantiation: ir_gcm.c:ir_bitqueue_grow
Unexecuted instantiation: ir_gdb.c:ir_bitqueue_grow
Unexecuted instantiation: ir_patch.c:ir_bitqueue_grow
Unexecuted instantiation: ir_ra.c:ir_bitqueue_grow
Unexecuted instantiation: ir_save.c:ir_bitqueue_grow
Unexecuted instantiation: ir_sccp.c:ir_bitqueue_grow
Unexecuted instantiation: ir_strtab.c:ir_bitqueue_grow
Unexecuted instantiation: ir.c:ir_bitqueue_grow
599
600
IR_ALWAYS_INLINE void ir_bitqueue_free(ir_bitqueue *q)
601
0
{
602
0
  ir_mem_free(q->set);
603
0
}
Unexecuted instantiation: ir_cfg.c:ir_bitqueue_free
Unexecuted instantiation: ir_check.c:ir_bitqueue_free
Unexecuted instantiation: ir_dump.c:ir_bitqueue_free
Unexecuted instantiation: ir_emit.c:ir_bitqueue_free
Unexecuted instantiation: ir_gcm.c:ir_bitqueue_free
Unexecuted instantiation: ir_gdb.c:ir_bitqueue_free
Unexecuted instantiation: ir_patch.c:ir_bitqueue_free
Unexecuted instantiation: ir_ra.c:ir_bitqueue_free
Unexecuted instantiation: ir_save.c:ir_bitqueue_free
Unexecuted instantiation: ir_sccp.c:ir_bitqueue_free
Unexecuted instantiation: ir_strtab.c:ir_bitqueue_free
Unexecuted instantiation: ir.c:ir_bitqueue_free
604
605
IR_ALWAYS_INLINE void ir_bitqueue_clear(ir_bitqueue *q)
606
0
{
607
0
  q->pos = q->len - 1;
608
0
  ir_bitset_clear(q->set, q->len);
609
0
}
Unexecuted instantiation: ir_cfg.c:ir_bitqueue_clear
Unexecuted instantiation: ir_check.c:ir_bitqueue_clear
Unexecuted instantiation: ir_dump.c:ir_bitqueue_clear
Unexecuted instantiation: ir_emit.c:ir_bitqueue_clear
Unexecuted instantiation: ir_gcm.c:ir_bitqueue_clear
Unexecuted instantiation: ir_gdb.c:ir_bitqueue_clear
Unexecuted instantiation: ir_patch.c:ir_bitqueue_clear
Unexecuted instantiation: ir_ra.c:ir_bitqueue_clear
Unexecuted instantiation: ir_save.c:ir_bitqueue_clear
Unexecuted instantiation: ir_sccp.c:ir_bitqueue_clear
Unexecuted instantiation: ir_strtab.c:ir_bitqueue_clear
Unexecuted instantiation: ir.c:ir_bitqueue_clear
610
611
IR_ALWAYS_INLINE int ir_bitqueue_pop(ir_bitqueue *q)
612
0
{
613
0
  uint32_t i = q->pos;
614
0
  ir_bitset_base_t x, *p = q->set + i;
615
0
  do {
616
0
    x = *p;
617
0
    if (x) {
618
0
      int bit = IR_BITSET_BITS * i + ir_bitset_ntz(x);
619
0
      *p = x & (x - 1);
620
0
      q->pos = i;
621
0
      return bit;
622
0
    }
623
0
    p++;
624
0
    i++;
625
0
  } while (i < q->len);
626
0
  q->pos = q->len - 1;
627
0
  return -1; /* empty set */
628
0
}
Unexecuted instantiation: ir_cfg.c:ir_bitqueue_pop
Unexecuted instantiation: ir_check.c:ir_bitqueue_pop
Unexecuted instantiation: ir_dump.c:ir_bitqueue_pop
Unexecuted instantiation: ir_emit.c:ir_bitqueue_pop
Unexecuted instantiation: ir_gcm.c:ir_bitqueue_pop
Unexecuted instantiation: ir_gdb.c:ir_bitqueue_pop
Unexecuted instantiation: ir_patch.c:ir_bitqueue_pop
Unexecuted instantiation: ir_ra.c:ir_bitqueue_pop
Unexecuted instantiation: ir_save.c:ir_bitqueue_pop
Unexecuted instantiation: ir_sccp.c:ir_bitqueue_pop
Unexecuted instantiation: ir_strtab.c:ir_bitqueue_pop
Unexecuted instantiation: ir.c:ir_bitqueue_pop
629
630
IR_ALWAYS_INLINE void ir_bitqueue_add(ir_bitqueue *q, uint32_t n)
631
0
{
632
0
  uint32_t i = n / IR_BITSET_BITS;
633
0
  q->set[i] |= IR_BITSET_ONE << (n % IR_BITSET_BITS);
634
0
  if (i < q->pos) {
635
0
    q->pos = i;
636
0
  }
637
0
}
Unexecuted instantiation: ir_cfg.c:ir_bitqueue_add
Unexecuted instantiation: ir_check.c:ir_bitqueue_add
Unexecuted instantiation: ir_dump.c:ir_bitqueue_add
Unexecuted instantiation: ir_emit.c:ir_bitqueue_add
Unexecuted instantiation: ir_gcm.c:ir_bitqueue_add
Unexecuted instantiation: ir_gdb.c:ir_bitqueue_add
Unexecuted instantiation: ir_patch.c:ir_bitqueue_add
Unexecuted instantiation: ir_ra.c:ir_bitqueue_add
Unexecuted instantiation: ir_save.c:ir_bitqueue_add
Unexecuted instantiation: ir_sccp.c:ir_bitqueue_add
Unexecuted instantiation: ir_strtab.c:ir_bitqueue_add
Unexecuted instantiation: ir.c:ir_bitqueue_add
638
639
IR_ALWAYS_INLINE void ir_bitqueue_del(ir_bitqueue *q, uint32_t n)
640
0
{
641
0
  ir_bitset_excl(q->set, n);
642
0
}
Unexecuted instantiation: ir_cfg.c:ir_bitqueue_del
Unexecuted instantiation: ir_check.c:ir_bitqueue_del
Unexecuted instantiation: ir_dump.c:ir_bitqueue_del
Unexecuted instantiation: ir_emit.c:ir_bitqueue_del
Unexecuted instantiation: ir_gcm.c:ir_bitqueue_del
Unexecuted instantiation: ir_gdb.c:ir_bitqueue_del
Unexecuted instantiation: ir_patch.c:ir_bitqueue_del
Unexecuted instantiation: ir_ra.c:ir_bitqueue_del
Unexecuted instantiation: ir_save.c:ir_bitqueue_del
Unexecuted instantiation: ir_sccp.c:ir_bitqueue_del
Unexecuted instantiation: ir_strtab.c:ir_bitqueue_del
Unexecuted instantiation: ir.c:ir_bitqueue_del
643
644
IR_ALWAYS_INLINE bool ir_bitqueue_in(const ir_bitqueue *q, uint32_t n)
645
0
{
646
0
  return ir_bitset_in(q->set, n);
647
0
}
Unexecuted instantiation: ir_cfg.c:ir_bitqueue_in
Unexecuted instantiation: ir_check.c:ir_bitqueue_in
Unexecuted instantiation: ir_dump.c:ir_bitqueue_in
Unexecuted instantiation: ir_emit.c:ir_bitqueue_in
Unexecuted instantiation: ir_gcm.c:ir_bitqueue_in
Unexecuted instantiation: ir_gdb.c:ir_bitqueue_in
Unexecuted instantiation: ir_patch.c:ir_bitqueue_in
Unexecuted instantiation: ir_ra.c:ir_bitqueue_in
Unexecuted instantiation: ir_save.c:ir_bitqueue_in
Unexecuted instantiation: ir_sccp.c:ir_bitqueue_in
Unexecuted instantiation: ir_strtab.c:ir_bitqueue_in
Unexecuted instantiation: ir.c:ir_bitqueue_in
648
649
/* Dynamic array of numeric references */
650
typedef struct _ir_array {
651
  ir_ref   *refs;
652
  uint32_t  size;
653
} ir_array;
654
655
void ir_array_grow(ir_array *a, uint32_t size);
656
void ir_array_insert(ir_array *a, uint32_t i, ir_ref val);
657
void ir_array_remove(ir_array *a, uint32_t i);
658
659
IR_ALWAYS_INLINE void ir_array_init(ir_array *a, uint32_t size)
660
0
{
661
0
  a->refs = ir_mem_malloc(size * sizeof(ir_ref));
662
0
  a->size = size;
663
0
}
Unexecuted instantiation: ir_cfg.c:ir_array_init
Unexecuted instantiation: ir_check.c:ir_array_init
Unexecuted instantiation: ir_dump.c:ir_array_init
Unexecuted instantiation: ir_emit.c:ir_array_init
Unexecuted instantiation: ir_gcm.c:ir_array_init
Unexecuted instantiation: ir_gdb.c:ir_array_init
Unexecuted instantiation: ir_patch.c:ir_array_init
Unexecuted instantiation: ir_ra.c:ir_array_init
Unexecuted instantiation: ir_save.c:ir_array_init
Unexecuted instantiation: ir_sccp.c:ir_array_init
Unexecuted instantiation: ir_strtab.c:ir_array_init
Unexecuted instantiation: ir.c:ir_array_init
664
665
IR_ALWAYS_INLINE void ir_array_free(ir_array *a)
666
0
{
667
0
  ir_mem_free(a->refs);
668
0
  a->refs = NULL;
669
0
  a->size = 0;
670
0
}
Unexecuted instantiation: ir_cfg.c:ir_array_free
Unexecuted instantiation: ir_check.c:ir_array_free
Unexecuted instantiation: ir_dump.c:ir_array_free
Unexecuted instantiation: ir_emit.c:ir_array_free
Unexecuted instantiation: ir_gcm.c:ir_array_free
Unexecuted instantiation: ir_gdb.c:ir_array_free
Unexecuted instantiation: ir_patch.c:ir_array_free
Unexecuted instantiation: ir_ra.c:ir_array_free
Unexecuted instantiation: ir_save.c:ir_array_free
Unexecuted instantiation: ir_sccp.c:ir_array_free
Unexecuted instantiation: ir_strtab.c:ir_array_free
Unexecuted instantiation: ir.c:ir_array_free
671
672
IR_ALWAYS_INLINE uint32_t ir_array_size(const ir_array *a)
673
0
{
674
0
  return a->size;
675
0
}
Unexecuted instantiation: ir_cfg.c:ir_array_size
Unexecuted instantiation: ir_check.c:ir_array_size
Unexecuted instantiation: ir_dump.c:ir_array_size
Unexecuted instantiation: ir_emit.c:ir_array_size
Unexecuted instantiation: ir_gcm.c:ir_array_size
Unexecuted instantiation: ir_gdb.c:ir_array_size
Unexecuted instantiation: ir_patch.c:ir_array_size
Unexecuted instantiation: ir_ra.c:ir_array_size
Unexecuted instantiation: ir_save.c:ir_array_size
Unexecuted instantiation: ir_sccp.c:ir_array_size
Unexecuted instantiation: ir_strtab.c:ir_array_size
Unexecuted instantiation: ir.c:ir_array_size
676
677
IR_ALWAYS_INLINE ir_ref ir_array_get(const ir_array *a, uint32_t i)
678
0
{
679
0
  return (i < a->size) ? a->refs[i] : IR_UNUSED;
680
0
}
Unexecuted instantiation: ir_cfg.c:ir_array_get
Unexecuted instantiation: ir_check.c:ir_array_get
Unexecuted instantiation: ir_dump.c:ir_array_get
Unexecuted instantiation: ir_emit.c:ir_array_get
Unexecuted instantiation: ir_gcm.c:ir_array_get
Unexecuted instantiation: ir_gdb.c:ir_array_get
Unexecuted instantiation: ir_patch.c:ir_array_get
Unexecuted instantiation: ir_ra.c:ir_array_get
Unexecuted instantiation: ir_save.c:ir_array_get
Unexecuted instantiation: ir_sccp.c:ir_array_get
Unexecuted instantiation: ir_strtab.c:ir_array_get
Unexecuted instantiation: ir.c:ir_array_get
681
682
IR_ALWAYS_INLINE ir_ref ir_array_at(const ir_array *a, uint32_t i)
683
0
{
684
0
  IR_ASSERT(i < a->size);
685
0
  return a->refs[i];
686
0
}
Unexecuted instantiation: ir_cfg.c:ir_array_at
Unexecuted instantiation: ir_check.c:ir_array_at
Unexecuted instantiation: ir_dump.c:ir_array_at
Unexecuted instantiation: ir_emit.c:ir_array_at
Unexecuted instantiation: ir_gcm.c:ir_array_at
Unexecuted instantiation: ir_gdb.c:ir_array_at
Unexecuted instantiation: ir_patch.c:ir_array_at
Unexecuted instantiation: ir_ra.c:ir_array_at
Unexecuted instantiation: ir_save.c:ir_array_at
Unexecuted instantiation: ir_sccp.c:ir_array_at
Unexecuted instantiation: ir_strtab.c:ir_array_at
Unexecuted instantiation: ir.c:ir_array_at
687
688
IR_ALWAYS_INLINE void ir_array_set(ir_array *a, uint32_t i, ir_ref val)
689
0
{
690
0
  if (i >= a->size) {
691
0
    ir_array_grow(a, i + 1);
692
0
  }
693
0
  a->refs[i] = val;
694
0
}
Unexecuted instantiation: ir_cfg.c:ir_array_set
Unexecuted instantiation: ir_check.c:ir_array_set
Unexecuted instantiation: ir_dump.c:ir_array_set
Unexecuted instantiation: ir_emit.c:ir_array_set
Unexecuted instantiation: ir_gcm.c:ir_array_set
Unexecuted instantiation: ir_gdb.c:ir_array_set
Unexecuted instantiation: ir_patch.c:ir_array_set
Unexecuted instantiation: ir_ra.c:ir_array_set
Unexecuted instantiation: ir_save.c:ir_array_set
Unexecuted instantiation: ir_sccp.c:ir_array_set
Unexecuted instantiation: ir_strtab.c:ir_array_set
Unexecuted instantiation: ir.c:ir_array_set
695
696
IR_ALWAYS_INLINE void ir_array_set_unchecked(ir_array *a, uint32_t i, ir_ref val)
697
0
{
698
0
  IR_ASSERT(i < a->size);
699
0
  a->refs[i] = val;
700
0
}
Unexecuted instantiation: ir_cfg.c:ir_array_set_unchecked
Unexecuted instantiation: ir_check.c:ir_array_set_unchecked
Unexecuted instantiation: ir_dump.c:ir_array_set_unchecked
Unexecuted instantiation: ir_emit.c:ir_array_set_unchecked
Unexecuted instantiation: ir_gcm.c:ir_array_set_unchecked
Unexecuted instantiation: ir_gdb.c:ir_array_set_unchecked
Unexecuted instantiation: ir_patch.c:ir_array_set_unchecked
Unexecuted instantiation: ir_ra.c:ir_array_set_unchecked
Unexecuted instantiation: ir_save.c:ir_array_set_unchecked
Unexecuted instantiation: ir_sccp.c:ir_array_set_unchecked
Unexecuted instantiation: ir_strtab.c:ir_array_set_unchecked
Unexecuted instantiation: ir.c:ir_array_set_unchecked
701
702
/* List/Stack of numeric references */
703
typedef struct _ir_list {
704
  ir_array a;
705
  uint32_t len;
706
} ir_list;
707
708
uint32_t ir_list_find(const ir_list *l, ir_ref val);
709
void ir_list_insert(ir_list *l, uint32_t i, ir_ref val);
710
void ir_list_remove(ir_list *l, uint32_t i);
711
712
IR_ALWAYS_INLINE void ir_list_init(ir_list *l, uint32_t size)
713
0
{
714
0
  ir_array_init(&l->a, size);
715
0
  l->len = 0;
716
0
}
Unexecuted instantiation: ir_cfg.c:ir_list_init
Unexecuted instantiation: ir_check.c:ir_list_init
Unexecuted instantiation: ir_dump.c:ir_list_init
Unexecuted instantiation: ir_emit.c:ir_list_init
Unexecuted instantiation: ir_gcm.c:ir_list_init
Unexecuted instantiation: ir_gdb.c:ir_list_init
Unexecuted instantiation: ir_patch.c:ir_list_init
Unexecuted instantiation: ir_ra.c:ir_list_init
Unexecuted instantiation: ir_save.c:ir_list_init
Unexecuted instantiation: ir_sccp.c:ir_list_init
Unexecuted instantiation: ir_strtab.c:ir_list_init
Unexecuted instantiation: ir.c:ir_list_init
717
718
IR_ALWAYS_INLINE void ir_list_free(ir_list *l)
719
0
{
720
0
  ir_array_free(&l->a);
721
0
  l->len = 0;
722
0
}
Unexecuted instantiation: ir_cfg.c:ir_list_free
Unexecuted instantiation: ir_check.c:ir_list_free
Unexecuted instantiation: ir_dump.c:ir_list_free
Unexecuted instantiation: ir_emit.c:ir_list_free
Unexecuted instantiation: ir_gcm.c:ir_list_free
Unexecuted instantiation: ir_gdb.c:ir_list_free
Unexecuted instantiation: ir_patch.c:ir_list_free
Unexecuted instantiation: ir_ra.c:ir_list_free
Unexecuted instantiation: ir_save.c:ir_list_free
Unexecuted instantiation: ir_sccp.c:ir_list_free
Unexecuted instantiation: ir_strtab.c:ir_list_free
Unexecuted instantiation: ir.c:ir_list_free
723
724
IR_ALWAYS_INLINE void ir_list_clear(ir_list *l)
725
0
{
726
0
  l->len = 0;
727
0
}
Unexecuted instantiation: ir_cfg.c:ir_list_clear
Unexecuted instantiation: ir_check.c:ir_list_clear
Unexecuted instantiation: ir_dump.c:ir_list_clear
Unexecuted instantiation: ir_emit.c:ir_list_clear
Unexecuted instantiation: ir_gcm.c:ir_list_clear
Unexecuted instantiation: ir_gdb.c:ir_list_clear
Unexecuted instantiation: ir_patch.c:ir_list_clear
Unexecuted instantiation: ir_ra.c:ir_list_clear
Unexecuted instantiation: ir_save.c:ir_list_clear
Unexecuted instantiation: ir_sccp.c:ir_list_clear
Unexecuted instantiation: ir_strtab.c:ir_list_clear
Unexecuted instantiation: ir.c:ir_list_clear
728
729
IR_ALWAYS_INLINE uint32_t ir_list_len(const ir_list *l)
730
0
{
731
0
  return l->len;
732
0
}
Unexecuted instantiation: ir_cfg.c:ir_list_len
Unexecuted instantiation: ir_check.c:ir_list_len
Unexecuted instantiation: ir_dump.c:ir_list_len
Unexecuted instantiation: ir_emit.c:ir_list_len
Unexecuted instantiation: ir_gcm.c:ir_list_len
Unexecuted instantiation: ir_gdb.c:ir_list_len
Unexecuted instantiation: ir_patch.c:ir_list_len
Unexecuted instantiation: ir_ra.c:ir_list_len
Unexecuted instantiation: ir_save.c:ir_list_len
Unexecuted instantiation: ir_sccp.c:ir_list_len
Unexecuted instantiation: ir_strtab.c:ir_list_len
Unexecuted instantiation: ir.c:ir_list_len
733
734
IR_ALWAYS_INLINE uint32_t ir_list_capasity(const ir_list *l)
735
0
{
736
0
  return ir_array_size(&l->a);
737
0
}
Unexecuted instantiation: ir_cfg.c:ir_list_capasity
Unexecuted instantiation: ir_check.c:ir_list_capasity
Unexecuted instantiation: ir_dump.c:ir_list_capasity
Unexecuted instantiation: ir_emit.c:ir_list_capasity
Unexecuted instantiation: ir_gcm.c:ir_list_capasity
Unexecuted instantiation: ir_gdb.c:ir_list_capasity
Unexecuted instantiation: ir_patch.c:ir_list_capasity
Unexecuted instantiation: ir_ra.c:ir_list_capasity
Unexecuted instantiation: ir_save.c:ir_list_capasity
Unexecuted instantiation: ir_sccp.c:ir_list_capasity
Unexecuted instantiation: ir_strtab.c:ir_list_capasity
Unexecuted instantiation: ir.c:ir_list_capasity
738
739
IR_ALWAYS_INLINE void ir_list_push(ir_list *l, ir_ref val)
740
0
{
741
0
  ir_array_set(&l->a, l->len++, val);
742
0
}
Unexecuted instantiation: ir_cfg.c:ir_list_push
Unexecuted instantiation: ir_check.c:ir_list_push
Unexecuted instantiation: ir_dump.c:ir_list_push
Unexecuted instantiation: ir_emit.c:ir_list_push
Unexecuted instantiation: ir_gcm.c:ir_list_push
Unexecuted instantiation: ir_gdb.c:ir_list_push
Unexecuted instantiation: ir_patch.c:ir_list_push
Unexecuted instantiation: ir_ra.c:ir_list_push
Unexecuted instantiation: ir_save.c:ir_list_push
Unexecuted instantiation: ir_sccp.c:ir_list_push
Unexecuted instantiation: ir_strtab.c:ir_list_push
Unexecuted instantiation: ir.c:ir_list_push
743
744
IR_ALWAYS_INLINE void ir_list_push_unchecked(ir_list *l, ir_ref val)
745
0
{
746
0
  ir_array_set_unchecked(&l->a, l->len++, val);
747
0
}
Unexecuted instantiation: ir_cfg.c:ir_list_push_unchecked
Unexecuted instantiation: ir_check.c:ir_list_push_unchecked
Unexecuted instantiation: ir_dump.c:ir_list_push_unchecked
Unexecuted instantiation: ir_emit.c:ir_list_push_unchecked
Unexecuted instantiation: ir_gcm.c:ir_list_push_unchecked
Unexecuted instantiation: ir_gdb.c:ir_list_push_unchecked
Unexecuted instantiation: ir_patch.c:ir_list_push_unchecked
Unexecuted instantiation: ir_ra.c:ir_list_push_unchecked
Unexecuted instantiation: ir_save.c:ir_list_push_unchecked
Unexecuted instantiation: ir_sccp.c:ir_list_push_unchecked
Unexecuted instantiation: ir_strtab.c:ir_list_push_unchecked
Unexecuted instantiation: ir.c:ir_list_push_unchecked
748
749
IR_ALWAYS_INLINE ir_ref ir_list_pop(ir_list *l)
750
0
{
751
0
  IR_ASSERT(l->len > 0);
752
0
  return ir_array_at(&l->a, --l->len);
753
0
}
Unexecuted instantiation: ir_cfg.c:ir_list_pop
Unexecuted instantiation: ir_check.c:ir_list_pop
Unexecuted instantiation: ir_dump.c:ir_list_pop
Unexecuted instantiation: ir_emit.c:ir_list_pop
Unexecuted instantiation: ir_gcm.c:ir_list_pop
Unexecuted instantiation: ir_gdb.c:ir_list_pop
Unexecuted instantiation: ir_patch.c:ir_list_pop
Unexecuted instantiation: ir_ra.c:ir_list_pop
Unexecuted instantiation: ir_save.c:ir_list_pop
Unexecuted instantiation: ir_sccp.c:ir_list_pop
Unexecuted instantiation: ir_strtab.c:ir_list_pop
Unexecuted instantiation: ir.c:ir_list_pop
754
755
IR_ALWAYS_INLINE ir_ref ir_list_peek(const ir_list *l)
756
0
{
757
0
  IR_ASSERT(l->len > 0);
758
0
  return ir_array_at(&l->a, l->len - 1);
759
0
}
Unexecuted instantiation: ir_cfg.c:ir_list_peek
Unexecuted instantiation: ir_check.c:ir_list_peek
Unexecuted instantiation: ir_dump.c:ir_list_peek
Unexecuted instantiation: ir_emit.c:ir_list_peek
Unexecuted instantiation: ir_gcm.c:ir_list_peek
Unexecuted instantiation: ir_gdb.c:ir_list_peek
Unexecuted instantiation: ir_patch.c:ir_list_peek
Unexecuted instantiation: ir_ra.c:ir_list_peek
Unexecuted instantiation: ir_save.c:ir_list_peek
Unexecuted instantiation: ir_sccp.c:ir_list_peek
Unexecuted instantiation: ir_strtab.c:ir_list_peek
Unexecuted instantiation: ir.c:ir_list_peek
760
761
IR_ALWAYS_INLINE ir_ref ir_list_at(const ir_list *l, uint32_t i)
762
0
{
763
0
  IR_ASSERT(i < l->len);
764
0
  return ir_array_at(&l->a, i);
765
0
}
Unexecuted instantiation: ir_cfg.c:ir_list_at
Unexecuted instantiation: ir_check.c:ir_list_at
Unexecuted instantiation: ir_dump.c:ir_list_at
Unexecuted instantiation: ir_emit.c:ir_list_at
Unexecuted instantiation: ir_gcm.c:ir_list_at
Unexecuted instantiation: ir_gdb.c:ir_list_at
Unexecuted instantiation: ir_patch.c:ir_list_at
Unexecuted instantiation: ir_ra.c:ir_list_at
Unexecuted instantiation: ir_save.c:ir_list_at
Unexecuted instantiation: ir_sccp.c:ir_list_at
Unexecuted instantiation: ir_strtab.c:ir_list_at
Unexecuted instantiation: ir.c:ir_list_at
766
767
IR_ALWAYS_INLINE void ir_list_set(ir_list *l, uint32_t i, ir_ref val)
768
0
{
769
0
  IR_ASSERT(i < l->len);
770
0
  ir_array_set_unchecked(&l->a, i, val);
771
0
}
Unexecuted instantiation: ir_cfg.c:ir_list_set
Unexecuted instantiation: ir_check.c:ir_list_set
Unexecuted instantiation: ir_dump.c:ir_list_set
Unexecuted instantiation: ir_emit.c:ir_list_set
Unexecuted instantiation: ir_gcm.c:ir_list_set
Unexecuted instantiation: ir_gdb.c:ir_list_set
Unexecuted instantiation: ir_patch.c:ir_list_set
Unexecuted instantiation: ir_ra.c:ir_list_set
Unexecuted instantiation: ir_save.c:ir_list_set
Unexecuted instantiation: ir_sccp.c:ir_list_set
Unexecuted instantiation: ir_strtab.c:ir_list_set
Unexecuted instantiation: ir.c:ir_list_set
772
773
/* Doesn't preserve order */
774
IR_ALWAYS_INLINE void ir_list_del(ir_list *l, uint32_t i)
775
0
{
776
0
  IR_ASSERT(i < l->len);
777
0
  l->len--;
778
0
  ir_array_set_unchecked(&l->a, i, ir_array_at(&l->a, l->len));
779
0
}
Unexecuted instantiation: ir_cfg.c:ir_list_del
Unexecuted instantiation: ir_check.c:ir_list_del
Unexecuted instantiation: ir_dump.c:ir_list_del
Unexecuted instantiation: ir_emit.c:ir_list_del
Unexecuted instantiation: ir_gcm.c:ir_list_del
Unexecuted instantiation: ir_gdb.c:ir_list_del
Unexecuted instantiation: ir_patch.c:ir_list_del
Unexecuted instantiation: ir_ra.c:ir_list_del
Unexecuted instantiation: ir_save.c:ir_list_del
Unexecuted instantiation: ir_sccp.c:ir_list_del
Unexecuted instantiation: ir_strtab.c:ir_list_del
Unexecuted instantiation: ir.c:ir_list_del
780
781
IR_ALWAYS_INLINE bool ir_list_contains(const ir_list *l, ir_ref val)
782
0
{
783
0
  return ir_list_find(l, val) != (uint32_t)-1;
784
0
}
Unexecuted instantiation: ir_cfg.c:ir_list_contains
Unexecuted instantiation: ir_check.c:ir_list_contains
Unexecuted instantiation: ir_dump.c:ir_list_contains
Unexecuted instantiation: ir_emit.c:ir_list_contains
Unexecuted instantiation: ir_gcm.c:ir_list_contains
Unexecuted instantiation: ir_gdb.c:ir_list_contains
Unexecuted instantiation: ir_patch.c:ir_list_contains
Unexecuted instantiation: ir_ra.c:ir_list_contains
Unexecuted instantiation: ir_save.c:ir_list_contains
Unexecuted instantiation: ir_sccp.c:ir_list_contains
Unexecuted instantiation: ir_strtab.c:ir_list_contains
Unexecuted instantiation: ir.c:ir_list_contains
785
786
/* Worklist (unique list) */
787
typedef struct _ir_worklist {
788
  ir_list l;
789
  ir_bitset visited;
790
} ir_worklist;
791
792
IR_ALWAYS_INLINE void ir_worklist_init(ir_worklist *w, uint32_t size)
793
0
{
794
0
  ir_list_init(&w->l, size);
795
0
  w->visited = ir_bitset_malloc(size);
796
0
}
Unexecuted instantiation: ir_cfg.c:ir_worklist_init
Unexecuted instantiation: ir_check.c:ir_worklist_init
Unexecuted instantiation: ir_dump.c:ir_worklist_init
Unexecuted instantiation: ir_emit.c:ir_worklist_init
Unexecuted instantiation: ir_gcm.c:ir_worklist_init
Unexecuted instantiation: ir_gdb.c:ir_worklist_init
Unexecuted instantiation: ir_patch.c:ir_worklist_init
Unexecuted instantiation: ir_ra.c:ir_worklist_init
Unexecuted instantiation: ir_save.c:ir_worklist_init
Unexecuted instantiation: ir_sccp.c:ir_worklist_init
Unexecuted instantiation: ir_strtab.c:ir_worklist_init
Unexecuted instantiation: ir.c:ir_worklist_init
797
798
IR_ALWAYS_INLINE void ir_worklist_free(ir_worklist *w)
799
0
{
800
0
  ir_list_free(&w->l);
801
0
  ir_mem_free(w->visited);
802
0
}
Unexecuted instantiation: ir_cfg.c:ir_worklist_free
Unexecuted instantiation: ir_check.c:ir_worklist_free
Unexecuted instantiation: ir_dump.c:ir_worklist_free
Unexecuted instantiation: ir_emit.c:ir_worklist_free
Unexecuted instantiation: ir_gcm.c:ir_worklist_free
Unexecuted instantiation: ir_gdb.c:ir_worklist_free
Unexecuted instantiation: ir_patch.c:ir_worklist_free
Unexecuted instantiation: ir_ra.c:ir_worklist_free
Unexecuted instantiation: ir_save.c:ir_worklist_free
Unexecuted instantiation: ir_sccp.c:ir_worklist_free
Unexecuted instantiation: ir_strtab.c:ir_worklist_free
Unexecuted instantiation: ir.c:ir_worklist_free
803
804
IR_ALWAYS_INLINE uint32_t ir_worklist_len(const ir_worklist *w)
805
0
{
806
0
  return ir_list_len(&w->l);
807
0
}
Unexecuted instantiation: ir_cfg.c:ir_worklist_len
Unexecuted instantiation: ir_check.c:ir_worklist_len
Unexecuted instantiation: ir_dump.c:ir_worklist_len
Unexecuted instantiation: ir_emit.c:ir_worklist_len
Unexecuted instantiation: ir_gcm.c:ir_worklist_len
Unexecuted instantiation: ir_gdb.c:ir_worklist_len
Unexecuted instantiation: ir_patch.c:ir_worklist_len
Unexecuted instantiation: ir_ra.c:ir_worklist_len
Unexecuted instantiation: ir_save.c:ir_worklist_len
Unexecuted instantiation: ir_sccp.c:ir_worklist_len
Unexecuted instantiation: ir_strtab.c:ir_worklist_len
Unexecuted instantiation: ir.c:ir_worklist_len
808
809
IR_ALWAYS_INLINE uint32_t ir_worklist_capasity(const ir_worklist *w)
810
0
{
811
0
  return ir_list_capasity(&w->l);
812
0
}
Unexecuted instantiation: ir_cfg.c:ir_worklist_capasity
Unexecuted instantiation: ir_check.c:ir_worklist_capasity
Unexecuted instantiation: ir_dump.c:ir_worklist_capasity
Unexecuted instantiation: ir_emit.c:ir_worklist_capasity
Unexecuted instantiation: ir_gcm.c:ir_worklist_capasity
Unexecuted instantiation: ir_gdb.c:ir_worklist_capasity
Unexecuted instantiation: ir_patch.c:ir_worklist_capasity
Unexecuted instantiation: ir_ra.c:ir_worklist_capasity
Unexecuted instantiation: ir_save.c:ir_worklist_capasity
Unexecuted instantiation: ir_sccp.c:ir_worklist_capasity
Unexecuted instantiation: ir_strtab.c:ir_worklist_capasity
Unexecuted instantiation: ir.c:ir_worklist_capasity
813
814
IR_ALWAYS_INLINE void ir_worklist_clear(ir_worklist *w)
815
0
{
816
0
  ir_list_clear(&w->l);
817
0
  ir_bitset_clear(w->visited, ir_bitset_len(ir_worklist_capasity(w)));
818
0
}
Unexecuted instantiation: ir_cfg.c:ir_worklist_clear
Unexecuted instantiation: ir_check.c:ir_worklist_clear
Unexecuted instantiation: ir_dump.c:ir_worklist_clear
Unexecuted instantiation: ir_emit.c:ir_worklist_clear
Unexecuted instantiation: ir_gcm.c:ir_worklist_clear
Unexecuted instantiation: ir_gdb.c:ir_worklist_clear
Unexecuted instantiation: ir_patch.c:ir_worklist_clear
Unexecuted instantiation: ir_ra.c:ir_worklist_clear
Unexecuted instantiation: ir_save.c:ir_worklist_clear
Unexecuted instantiation: ir_sccp.c:ir_worklist_clear
Unexecuted instantiation: ir_strtab.c:ir_worklist_clear
Unexecuted instantiation: ir.c:ir_worklist_clear
819
820
IR_ALWAYS_INLINE bool ir_worklist_push(ir_worklist *w, ir_ref val)
821
0
{
822
0
  IR_ASSERT(val >= 0 && (uint32_t)val < ir_worklist_capasity(w));
823
0
  if (ir_bitset_in(w->visited, val)) {
824
0
    return 0;
825
0
  }
826
0
  ir_bitset_incl(w->visited, val);
827
0
  IR_ASSERT(ir_list_len(&w->l) < ir_list_capasity(&w->l));
828
0
  ir_list_push_unchecked(&w->l, val);
829
0
  return 1;
830
0
}
Unexecuted instantiation: ir_cfg.c:ir_worklist_push
Unexecuted instantiation: ir_check.c:ir_worklist_push
Unexecuted instantiation: ir_dump.c:ir_worklist_push
Unexecuted instantiation: ir_emit.c:ir_worklist_push
Unexecuted instantiation: ir_gcm.c:ir_worklist_push
Unexecuted instantiation: ir_gdb.c:ir_worklist_push
Unexecuted instantiation: ir_patch.c:ir_worklist_push
Unexecuted instantiation: ir_ra.c:ir_worklist_push
Unexecuted instantiation: ir_save.c:ir_worklist_push
Unexecuted instantiation: ir_sccp.c:ir_worklist_push
Unexecuted instantiation: ir_strtab.c:ir_worklist_push
Unexecuted instantiation: ir.c:ir_worklist_push
831
832
IR_ALWAYS_INLINE ir_ref ir_worklist_pop(ir_worklist *w)
833
0
{
834
0
  return ir_list_pop(&w->l);
835
0
}
Unexecuted instantiation: ir_cfg.c:ir_worklist_pop
Unexecuted instantiation: ir_check.c:ir_worklist_pop
Unexecuted instantiation: ir_dump.c:ir_worklist_pop
Unexecuted instantiation: ir_emit.c:ir_worklist_pop
Unexecuted instantiation: ir_gcm.c:ir_worklist_pop
Unexecuted instantiation: ir_gdb.c:ir_worklist_pop
Unexecuted instantiation: ir_patch.c:ir_worklist_pop
Unexecuted instantiation: ir_ra.c:ir_worklist_pop
Unexecuted instantiation: ir_save.c:ir_worklist_pop
Unexecuted instantiation: ir_sccp.c:ir_worklist_pop
Unexecuted instantiation: ir_strtab.c:ir_worklist_pop
Unexecuted instantiation: ir.c:ir_worklist_pop
836
837
IR_ALWAYS_INLINE ir_ref ir_worklist_peek(const ir_worklist *w)
838
0
{
839
0
  return ir_list_peek(&w->l);
840
0
}
Unexecuted instantiation: ir_cfg.c:ir_worklist_peek
Unexecuted instantiation: ir_check.c:ir_worklist_peek
Unexecuted instantiation: ir_dump.c:ir_worklist_peek
Unexecuted instantiation: ir_emit.c:ir_worklist_peek
Unexecuted instantiation: ir_gcm.c:ir_worklist_peek
Unexecuted instantiation: ir_gdb.c:ir_worklist_peek
Unexecuted instantiation: ir_patch.c:ir_worklist_peek
Unexecuted instantiation: ir_ra.c:ir_worklist_peek
Unexecuted instantiation: ir_save.c:ir_worklist_peek
Unexecuted instantiation: ir_sccp.c:ir_worklist_peek
Unexecuted instantiation: ir_strtab.c:ir_worklist_peek
Unexecuted instantiation: ir.c:ir_worklist_peek
841
842
/* IR Hash Table */
843
0
#define IR_INVALID_IDX 0xffffffff
844
0
#define IR_INVALID_VAL 0x80000000
845
846
typedef struct _ir_hashtab_bucket {
847
  uint32_t    key;
848
  ir_ref      val;
849
  uint32_t    next;
850
} ir_hashtab_bucket;
851
852
typedef struct _ir_hashtab {
853
  void       *data;
854
  uint32_t    mask;
855
  uint32_t    size;
856
  uint32_t    count;
857
  uint32_t    pos;
858
} ir_hashtab;
859
860
void ir_hashtab_init(ir_hashtab *tab, uint32_t size);
861
void ir_hashtab_free(ir_hashtab *tab);
862
ir_ref ir_hashtab_find(const ir_hashtab *tab, uint32_t key);
863
bool ir_hashtab_add(ir_hashtab *tab, uint32_t key, ir_ref val);
864
void ir_hashtab_key_sort(ir_hashtab *tab);
865
866
/* IR Addr Table */
867
typedef struct _ir_addrtab_bucket {
868
  uint64_t    key;
869
  ir_ref      val;
870
  uint32_t    next;
871
} ir_addrtab_bucket;
872
873
void ir_addrtab_init(ir_hashtab *tab, uint32_t size);
874
void ir_addrtab_free(ir_hashtab *tab);
875
ir_ref ir_addrtab_find(const ir_hashtab *tab, uint64_t key);
876
void ir_addrtab_set(ir_hashtab *tab, uint64_t key, ir_ref val);
877
878
/*** IR OP info ***/
879
extern const uint8_t ir_type_flags[IR_LAST_TYPE];
880
extern const char *ir_type_name[IR_LAST_TYPE];
881
extern const char *ir_type_cname[IR_LAST_TYPE];
882
extern const uint8_t ir_type_size[IR_LAST_TYPE];
883
extern const uint32_t ir_op_flags[IR_LAST_OP];
884
extern const char *ir_op_name[IR_LAST_OP];
885
886
void ir_print_escaped_str(const char *s, size_t len, FILE *f);
887
888
0
#define IR_IS_CONST_OP(op)       ((op) > IR_NOP && (op) <= IR_C_FLOAT)
889
0
#define IR_IS_FOLDABLE_OP(op)    ((op) <= IR_LAST_FOLDABLE_OP)
890
0
#define IR_IS_SYM_CONST(op)      ((op) == IR_STR || (op) == IR_SYM || (op) == IR_FUNC)
891
892
ir_ref ir_const_ex(ir_ctx *ctx, ir_val val, uint8_t type, uint32_t optx);
893
894
IR_ALWAYS_INLINE bool ir_const_is_true(const ir_insn *v)
895
0
{
896
0
  if (IR_IS_SYM_CONST(v->op)) {
897
0
    return 1;
898
0
  } else if (v->type == IR_BOOL) {
899
0
    return v->val.b;
900
0
  } else if (IR_IS_TYPE_INT(v->type)) {
901
0
    return v->val.i64 != 0;
902
0
  } else if (v->type == IR_DOUBLE) {
903
0
    return v->val.d != 0.0;
904
0
  } else {
905
0
    IR_ASSERT(v->type == IR_FLOAT);
906
0
    return v->val.f != 0.0;
907
0
  }
908
0
  return 0;
909
0
}
Unexecuted instantiation: ir_cfg.c:ir_const_is_true
Unexecuted instantiation: ir_check.c:ir_const_is_true
Unexecuted instantiation: ir_dump.c:ir_const_is_true
Unexecuted instantiation: ir_emit.c:ir_const_is_true
Unexecuted instantiation: ir_gcm.c:ir_const_is_true
Unexecuted instantiation: ir_gdb.c:ir_const_is_true
Unexecuted instantiation: ir_patch.c:ir_const_is_true
Unexecuted instantiation: ir_ra.c:ir_const_is_true
Unexecuted instantiation: ir_save.c:ir_const_is_true
Unexecuted instantiation: ir_sccp.c:ir_const_is_true
Unexecuted instantiation: ir_strtab.c:ir_const_is_true
Unexecuted instantiation: ir.c:ir_const_is_true
910
911
IR_ALWAYS_INLINE bool ir_ref_is_true(ir_ctx *ctx, ir_ref ref)
912
0
{
913
0
  if (ref == IR_TRUE) {
914
0
    return 1;
915
0
  } else if (ref == IR_FALSE) {
916
0
    return 0;
917
0
  } else {
918
0
    IR_ASSERT(IR_IS_CONST_REF(ref));
919
0
    return ir_const_is_true(&ctx->ir_base[ref]);
920
0
  }
921
0
}
Unexecuted instantiation: ir_cfg.c:ir_ref_is_true
Unexecuted instantiation: ir_check.c:ir_ref_is_true
Unexecuted instantiation: ir_dump.c:ir_ref_is_true
Unexecuted instantiation: ir_emit.c:ir_ref_is_true
Unexecuted instantiation: ir_gcm.c:ir_ref_is_true
Unexecuted instantiation: ir_gdb.c:ir_ref_is_true
Unexecuted instantiation: ir_patch.c:ir_ref_is_true
Unexecuted instantiation: ir_ra.c:ir_ref_is_true
Unexecuted instantiation: ir_save.c:ir_ref_is_true
Unexecuted instantiation: ir_sccp.c:ir_ref_is_true
Unexecuted instantiation: ir_strtab.c:ir_ref_is_true
Unexecuted instantiation: ir.c:ir_ref_is_true
922
923
/* IR OP flags */
924
0
#define IR_OP_FLAG_OPERANDS_SHIFT 3
925
926
0
#define IR_OP_FLAG_EDGES_MASK     0x03
927
0
#define IR_OP_FLAG_VAR_INPUTS     0x04
928
0
#define IR_OP_FLAG_OPERANDS_MASK  0x18
929
#define IR_OP_FLAG_MEM_MASK       ((1<<6)|(1<<7))
930
931
0
#define IR_OP_FLAG_DATA           (1<<8)
932
0
#define IR_OP_FLAG_CONTROL        (1<<9)
933
0
#define IR_OP_FLAG_MEM            (1<<10)
934
0
#define IR_OP_FLAG_COMMUTATIVE    (1<<11)
935
0
#define IR_OP_FLAG_BB_START       (1<<12)
936
0
#define IR_OP_FLAG_BB_END         (1<<13)
937
0
#define IR_OP_FLAG_TERMINATOR     (1<<14)
938
0
#define IR_OP_FLAG_PINNED         (1<<15)
939
940
0
#define IR_OP_FLAG_MEM_LOAD       ((0<<6)|(0<<7))
941
#define IR_OP_FLAG_MEM_STORE      ((0<<6)|(1<<7))
942
#define IR_OP_FLAG_MEM_CALL       ((1<<6)|(0<<7))
943
#define IR_OP_FLAG_MEM_ALLOC      ((1<<6)|(1<<7))
944
0
#define IR_OP_FLAG_MEM_MASK       ((1<<6)|(1<<7))
945
946
0
#define IR_OPND_UNUSED            0x0
947
0
#define IR_OPND_DATA              0x1
948
0
#define IR_OPND_CONTROL           0x2
949
0
#define IR_OPND_CONTROL_DEP       0x3
950
0
#define IR_OPND_CONTROL_REF       0x4
951
0
#define IR_OPND_STR               0x5
952
0
#define IR_OPND_NUM               0x6
953
0
#define IR_OPND_PROB              0x7
954
0
#define IR_OPND_PROTO             0x8
955
956
#define IR_OP_FLAGS(op_flags, op1_flags, op2_flags, op3_flags) \
957
  ((op_flags) | ((op1_flags) << 20) | ((op2_flags) << 24) | ((op3_flags) << 28))
958
959
0
#define IR_INPUT_EDGES_COUNT(flags) (flags & IR_OP_FLAG_EDGES_MASK)
960
0
#define IR_OPERANDS_COUNT(flags)    ((flags & IR_OP_FLAG_OPERANDS_MASK) >> IR_OP_FLAG_OPERANDS_SHIFT)
961
962
0
#define IR_OP_HAS_VAR_INPUTS(flags) ((flags) & IR_OP_FLAG_VAR_INPUTS)
963
964
#define IR_OPND_KIND(flags, i) \
965
0
  (((flags) >> (16 + (4 * (((i) > 3) ? 3 : (i))))) & 0xf)
966
967
#define IR_IS_REF_OPND_KIND(kind) \
968
0
  ((kind) >= IR_OPND_DATA && (kind) <= IR_OPND_CONTROL_REF)
969
970
IR_ALWAYS_INLINE ir_ref ir_operands_count(const ir_ctx *ctx, const ir_insn *insn)
971
0
{
972
0
  uint32_t flags = ir_op_flags[insn->op];
973
0
  uint32_t n = IR_OPERANDS_COUNT(flags);
974
975
0
  if (UNEXPECTED(IR_OP_HAS_VAR_INPUTS(flags))) {
976
    /* MERGE, PHI, CALL, etc */
977
0
    n = insn->inputs_count;
978
0
  }
979
0
  return n;
980
0
}
Unexecuted instantiation: ir_cfg.c:ir_operands_count
Unexecuted instantiation: ir_check.c:ir_operands_count
Unexecuted instantiation: ir_dump.c:ir_operands_count
Unexecuted instantiation: ir_emit.c:ir_operands_count
Unexecuted instantiation: ir_gcm.c:ir_operands_count
Unexecuted instantiation: ir_gdb.c:ir_operands_count
Unexecuted instantiation: ir_patch.c:ir_operands_count
Unexecuted instantiation: ir_ra.c:ir_operands_count
Unexecuted instantiation: ir_save.c:ir_operands_count
Unexecuted instantiation: ir_sccp.c:ir_operands_count
Unexecuted instantiation: ir_strtab.c:ir_operands_count
Unexecuted instantiation: ir.c:ir_operands_count
981
982
IR_ALWAYS_INLINE ir_ref ir_input_edges_count(const ir_ctx *ctx, const ir_insn *insn)
983
0
{
984
0
  uint32_t flags = ir_op_flags[insn->op];
985
0
  uint32_t n = IR_INPUT_EDGES_COUNT(flags);
986
0
  if (UNEXPECTED(IR_OP_HAS_VAR_INPUTS(flags))) {
987
    /* MERGE, PHI, CALL, etc */
988
0
    n = insn->inputs_count;
989
0
  }
990
0
  return n;
991
0
}
Unexecuted instantiation: ir_cfg.c:ir_input_edges_count
Unexecuted instantiation: ir_check.c:ir_input_edges_count
Unexecuted instantiation: ir_dump.c:ir_input_edges_count
Unexecuted instantiation: ir_emit.c:ir_input_edges_count
Unexecuted instantiation: ir_gcm.c:ir_input_edges_count
Unexecuted instantiation: ir_gdb.c:ir_input_edges_count
Unexecuted instantiation: ir_patch.c:ir_input_edges_count
Unexecuted instantiation: ir_ra.c:ir_input_edges_count
Unexecuted instantiation: ir_save.c:ir_input_edges_count
Unexecuted instantiation: ir_sccp.c:ir_input_edges_count
Unexecuted instantiation: ir_strtab.c:ir_input_edges_count
Unexecuted instantiation: ir.c:ir_input_edges_count
992
993
IR_ALWAYS_INLINE uint32_t ir_insn_inputs_to_len(uint32_t inputs_count)
994
0
{
995
0
  return 1 + (inputs_count >> 2);
996
0
}
Unexecuted instantiation: ir_cfg.c:ir_insn_inputs_to_len
Unexecuted instantiation: ir_check.c:ir_insn_inputs_to_len
Unexecuted instantiation: ir_dump.c:ir_insn_inputs_to_len
Unexecuted instantiation: ir_emit.c:ir_insn_inputs_to_len
Unexecuted instantiation: ir_gcm.c:ir_insn_inputs_to_len
Unexecuted instantiation: ir_gdb.c:ir_insn_inputs_to_len
Unexecuted instantiation: ir_patch.c:ir_insn_inputs_to_len
Unexecuted instantiation: ir_ra.c:ir_insn_inputs_to_len
Unexecuted instantiation: ir_save.c:ir_insn_inputs_to_len
Unexecuted instantiation: ir_sccp.c:ir_insn_inputs_to_len
Unexecuted instantiation: ir_strtab.c:ir_insn_inputs_to_len
Unexecuted instantiation: ir.c:ir_insn_inputs_to_len
997
998
IR_ALWAYS_INLINE uint32_t ir_insn_len(const ir_insn *insn)
999
0
{
1000
0
  return ir_insn_inputs_to_len(insn->inputs_count);
1001
0
}
Unexecuted instantiation: ir_cfg.c:ir_insn_len
Unexecuted instantiation: ir_check.c:ir_insn_len
Unexecuted instantiation: ir_dump.c:ir_insn_len
Unexecuted instantiation: ir_emit.c:ir_insn_len
Unexecuted instantiation: ir_gcm.c:ir_insn_len
Unexecuted instantiation: ir_gdb.c:ir_insn_len
Unexecuted instantiation: ir_patch.c:ir_insn_len
Unexecuted instantiation: ir_ra.c:ir_insn_len
Unexecuted instantiation: ir_save.c:ir_insn_len
Unexecuted instantiation: ir_sccp.c:ir_insn_len
Unexecuted instantiation: ir_strtab.c:ir_insn_len
Unexecuted instantiation: ir.c:ir_insn_len
1002
1003
/*** IR Context Private Flags (ir_ctx->flags2) ***/
1004
0
#define IR_CFG_HAS_LOOPS       (1<<0)
1005
0
#define IR_IRREDUCIBLE_CFG     (1<<1)
1006
0
#define IR_HAS_ALLOCA          (1<<2)
1007
0
#define IR_HAS_CALLS           (1<<3)
1008
0
#define IR_OPT_IN_SCCP         (1<<4)
1009
0
#define IR_LINEAR              (1<<5)
1010
0
#define IR_HAS_VA_START        (1<<6)
1011
0
#define IR_HAS_VA_COPY         (1<<7)
1012
0
#define IR_HAS_VA_ARG_GP       (1<<8)
1013
0
#define IR_HAS_VA_ARG_FP       (1<<9)
1014
#define IR_HAS_FP_RET_SLOT     (1<<10)
1015
0
#define IR_16B_FRAME_ALIGNMENT (1<<11)
1016
1017
/* Temporary: MEM2SSA -> SCCP */
1018
0
#define IR_MEM2SSA_VARS        (1<<25)
1019
1020
/* Temporary: SCCP -> CFG */
1021
0
#define IR_CFG_REACHABLE       (1<<26)
1022
1023
/* Temporary: Dominators -> Loops */
1024
0
#define IR_NO_LOOPS            (1<<25)
1025
1026
/* Temporary: Live Ranges */
1027
0
#define IR_LR_HAVE_DESSA_MOVES (1<<25)
1028
1029
/* Temporary: Register Allocator */
1030
0
#define IR_RA_HAVE_SPLITS      (1<<25)
1031
0
#define IR_RA_HAVE_SPILLS      (1<<26)
1032
1033
#define IR_RESERVED_FLAG_1     (1U<<31)
1034
1035
/*** IR Use Lists ***/
1036
struct _ir_use_list {
1037
  ir_ref        refs; /* index in ir_ctx->use_edges[] array */
1038
  ir_ref        count;
1039
};
1040
1041
void ir_use_list_remove_all(ir_ctx *ctx, ir_ref def, ir_ref use);
1042
void ir_use_list_remove_one(ir_ctx *ctx, ir_ref def, ir_ref use);
1043
void ir_use_list_replace_all(ir_ctx *ctx, ir_ref def, ir_ref use, ir_ref new_use);
1044
void ir_use_list_replace_one(ir_ctx *ctx, ir_ref def, ir_ref use, ir_ref new_use);
1045
bool ir_use_list_add(ir_ctx *ctx, ir_ref def, ir_ref use);
1046
void ir_use_list_sort(ir_ctx *ctx, ir_ref def);
1047
1048
IR_ALWAYS_INLINE ir_ref ir_next_control(const ir_ctx *ctx, ir_ref ref)
1049
0
{
1050
0
  ir_use_list *use_list = &ctx->use_lists[ref];
1051
0
  ir_ref n = use_list->count;
1052
0
  ir_ref *p;
1053
1054
0
  IR_ASSERT(ir_op_flags[ctx->ir_base[ref].op] & IR_OP_FLAG_CONTROL);
1055
0
  for (p = &ctx->use_edges[use_list->refs]; n > 0; p++, n--) {
1056
0
    ir_ref next = *p;
1057
0
    ir_insn *insn = &ctx->ir_base[next];
1058
1059
0
    if ((ir_op_flags[insn->op] & IR_OP_FLAG_CONTROL) && insn->op1 == ref) {
1060
0
      return next;
1061
0
    }
1062
0
  }
1063
0
  IR_ASSERT(0);
1064
0
  return IR_UNUSED;
1065
0
}
Unexecuted instantiation: ir_cfg.c:ir_next_control
Unexecuted instantiation: ir_check.c:ir_next_control
Unexecuted instantiation: ir_dump.c:ir_next_control
Unexecuted instantiation: ir_emit.c:ir_next_control
Unexecuted instantiation: ir_gcm.c:ir_next_control
Unexecuted instantiation: ir_gdb.c:ir_next_control
Unexecuted instantiation: ir_patch.c:ir_next_control
Unexecuted instantiation: ir_ra.c:ir_next_control
Unexecuted instantiation: ir_save.c:ir_next_control
Unexecuted instantiation: ir_sccp.c:ir_next_control
Unexecuted instantiation: ir_strtab.c:ir_next_control
Unexecuted instantiation: ir.c:ir_next_control
1066
1067
/*** Modification helpers ***/
1068
0
#define MAKE_NOP(_insn) do { \
1069
0
    ir_insn *__insn = _insn; \
1070
0
    __insn->optx = IR_NOP; \
1071
0
    __insn->op1 = __insn->op2 = __insn->op3 = IR_UNUSED; \
1072
0
  } while (0)
1073
1074
0
#define CLEAR_USES(_ref) do { \
1075
0
    ir_use_list *__use_list = &ctx->use_lists[_ref]; \
1076
0
    __use_list->count = 0; \
1077
0
  } while (0)
1078
1079
0
#define SWAP_REFS(_ref1, _ref2) do { \
1080
0
    ir_ref _tmp = _ref1; \
1081
0
    _ref1 = _ref2; \
1082
0
    _ref2 = _tmp; \
1083
0
  } while (0)
1084
1085
0
#define SWAP_INSNS(_insn1, _insn2) do { \
1086
0
    ir_insn *_tmp = _insn1; \
1087
0
    _insn1 = _insn2; \
1088
0
    _insn2 = _tmp; \
1089
0
  } while (0)
1090
1091
void ir_replace(ir_ctx *ctx, ir_ref ref, ir_ref new_ref);
1092
void ir_update_op(ir_ctx *ctx, ir_ref ref, uint32_t idx, ir_ref new_val);
1093
1094
/*** Iterative Optimization ***/
1095
void ir_iter_replace(ir_ctx *ctx, ir_ref ref, ir_ref new_ref, ir_bitqueue *worklist);
1096
void ir_iter_update_op(ir_ctx *ctx, ir_ref ref, uint32_t idx, ir_ref new_val, ir_bitqueue *worklist);
1097
void ir_iter_opt(ir_ctx *ctx, ir_bitqueue *worklist);
1098
1099
/*** IR Basic Blocks info ***/
1100
#define IR_IS_BB_START(op) \
1101
0
  ((ir_op_flags[op] & IR_OP_FLAG_BB_START) != 0)
1102
1103
#define IR_IS_BB_MERGE(op) \
1104
  ((op) == IR_MERGE || (op) == IR_LOOP_BEGIN)
1105
1106
#define IR_IS_BB_END(op) \
1107
0
  ((ir_op_flags[op] & IR_OP_FLAG_BB_END) != 0)
1108
1109
0
#define IR_BB_UNREACHABLE      (1<<0)
1110
0
#define IR_BB_START            (1<<1)
1111
0
#define IR_BB_ENTRY            (1<<2)
1112
0
#define IR_BB_LOOP_HEADER      (1<<3)
1113
0
#define IR_BB_IRREDUCIBLE_LOOP (1<<4)
1114
0
#define IR_BB_DESSA_MOVES      (1<<5) /* translation out of SSA requires MOVEs */
1115
0
#define IR_BB_EMPTY            (1<<6)
1116
0
#define IR_BB_PREV_EMPTY_ENTRY (1<<7)
1117
0
#define IR_BB_OSR_ENTRY_LOADS  (1<<8) /* OSR Entry-point with register LOADs   */
1118
0
#define IR_BB_LOOP_WITH_ENTRY  (1<<9) /* set together with LOOP_HEADER if there is an ENTRY in the loop */
1119
1120
/* The following flags are set by GCM */
1121
0
#define IR_BB_HAS_PHI          (1<<10)
1122
0
#define IR_BB_HAS_PI           (1<<11)
1123
0
#define IR_BB_HAS_PARAM        (1<<12)
1124
0
#define IR_BB_HAS_VAR          (1<<13)
1125
1126
/* The following flags are set by BB scheduler */
1127
0
#define IR_BB_ALIGN_LOOP       (1<<14)
1128
1129
struct _ir_block {
1130
  uint32_t flags;
1131
  ir_ref   start;              /* index of first instruction                 */
1132
  ir_ref   end;                /* index of last instruction                  */
1133
  uint32_t successors;         /* index in ir_ctx->cfg_edges[] array         */
1134
  uint32_t successors_count;
1135
  uint32_t predecessors;       /* index in ir_ctx->cfg_edges[] array         */
1136
  uint32_t predecessors_count;
1137
  union {
1138
    uint32_t dom_parent;     /* immediate dominator block                  */
1139
    uint32_t idom;           /* immediate dominator block                  */
1140
  };
1141
  union {
1142
    uint32_t dom_depth;      /* depth from the root of the dominators tree */
1143
    uint32_t postnum;        /* used temporary during tree constructon     */
1144
  };
1145
  uint32_t     dom_child;      /* first dominated blocks                     */
1146
  uint32_t     dom_next_child; /* next dominated block (linked list)         */
1147
  uint32_t     loop_header;
1148
  uint32_t     loop_depth;
1149
};
1150
1151
void ir_build_prev_refs(ir_ctx *ctx);
1152
uint32_t ir_skip_empty_target_blocks(const ir_ctx *ctx, uint32_t b);
1153
uint32_t ir_next_block(const ir_ctx *ctx, uint32_t b);
1154
void ir_get_true_false_blocks(const ir_ctx *ctx, uint32_t b, uint32_t *true_block, uint32_t *false_block);
1155
1156
IR_ALWAYS_INLINE uint32_t ir_phi_input_number(const ir_ctx *ctx, const ir_block *bb, uint32_t from)
1157
0
{
1158
0
  uint32_t n, *p;
1159
1160
0
  for (n = 0, p = &ctx->cfg_edges[bb->predecessors]; n < bb->predecessors_count; p++, n++) {
1161
0
    if (*p == from) {
1162
0
      return n + 2; /* first input is a reference to MERGE */
1163
0
    }
1164
0
  }
1165
0
  IR_ASSERT(0);
1166
0
  return 0;
1167
0
}
Unexecuted instantiation: ir_cfg.c:ir_phi_input_number
Unexecuted instantiation: ir_check.c:ir_phi_input_number
Unexecuted instantiation: ir_dump.c:ir_phi_input_number
Unexecuted instantiation: ir_emit.c:ir_phi_input_number
Unexecuted instantiation: ir_gcm.c:ir_phi_input_number
Unexecuted instantiation: ir_gdb.c:ir_phi_input_number
Unexecuted instantiation: ir_patch.c:ir_phi_input_number
Unexecuted instantiation: ir_ra.c:ir_phi_input_number
Unexecuted instantiation: ir_save.c:ir_phi_input_number
Unexecuted instantiation: ir_sccp.c:ir_phi_input_number
Unexecuted instantiation: ir_strtab.c:ir_phi_input_number
Unexecuted instantiation: ir.c:ir_phi_input_number
1168
1169
/*** Folding Engine (see ir.c and ir_fold.h) ***/
1170
typedef enum _ir_fold_action {
1171
  IR_FOLD_DO_RESTART,
1172
  IR_FOLD_DO_CSE,
1173
  IR_FOLD_DO_EMIT,
1174
  IR_FOLD_DO_COPY,
1175
  IR_FOLD_DO_CONST
1176
} ir_fold_action;
1177
1178
ir_ref ir_folding(ir_ctx *ctx, uint32_t opt, ir_ref op1, ir_ref op2, ir_ref op3, ir_insn *op1_insn, ir_insn *op2_insn, ir_insn *op3_insn);
1179
1180
/*** Alias Analyzes (see ir.c) ***/
1181
ir_ref ir_find_aliasing_load(ir_ctx *ctx, ir_ref ref, ir_type type, ir_ref addr);
1182
ir_ref ir_find_aliasing_vload(ir_ctx *ctx, ir_ref ref, ir_type type, ir_ref var);
1183
ir_ref ir_find_aliasing_store(ir_ctx *ctx, ir_ref ref, ir_ref addr, ir_ref val);
1184
ir_ref ir_find_aliasing_vstore(ir_ctx *ctx, ir_ref ref, ir_ref addr, ir_ref val);
1185
1186
/*** Predicates (see ir.c) ***/
1187
ir_ref ir_check_dominating_predicates(ir_ctx *ctx, ir_ref ref, ir_ref condition);
1188
1189
/*** IR Live Info ***/
1190
typedef ir_ref                   ir_live_pos;
1191
typedef struct _ir_use_pos       ir_use_pos;
1192
1193
0
#define IR_SUB_REFS_COUNT                4
1194
1195
0
#define IR_LOAD_SUB_REF                  0
1196
0
#define IR_USE_SUB_REF                   1
1197
0
#define IR_DEF_SUB_REF                   2
1198
0
#define IR_SAVE_SUB_REF                  3
1199
1200
0
#define IR_LIVE_POS_TO_REF(pos)          ((pos) / IR_SUB_REFS_COUNT)
1201
0
#define IR_LIVE_POS_TO_SUB_REF(pos)      ((pos) % IR_SUB_REFS_COUNT)
1202
1203
#define IR_LIVE_POS_FROM_REF(ref)        ((ref) * IR_SUB_REFS_COUNT)
1204
1205
0
#define IR_START_LIVE_POS_FROM_REF(ref)  ((ref) * IR_SUB_REFS_COUNT)
1206
0
#define IR_LOAD_LIVE_POS_FROM_REF(ref)   ((ref) * IR_SUB_REFS_COUNT + IR_LOAD_SUB_REF)
1207
0
#define IR_USE_LIVE_POS_FROM_REF(ref)    ((ref) * IR_SUB_REFS_COUNT + IR_USE_SUB_REF)
1208
0
#define IR_DEF_LIVE_POS_FROM_REF(ref)    ((ref) * IR_SUB_REFS_COUNT + IR_DEF_SUB_REF)
1209
0
#define IR_SAVE_LIVE_POS_FROM_REF(ref)   ((ref) * IR_SUB_REFS_COUNT + IR_SAVE_SUB_REF)
1210
0
#define IR_END_LIVE_POS_FROM_REF(ref)    ((ref) * IR_SUB_REFS_COUNT + IR_SUB_REFS_COUNT)
1211
1212
/* ir_use_pos.flags bits */
1213
0
#define IR_USE_MUST_BE_IN_REG            (1<<0)
1214
0
#define IR_USE_SHOULD_BE_IN_REG          (1<<1)
1215
0
#define IR_DEF_REUSES_OP1_REG            (1<<2)
1216
0
#define IR_DEF_CONFLICTS_WITH_INPUT_REGS (1<<3)
1217
1218
0
#define IR_FUSED_USE                     (1<<6)
1219
0
#define IR_PHI_USE                       (1<<7)
1220
1221
0
#define IR_OP1_MUST_BE_IN_REG            (1<<8)
1222
0
#define IR_OP1_SHOULD_BE_IN_REG          (1<<9)
1223
0
#define IR_OP2_MUST_BE_IN_REG            (1<<10)
1224
0
#define IR_OP2_SHOULD_BE_IN_REG          (1<<11)
1225
0
#define IR_OP3_MUST_BE_IN_REG            (1<<12)
1226
0
#define IR_OP3_SHOULD_BE_IN_REG          (1<<13)
1227
1228
0
#define IR_USE_FLAGS(def_flags, op_num)  (((def_flags) >> (6 + (IR_MIN((op_num), 3) * 2))) & 3)
1229
1230
struct _ir_use_pos {
1231
  uint16_t       op_num; /* 0 - means result */
1232
  int8_t         hint;
1233
  uint8_t        flags;
1234
  ir_ref         hint_ref; /* negative references are used for FUSION anf PHI */
1235
  ir_live_pos    pos;
1236
  ir_use_pos    *next;
1237
};
1238
1239
struct _ir_live_range {
1240
  ir_live_pos    start; /* inclusive */
1241
  ir_live_pos    end;   /* exclusive */
1242
  ir_live_range *next;
1243
};
1244
1245
/* ir_live_interval.flags bits (two low bits are reserved for temporary register number) */
1246
0
#define IR_LIVE_INTERVAL_FIXED           (1<<0)
1247
0
#define IR_LIVE_INTERVAL_TEMP            (1<<1)
1248
0
#define IR_LIVE_INTERVAL_HAS_HINT_REGS   (1<<2)
1249
0
#define IR_LIVE_INTERVAL_HAS_HINT_REFS   (1<<3)
1250
0
#define IR_LIVE_INTERVAL_MEM_PARAM       (1<<4)
1251
0
#define IR_LIVE_INTERVAL_MEM_LOAD        (1<<5)
1252
0
#define IR_LIVE_INTERVAL_COALESCED       (1<<6)
1253
0
#define IR_LIVE_INTERVAL_SPILL_SPECIAL   (1<<7) /* spill slot is pre-allocated in a special area (see ir_ctx.spill_reserved_base) */
1254
0
#define IR_LIVE_INTERVAL_SPILLED         (1<<8)
1255
0
#define IR_LIVE_INTERVAL_SPLIT_CHILD     (1<<9)
1256
1257
struct _ir_live_interval {
1258
  uint8_t           type;
1259
  int8_t            reg;
1260
  uint16_t          flags;
1261
  union {
1262
    int32_t       vreg;
1263
    int32_t       tmp_ref;
1264
  };
1265
  union {
1266
    int32_t       stack_spill_pos;
1267
    ir_ref        tmp_op_num;
1268
  };
1269
  ir_live_pos       end;       /* end of the last live range (cahce of ival.range.{next->}end) */
1270
  ir_live_range     range;
1271
  ir_live_range    *current_range;
1272
  ir_use_pos       *use_pos;
1273
  ir_live_interval *next;
1274
  ir_live_interval *list_next; /* linked list of active, inactive or unhandled intervals */
1275
};
1276
1277
typedef int (*emit_copy_t)(ir_ctx *ctx, uint8_t type, ir_ref from, ir_ref to);
1278
1279
int ir_gen_dessa_moves(ir_ctx *ctx, uint32_t b, emit_copy_t emit_copy);
1280
1281
#if defined(IR_REGSET_64BIT)
1282
1283
/*typedef enum _ir_reg ir_reg;*/
1284
typedef int8_t ir_reg;
1285
1286
/*** Register Sets ***/
1287
#if IR_REGSET_64BIT
1288
typedef uint64_t ir_regset;
1289
#else
1290
typedef uint32_t ir_regset;
1291
#endif
1292
1293
0
#define IR_REGSET_EMPTY 0
1294
1295
#define IR_REGSET_IS_EMPTY(regset) \
1296
0
  (regset == IR_REGSET_EMPTY)
1297
1298
#define IR_REGSET_IS_SINGLETON(regset) \
1299
  (regset && !(regset & (regset - 1)))
1300
1301
#if IR_REGSET_64BIT
1302
# define IR_REGSET(reg) \
1303
  (1ull << (reg))
1304
#else
1305
# define IR_REGSET(reg) \
1306
0
  (1u << (reg))
1307
#endif
1308
1309
#if IR_REGSET_64BIT
1310
# define IR_REGSET_INTERVAL(reg1, reg2) \
1311
  (((1ull << ((reg2) - (reg1) + 1)) - 1) << (reg1))
1312
#else
1313
# define IR_REGSET_INTERVAL(reg1, reg2) \
1314
0
  (((1u << ((reg2) - (reg1) + 1)) - 1) << (reg1))
1315
#endif
1316
1317
#define IR_REGSET_IN(regset, reg) \
1318
0
  (((regset) & IR_REGSET(reg)) != 0)
1319
1320
#define IR_REGSET_INCL(regset, reg) \
1321
0
  (regset) |= IR_REGSET(reg)
1322
1323
#define IR_REGSET_EXCL(regset, reg) \
1324
0
  (regset) &= ~IR_REGSET(reg)
1325
1326
#define IR_REGSET_UNION(set1, set2) \
1327
0
  ((set1) | (set2))
1328
1329
#define IR_REGSET_INTERSECTION(set1, set2) \
1330
0
  ((set1) & (set2))
1331
1332
#define IR_REGSET_DIFFERENCE(set1, set2) \
1333
0
  ((set1) & ~(set2))
1334
1335
#if IR_REGSET_64BIT
1336
# define IR_REGSET_FIRST(set) ((ir_reg)ir_ntzl(set))
1337
# define ir_REGSET_LAST(set)  ((ir_reg)(ir_nlzl(set)(set)^63))
1338
#else
1339
0
# define IR_REGSET_FIRST(set) ((ir_reg)ir_ntz(set))
1340
# define IR_REGSET_LAST(set)  ((ir_reg)(ir_nlz(set)^31))
1341
#endif
1342
1343
IR_ALWAYS_INLINE ir_reg ir_regset_pop_first(ir_regset *set)
1344
0
{
1345
0
  ir_reg reg;
1346
1347
0
  IR_ASSERT(!IR_REGSET_IS_EMPTY(*set));
1348
0
  reg = IR_REGSET_FIRST(*set);
1349
0
  *set = (*set) & ((*set) - 1);
1350
0
  return reg;
1351
0
}
Unexecuted instantiation: ir_emit.c:ir_regset_pop_first
Unexecuted instantiation: ir_ra.c:ir_regset_pop_first
1352
1353
#define IR_REGSET_FOREACH(set, reg) \
1354
0
  do { \
1355
0
    ir_regset _tmp = (set); \
1356
0
    while (!IR_REGSET_IS_EMPTY(_tmp)) { \
1357
0
      reg = ir_regset_pop_first(&_tmp);
1358
1359
#define IR_REGSET_FOREACH_END() \
1360
0
    } \
1361
0
  } while (0)
1362
1363
#endif /* defined(IR_REGSET_64BIT) */
1364
1365
/*** IR Register Allocation ***/
1366
/* Flags for ctx->regs[][] (low bits are used for register number itself) */
1367
typedef struct _ir_reg_alloc_data {
1368
  int32_t unused_slot_4;
1369
  int32_t unused_slot_2;
1370
  int32_t unused_slot_1;
1371
  ir_live_interval **handled;
1372
} ir_reg_alloc_data;
1373
1374
int32_t ir_allocate_spill_slot(ir_ctx *ctx, ir_type type, ir_reg_alloc_data *data);
1375
1376
IR_ALWAYS_INLINE void ir_set_alocated_reg(ir_ctx *ctx, ir_ref ref, int op_num, int8_t reg)
1377
0
{
1378
0
  int8_t *regs = ctx->regs[ref];
1379
1380
0
  if (op_num > 0) {
1381
    /* regs[] is not limited by the declared boundary 4, the real boundary checked below */
1382
0
    IR_ASSERT(op_num <= IR_MAX(3, ctx->ir_base[ref].inputs_count));
1383
0
  }
1384
0
  regs[op_num] = reg;
1385
0
}
Unexecuted instantiation: ir_cfg.c:ir_set_alocated_reg
Unexecuted instantiation: ir_check.c:ir_set_alocated_reg
Unexecuted instantiation: ir_dump.c:ir_set_alocated_reg
Unexecuted instantiation: ir_emit.c:ir_set_alocated_reg
Unexecuted instantiation: ir_gcm.c:ir_set_alocated_reg
Unexecuted instantiation: ir_gdb.c:ir_set_alocated_reg
Unexecuted instantiation: ir_patch.c:ir_set_alocated_reg
Unexecuted instantiation: ir_ra.c:ir_set_alocated_reg
Unexecuted instantiation: ir_save.c:ir_set_alocated_reg
Unexecuted instantiation: ir_sccp.c:ir_set_alocated_reg
Unexecuted instantiation: ir_strtab.c:ir_set_alocated_reg
Unexecuted instantiation: ir.c:ir_set_alocated_reg
1386
1387
IR_ALWAYS_INLINE int8_t ir_get_alocated_reg(const ir_ctx *ctx, ir_ref ref, int op_num)
1388
0
{
1389
0
  int8_t *regs = ctx->regs[ref];
1390
1391
  /* regs[] is not limited by the declared boundary 4, the real boundary checked below */
1392
0
  IR_ASSERT(op_num <= IR_MAX(3, ctx->ir_base[ref].inputs_count));
1393
0
  return regs[op_num];
1394
0
}
Unexecuted instantiation: ir_cfg.c:ir_get_alocated_reg
Unexecuted instantiation: ir_check.c:ir_get_alocated_reg
Unexecuted instantiation: ir_dump.c:ir_get_alocated_reg
Unexecuted instantiation: ir_emit.c:ir_get_alocated_reg
Unexecuted instantiation: ir_gcm.c:ir_get_alocated_reg
Unexecuted instantiation: ir_gdb.c:ir_get_alocated_reg
Unexecuted instantiation: ir_patch.c:ir_get_alocated_reg
Unexecuted instantiation: ir_ra.c:ir_get_alocated_reg
Unexecuted instantiation: ir_save.c:ir_get_alocated_reg
Unexecuted instantiation: ir_sccp.c:ir_get_alocated_reg
Unexecuted instantiation: ir_strtab.c:ir_get_alocated_reg
Unexecuted instantiation: ir.c:ir_get_alocated_reg
1395
1396
/*** IR Target Interface ***/
1397
1398
/* ctx->rules[] flags */
1399
0
#define IR_FUSED     (1U<<31) /* Insn is fused into others (code is generated as part of the fusion root) */
1400
0
#define IR_SKIPPED   (1U<<30) /* Insn is skipped (code is not generated) */
1401
0
#define IR_SIMPLE    (1U<<29) /* Insn doesn't have any target constraints */
1402
0
#define IR_FUSED_REG (1U<<28) /* Register assignemnt may be stored in ctx->fused_regs instead of ctx->regs */
1403
0
#define IR_MAY_SWAP  (1U<<27) /* Allow swapping operands for better register allocation */
1404
0
#define IR_MAY_REUSE (1U<<26) /* Result may reuse register of the source */
1405
1406
0
#define IR_RULE_MASK 0xff
1407
1408
extern const char *ir_rule_name[];
1409
1410
typedef struct _ir_target_constraints ir_target_constraints;
1411
1412
#define IR_TMP_REG(_num, _type, _start, _end) \
1413
0
  (ir_tmp_reg){.num=(_num), .type=(_type), .start=(_start), .end=(_end)}
1414
#define IR_SCRATCH_REG(_reg, _start, _end) \
1415
0
  (ir_tmp_reg){.reg=(_reg), .type=IR_VOID, .start=(_start), .end=(_end)}
1416
1417
int ir_get_target_constraints(ir_ctx *ctx, ir_ref ref, ir_target_constraints *constraints);
1418
1419
void ir_fix_stack_frame(ir_ctx *ctx);
1420
1421
/* Utility */
1422
ir_type ir_get_return_type(ir_ctx *ctx);
1423
bool ir_is_fastcall(const ir_ctx *ctx, const ir_insn *insn);
1424
bool ir_is_vararg(const ir_ctx *ctx, ir_insn *insn);
1425
1426
//#define IR_BITSET_LIVENESS
1427
1428
#endif /* IR_PRIVATE_H */