Coverage Report

Created: 2026-09-14 06:25

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
  size_t alloc_size = (size_t)size * 2 * sizeof(*set->data);
499
500
0
  set->size = size;
501
0
  set->len = 0;
502
0
  IR_ASSERT(!size || alloc_size / size == 2 * sizeof(*set->data));
503
0
  set->data = (uint32_t*)ir_mem_malloc(alloc_size) + size;
504
0
#ifdef IR_DEBUG
505
  /* initialize sparse part to avoid valgrind warnings */
506
0
  memset(&IR_SPARSE_SET_SPARSE(set, size - 1), 0, size * sizeof(uint32_t));
507
0
#endif
508
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
509
510
IR_ALWAYS_INLINE void ir_sparse_set_clear(ir_sparse_set *set)
511
0
{
512
0
  set->len = 0;
513
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
514
515
IR_ALWAYS_INLINE void ir_sparse_set_free(ir_sparse_set *set)
516
0
{
517
0
  ir_mem_free(set->data - set->size);
518
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
519
520
IR_ALWAYS_INLINE bool ir_sparse_set_empty(const ir_sparse_set *set)
521
0
{
522
0
  return set->len == 0;
523
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
524
525
IR_ALWAYS_INLINE bool ir_sparse_set_in(const ir_sparse_set *set, uint32_t n)
526
0
{
527
0
  uint32_t idx = IR_SPARSE_SET_SPARSE(set, n);
528
529
0
  return idx < set->len && IR_SPARSE_SET_DENSE(set, idx) == n;
530
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
531
532
IR_ALWAYS_INLINE void ir_sparse_set_add(ir_sparse_set *set, uint32_t n)
533
0
{
534
0
  uint32_t idx;
535
536
0
  IR_ASSERT(!ir_sparse_set_in(set, n));
537
0
  idx = set->len++;
538
0
  IR_SPARSE_SET_DENSE(set, idx) = n;
539
0
  IR_SPARSE_SET_SPARSE(set, n) = idx;
540
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
541
542
IR_ALWAYS_INLINE void ir_sparse_set_del(ir_sparse_set *set, uint32_t n)
543
0
{
544
0
  uint32_t last;
545
0
546
0
  IR_ASSERT(ir_sparse_set_in(set, n));
547
0
  last = IR_SPARSE_SET_DENSE(set, set->len - 1);
548
0
  if (last != n) {
549
0
    uint32_t idx = IR_SPARSE_SET_SPARSE(set, n);
550
0
551
0
    IR_SPARSE_SET_DENSE(set, idx) = last;
552
0
    IR_SPARSE_SET_SPARSE(set, last) = idx;
553
0
554
0
  }
555
0
  set->len--;
556
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
557
558
IR_ALWAYS_INLINE uint32_t ir_sparse_set_pop(ir_sparse_set *set)
559
0
{
560
0
  if (set->len > 0) {
561
0
    set->len--;
562
0
    return IR_SPARSE_SET_DENSE(set, set->len);
563
0
  }
564
0
  return -1; /* empty set */
565
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
566
567
0
#define IR_SPARSE_SET_FOREACH(set, bit) do { \
568
0
  ir_sparse_set *_set = (set); \
569
0
  uint32_t _i, _len = _set->len; \
570
0
  uint32_t *_p = _set->data; \
571
0
  for (_i = 0; _i < _len; _p++, _i++) { \
572
0
    (bit) = *_p; \
573
574
#define IR_SPARSE_SET_FOREACH_END() \
575
0
  } \
576
0
} while (0)
577
578
/* Bit Queue */
579
typedef struct _ir_bitqueue {
580
  uint32_t  len;
581
  uint32_t  pos;
582
  ir_bitset set;
583
} ir_bitqueue;
584
585
IR_ALWAYS_INLINE void ir_bitqueue_init(ir_bitqueue *q, uint32_t n)
586
0
{
587
0
  q->len = ir_bitset_len(n);
588
0
  q->pos = q->len - 1;
589
0
  q->set = ir_bitset_malloc(n);
590
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
591
592
IR_ALWAYS_INLINE void ir_bitqueue_grow(ir_bitqueue *q, uint32_t n)
593
0
{
594
0
  uint32_t len = ir_bitset_len(n);
595
0
  IR_ASSERT(len >= q->len);
596
0
  if (len > q->len) {
597
0
    q->set = ir_mem_realloc(q->set, len * (IR_BITSET_BITS / 8));
598
0
    memset(q->set + q->len, 0, (len - q->len) * (IR_BITSET_BITS / 8));
599
0
    q->len = len;
600
0
  }
601
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
602
603
IR_ALWAYS_INLINE void ir_bitqueue_free(ir_bitqueue *q)
604
0
{
605
0
  ir_mem_free(q->set);
606
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
607
608
IR_ALWAYS_INLINE void ir_bitqueue_clear(ir_bitqueue *q)
609
0
{
610
0
  q->pos = q->len - 1;
611
0
  ir_bitset_clear(q->set, q->len);
612
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
613
614
IR_ALWAYS_INLINE int ir_bitqueue_pop(ir_bitqueue *q)
615
0
{
616
0
  uint32_t i = q->pos;
617
0
  ir_bitset_base_t x, *p = q->set + i;
618
0
  do {
619
0
    x = *p;
620
0
    if (x) {
621
0
      int bit = IR_BITSET_BITS * i + ir_bitset_ntz(x);
622
0
      *p = x & (x - 1);
623
0
      q->pos = i;
624
0
      return bit;
625
0
    }
626
0
    p++;
627
0
    i++;
628
0
  } while (i < q->len);
629
0
  q->pos = q->len - 1;
630
0
  return -1; /* empty set */
631
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
632
633
IR_ALWAYS_INLINE void ir_bitqueue_add(ir_bitqueue *q, uint32_t n)
634
0
{
635
0
  uint32_t i = n / IR_BITSET_BITS;
636
0
  q->set[i] |= IR_BITSET_ONE << (n % IR_BITSET_BITS);
637
0
  if (i < q->pos) {
638
0
    q->pos = i;
639
0
  }
640
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
641
642
IR_ALWAYS_INLINE void ir_bitqueue_del(ir_bitqueue *q, uint32_t n)
643
0
{
644
0
  ir_bitset_excl(q->set, n);
645
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
646
647
IR_ALWAYS_INLINE bool ir_bitqueue_in(const ir_bitqueue *q, uint32_t n)
648
0
{
649
0
  return ir_bitset_in(q->set, n);
650
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
651
652
/* Dynamic array of numeric references */
653
typedef struct _ir_array {
654
  ir_ref   *refs;
655
  uint32_t  size;
656
} ir_array;
657
658
void ir_array_grow(ir_array *a, uint32_t size);
659
void ir_array_insert(ir_array *a, uint32_t i, ir_ref val);
660
void ir_array_remove(ir_array *a, uint32_t i);
661
662
IR_ALWAYS_INLINE void ir_array_init(ir_array *a, uint32_t size)
663
0
{
664
0
  a->refs = ir_mem_malloc(size * sizeof(ir_ref));
665
0
  a->size = size;
666
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
667
668
IR_ALWAYS_INLINE void ir_array_free(ir_array *a)
669
0
{
670
0
  ir_mem_free(a->refs);
671
0
  a->refs = NULL;
672
0
  a->size = 0;
673
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
674
675
IR_ALWAYS_INLINE uint32_t ir_array_size(const ir_array *a)
676
0
{
677
0
  return a->size;
678
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
679
680
IR_ALWAYS_INLINE ir_ref ir_array_get(const ir_array *a, uint32_t i)
681
0
{
682
0
  return (i < a->size) ? a->refs[i] : IR_UNUSED;
683
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
684
685
IR_ALWAYS_INLINE ir_ref ir_array_at(const ir_array *a, uint32_t i)
686
0
{
687
0
  IR_ASSERT(i < a->size);
688
0
  return a->refs[i];
689
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
690
691
IR_ALWAYS_INLINE void ir_array_set(ir_array *a, uint32_t i, ir_ref val)
692
0
{
693
0
  if (i >= a->size) {
694
0
    ir_array_grow(a, i + 1);
695
0
  }
696
0
  a->refs[i] = val;
697
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
698
699
IR_ALWAYS_INLINE void ir_array_set_unchecked(ir_array *a, uint32_t i, ir_ref val)
700
0
{
701
0
  IR_ASSERT(i < a->size);
702
0
  a->refs[i] = val;
703
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
704
705
/* List/Stack of numeric references */
706
typedef struct _ir_list {
707
  ir_array a;
708
  uint32_t len;
709
} ir_list;
710
711
uint32_t ir_list_find(const ir_list *l, ir_ref val);
712
void ir_list_insert(ir_list *l, uint32_t i, ir_ref val);
713
void ir_list_remove(ir_list *l, uint32_t i);
714
715
IR_ALWAYS_INLINE void ir_list_init(ir_list *l, uint32_t size)
716
0
{
717
0
  ir_array_init(&l->a, size);
718
0
  l->len = 0;
719
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
720
721
IR_ALWAYS_INLINE void ir_list_free(ir_list *l)
722
0
{
723
0
  ir_array_free(&l->a);
724
0
  l->len = 0;
725
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
726
727
IR_ALWAYS_INLINE void ir_list_clear(ir_list *l)
728
0
{
729
0
  l->len = 0;
730
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
731
732
IR_ALWAYS_INLINE uint32_t ir_list_len(const ir_list *l)
733
0
{
734
0
  return l->len;
735
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
736
737
IR_ALWAYS_INLINE uint32_t ir_list_capasity(const ir_list *l)
738
0
{
739
0
  return ir_array_size(&l->a);
740
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
741
742
IR_ALWAYS_INLINE void ir_list_push(ir_list *l, ir_ref val)
743
0
{
744
0
  ir_array_set(&l->a, l->len++, val);
745
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
746
747
IR_ALWAYS_INLINE void ir_list_push_unchecked(ir_list *l, ir_ref val)
748
0
{
749
0
  ir_array_set_unchecked(&l->a, l->len++, val);
750
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
751
752
IR_ALWAYS_INLINE ir_ref ir_list_pop(ir_list *l)
753
0
{
754
0
  IR_ASSERT(l->len > 0);
755
0
  return ir_array_at(&l->a, --l->len);
756
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
757
758
IR_ALWAYS_INLINE ir_ref ir_list_peek(const ir_list *l)
759
0
{
760
0
  IR_ASSERT(l->len > 0);
761
0
  return ir_array_at(&l->a, l->len - 1);
762
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
763
764
IR_ALWAYS_INLINE ir_ref ir_list_at(const ir_list *l, uint32_t i)
765
0
{
766
0
  IR_ASSERT(i < l->len);
767
0
  return ir_array_at(&l->a, i);
768
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
769
770
IR_ALWAYS_INLINE void ir_list_set(ir_list *l, uint32_t i, ir_ref val)
771
0
{
772
0
  IR_ASSERT(i < l->len);
773
0
  ir_array_set_unchecked(&l->a, i, val);
774
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
775
776
/* Doesn't preserve order */
777
IR_ALWAYS_INLINE void ir_list_del(ir_list *l, uint32_t i)
778
0
{
779
0
  IR_ASSERT(i < l->len);
780
0
  l->len--;
781
0
  ir_array_set_unchecked(&l->a, i, ir_array_at(&l->a, l->len));
782
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
783
784
IR_ALWAYS_INLINE bool ir_list_contains(const ir_list *l, ir_ref val)
785
0
{
786
0
  return ir_list_find(l, val) != (uint32_t)-1;
787
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
788
789
/* Worklist (unique list) */
790
typedef struct _ir_worklist {
791
  ir_list l;
792
  ir_bitset visited;
793
} ir_worklist;
794
795
IR_ALWAYS_INLINE void ir_worklist_init(ir_worklist *w, uint32_t size)
796
0
{
797
0
  ir_list_init(&w->l, size);
798
0
  w->visited = ir_bitset_malloc(size);
799
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
800
801
IR_ALWAYS_INLINE void ir_worklist_free(ir_worklist *w)
802
0
{
803
0
  ir_list_free(&w->l);
804
0
  ir_mem_free(w->visited);
805
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
806
807
IR_ALWAYS_INLINE uint32_t ir_worklist_len(const ir_worklist *w)
808
0
{
809
0
  return ir_list_len(&w->l);
810
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
811
812
IR_ALWAYS_INLINE uint32_t ir_worklist_capasity(const ir_worklist *w)
813
0
{
814
0
  return ir_list_capasity(&w->l);
815
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
816
817
IR_ALWAYS_INLINE void ir_worklist_clear(ir_worklist *w)
818
0
{
819
0
  ir_list_clear(&w->l);
820
0
  ir_bitset_clear(w->visited, ir_bitset_len(ir_worklist_capasity(w)));
821
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
822
823
IR_ALWAYS_INLINE bool ir_worklist_push(ir_worklist *w, ir_ref val)
824
0
{
825
0
  IR_ASSERT(val >= 0 && (uint32_t)val < ir_worklist_capasity(w));
826
0
  if (ir_bitset_in(w->visited, val)) {
827
0
    return 0;
828
0
  }
829
0
  ir_bitset_incl(w->visited, val);
830
0
  IR_ASSERT(ir_list_len(&w->l) < ir_list_capasity(&w->l));
831
0
  ir_list_push_unchecked(&w->l, val);
832
0
  return 1;
833
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
834
835
IR_ALWAYS_INLINE ir_ref ir_worklist_pop(ir_worklist *w)
836
0
{
837
0
  return ir_list_pop(&w->l);
838
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
839
840
IR_ALWAYS_INLINE ir_ref ir_worklist_peek(const ir_worklist *w)
841
0
{
842
0
  return ir_list_peek(&w->l);
843
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
844
845
/* IR Hash Table */
846
0
#define IR_INVALID_IDX 0xffffffff
847
0
#define IR_INVALID_VAL 0x80000000
848
849
typedef struct _ir_hashtab_bucket {
850
  uint32_t    key;
851
  ir_ref      val;
852
  uint32_t    next;
853
} ir_hashtab_bucket;
854
855
typedef struct _ir_hashtab {
856
  void       *data;
857
  uint32_t    mask;
858
  uint32_t    size;
859
  uint32_t    count;
860
  uint32_t    pos;
861
} ir_hashtab;
862
863
void ir_hashtab_init(ir_hashtab *tab, uint32_t size);
864
void ir_hashtab_free(ir_hashtab *tab);
865
ir_ref ir_hashtab_find(const ir_hashtab *tab, uint32_t key);
866
bool ir_hashtab_add(ir_hashtab *tab, uint32_t key, ir_ref val);
867
void ir_hashtab_key_sort(ir_hashtab *tab);
868
869
/* IR Addr Table */
870
typedef struct _ir_addrtab_bucket {
871
  uint64_t    key;
872
  ir_ref      val;
873
  uint32_t    next;
874
} ir_addrtab_bucket;
875
876
void ir_addrtab_init(ir_hashtab *tab, uint32_t size);
877
void ir_addrtab_free(ir_hashtab *tab);
878
ir_ref ir_addrtab_find(const ir_hashtab *tab, uint64_t key);
879
void ir_addrtab_set(ir_hashtab *tab, uint64_t key, ir_ref val);
880
881
/*** IR OP info ***/
882
extern const uint8_t ir_type_flags[IR_LAST_TYPE];
883
extern const char *ir_type_name[IR_LAST_TYPE];
884
extern const char *ir_type_cname[IR_LAST_TYPE];
885
extern const uint8_t ir_type_size[IR_LAST_TYPE];
886
extern const uint32_t ir_op_flags[IR_LAST_OP];
887
extern const char *ir_op_name[IR_LAST_OP];
888
889
void ir_print_escaped_str(const char *s, size_t len, FILE *f);
890
891
0
#define IR_IS_CONST_OP(op)       ((op) > IR_NOP && (op) <= IR_C_FLOAT)
892
0
#define IR_IS_FOLDABLE_OP(op)    ((op) <= IR_LAST_FOLDABLE_OP)
893
0
#define IR_IS_SYM_CONST(op)      ((op) == IR_STR || (op) == IR_SYM || (op) == IR_FUNC || (op) == IR_LABEL)
894
895
ir_ref ir_const_ex(ir_ctx *ctx, ir_val val, uint8_t type, uint32_t optx);
896
897
IR_ALWAYS_INLINE bool ir_const_is_true(const ir_insn *v)
898
0
{
899
0
  if (IR_IS_SYM_CONST(v->op)) {
900
0
    return 1;
901
0
  } else if (v->type == IR_BOOL) {
902
0
    return v->val.b;
903
0
  } else if (IR_IS_TYPE_INT(v->type)) {
904
0
    return v->val.i64 != 0;
905
0
  } else if (v->type == IR_DOUBLE) {
906
0
    return v->val.d != 0.0;
907
0
  } else {
908
0
    IR_ASSERT(v->type == IR_FLOAT);
909
0
    return v->val.f != 0.0;
910
0
  }
911
0
  return 0;
912
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
913
914
IR_ALWAYS_INLINE bool ir_ref_is_true(const ir_ctx *ctx, ir_ref ref)
915
0
{
916
0
  if (ref == IR_TRUE) {
917
0
    return 1;
918
0
  } else if (ref == IR_FALSE) {
919
0
    return 0;
920
0
  } else {
921
0
    IR_ASSERT(IR_IS_CONST_REF(ref));
922
0
    return ir_const_is_true(&ctx->ir_base[ref]);
923
0
  }
924
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
925
926
/* IR OP flags */
927
0
#define IR_OP_FLAG_OPERANDS_SHIFT 3
928
929
0
#define IR_OP_FLAG_EDGES_MASK     0x03
930
0
#define IR_OP_FLAG_VAR_INPUTS     0x04
931
0
#define IR_OP_FLAG_OPERANDS_MASK  0x18
932
#define IR_OP_FLAG_MEM_MASK       ((1<<6)|(1<<7))
933
934
0
#define IR_OP_FLAG_DATA           (1<<8)
935
0
#define IR_OP_FLAG_CONTROL        (1<<9)
936
0
#define IR_OP_FLAG_MEM            (1<<10)
937
0
#define IR_OP_FLAG_COMMUTATIVE    (1<<11)
938
0
#define IR_OP_FLAG_BB_START       (1<<12)
939
0
#define IR_OP_FLAG_BB_END         (1<<13)
940
0
#define IR_OP_FLAG_TERMINATOR     (1<<14)
941
0
#define IR_OP_FLAG_PINNED         (1<<15)
942
943
0
#define IR_OP_FLAG_MEM_LOAD       ((0<<6)|(0<<7))
944
#define IR_OP_FLAG_MEM_STORE      ((0<<6)|(1<<7))
945
#define IR_OP_FLAG_MEM_CALL       ((1<<6)|(0<<7))
946
#define IR_OP_FLAG_MEM_ALLOC      ((1<<6)|(1<<7))
947
0
#define IR_OP_FLAG_MEM_MASK       ((1<<6)|(1<<7))
948
949
0
#define IR_OPND_UNUSED            0x0
950
0
#define IR_OPND_DATA              0x1
951
0
#define IR_OPND_CONTROL           0x2
952
0
#define IR_OPND_LABEL_REF         0x3
953
0
#define IR_OPND_CONTROL_DEP       0x4
954
0
#define IR_OPND_CONTROL_REF       0x5
955
0
#define IR_OPND_CONTROL_GUARD     0x6
956
0
#define IR_OPND_STR               0x7
957
0
#define IR_OPND_NUM               0x8
958
0
#define IR_OPND_PROB              0x9
959
0
#define IR_OPND_PROTO             0xa
960
961
#define IR_OP_FLAGS(op_flags, op1_flags, op2_flags, op3_flags) \
962
  ((op_flags) | ((op1_flags) << 20) | ((op2_flags) << 24) | ((op3_flags) << 28))
963
964
0
#define IR_INPUT_EDGES_COUNT(flags) (flags & IR_OP_FLAG_EDGES_MASK)
965
0
#define IR_OPERANDS_COUNT(flags)    ((flags & IR_OP_FLAG_OPERANDS_MASK) >> IR_OP_FLAG_OPERANDS_SHIFT)
966
967
0
#define IR_OP_HAS_VAR_INPUTS(flags) ((flags) & IR_OP_FLAG_VAR_INPUTS)
968
969
#define IR_OPND_KIND(flags, i) \
970
0
  (((flags) >> (16 + (4 * (((i) > 3) ? 3 : (i))))) & 0xf)
971
972
#define IR_IS_REF_OPND_KIND(kind) \
973
0
  ((kind) >= IR_OPND_DATA && (kind) <= IR_OPND_CONTROL_GUARD)
974
975
IR_ALWAYS_INLINE ir_ref ir_operands_count(const ir_ctx *ctx, const ir_insn *insn)
976
0
{
977
0
  uint32_t flags = ir_op_flags[insn->op];
978
0
  uint32_t n = IR_OPERANDS_COUNT(flags);
979
980
0
  if (UNEXPECTED(IR_OP_HAS_VAR_INPUTS(flags))) {
981
    /* MERGE, PHI, CALL, etc */
982
0
    n = insn->inputs_count;
983
0
  }
984
0
  return n;
985
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
986
987
IR_ALWAYS_INLINE ir_ref ir_input_edges_count(const ir_ctx *ctx, const ir_insn *insn)
988
0
{
989
0
  uint32_t flags = ir_op_flags[insn->op];
990
0
  uint32_t n = IR_INPUT_EDGES_COUNT(flags);
991
0
  if (UNEXPECTED(IR_OP_HAS_VAR_INPUTS(flags))) {
992
    /* MERGE, PHI, CALL, etc */
993
0
    n = insn->inputs_count;
994
0
  }
995
0
  return n;
996
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
997
998
IR_ALWAYS_INLINE uint32_t ir_insn_inputs_to_len(uint32_t inputs_count)
999
0
{
1000
0
  return 1 + (inputs_count >> 2);
1001
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
1002
1003
IR_ALWAYS_INLINE uint32_t ir_insn_len(const ir_insn *insn)
1004
0
{
1005
0
  return ir_insn_inputs_to_len(insn->inputs_count);
1006
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
1007
1008
/*** IR Context Private Flags (ir_ctx->flags2) ***/
1009
0
#define IR_CFG_HAS_LOOPS       (1<<0)
1010
0
#define IR_IRREDUCIBLE_CFG     (1<<1)
1011
0
#define IR_HAS_ALLOCA          (1<<2)
1012
0
#define IR_HAS_CALLS           (1<<3)
1013
0
#define IR_OPT_IN_SCCP         (1<<4)
1014
0
#define IR_LINEAR              (1<<5)
1015
0
#define IR_HAS_VA_START        (1<<6)
1016
0
#define IR_HAS_VA_COPY         (1<<7)
1017
0
#define IR_HAS_VA_ARG_GP       (1<<8)
1018
0
#define IR_HAS_VA_ARG_FP       (1<<9)
1019
#define IR_HAS_FP_RET_SLOT     (1<<10)
1020
0
#define IR_16B_FRAME_ALIGNMENT (1<<11)
1021
0
#define IR_HAS_BLOCK_ADDR      (1<<12)
1022
0
#define IR_PREALLOCATED_STACK  (1<<13)
1023
1024
1025
/* Temporary: MEM2SSA -> SCCP */
1026
0
#define IR_MEM2SSA_VARS        (1<<25)
1027
1028
/* Temporary: SCCP -> CFG */
1029
0
#define IR_CFG_REACHABLE       (1<<26)
1030
1031
/* Temporary: Dominators -> Loops */
1032
0
#define IR_NO_LOOPS            (1<<25)
1033
1034
/* Temporary: Live Ranges */
1035
0
#define IR_LR_HAVE_DESSA_MOVES (1<<25)
1036
1037
/* Temporary: Register Allocator */
1038
0
#define IR_RA_HAVE_SPLITS      (1<<25)
1039
0
#define IR_RA_HAVE_SPILLS      (1<<26)
1040
1041
#define IR_RESERVED_FLAG_1     (1U<<31)
1042
1043
/*** IR Use Lists ***/
1044
struct _ir_use_list {
1045
  ir_ref        refs; /* index in ir_ctx->use_edges[] array */
1046
  ir_ref        count;
1047
};
1048
1049
void ir_use_list_remove_all(ir_ctx *ctx, ir_ref def, ir_ref use);
1050
void ir_use_list_remove_one(ir_ctx *ctx, ir_ref def, ir_ref use);
1051
void ir_use_list_replace_all(ir_ctx *ctx, ir_ref def, ir_ref use, ir_ref new_use);
1052
void ir_use_list_replace_one(ir_ctx *ctx, ir_ref def, ir_ref use, ir_ref new_use);
1053
bool ir_use_list_add(ir_ctx *ctx, ir_ref def, ir_ref use);
1054
1055
IR_ALWAYS_INLINE ir_ref ir_next_control(const ir_ctx *ctx, ir_ref ref)
1056
0
{
1057
0
  ir_use_list *use_list = &ctx->use_lists[ref];
1058
0
  ir_ref n = use_list->count;
1059
0
  ir_ref *p;
1060
1061
0
  IR_ASSERT(ir_op_flags[ctx->ir_base[ref].op] & IR_OP_FLAG_CONTROL);
1062
0
  for (p = &ctx->use_edges[use_list->refs]; n > 0; p++, n--) {
1063
0
    ir_ref next = *p;
1064
0
    ir_insn *insn = &ctx->ir_base[next];
1065
1066
0
    if ((ir_op_flags[insn->op] & IR_OP_FLAG_CONTROL) && insn->op1 == ref) {
1067
0
      return next;
1068
0
    }
1069
0
  }
1070
0
  IR_ASSERT(0);
1071
0
  return IR_UNUSED;
1072
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
1073
1074
/*** Modification helpers ***/
1075
0
#define MAKE_NOP(_insn) do { \
1076
0
    ir_insn *__insn = _insn; \
1077
0
    __insn->optx = IR_NOP; \
1078
0
    __insn->op1 = __insn->op2 = __insn->op3 = IR_UNUSED; \
1079
0
  } while (0)
1080
1081
0
#define CLEAR_USES(_ref) do { \
1082
0
    ir_use_list *__use_list = &ctx->use_lists[_ref]; \
1083
0
    __use_list->count = 0; \
1084
0
  } while (0)
1085
1086
0
#define SWAP_REFS(_ref1, _ref2) do { \
1087
0
    ir_ref _tmp = _ref1; \
1088
0
    _ref1 = _ref2; \
1089
0
    _ref2 = _tmp; \
1090
0
  } while (0)
1091
1092
0
#define SWAP_INSNS(_insn1, _insn2) do { \
1093
0
    ir_insn *_tmp = _insn1; \
1094
0
    _insn1 = _insn2; \
1095
0
    _insn2 = _tmp; \
1096
0
  } while (0)
1097
1098
void ir_replace(ir_ctx *ctx, ir_ref ref, ir_ref new_ref);
1099
void ir_update_op(ir_ctx *ctx, ir_ref ref, uint32_t idx, ir_ref new_val);
1100
1101
/*** Iterative Optimization ***/
1102
void ir_iter_add_uses(ir_ctx *ctx, ir_ref ref, ir_bitqueue *worklist);
1103
void ir_iter_replace(ir_ctx *ctx, ir_ref ref, ir_ref new_ref, ir_bitqueue *worklist);
1104
void ir_iter_update_op(ir_ctx *ctx, ir_ref ref, uint32_t idx, ir_ref new_val, ir_bitqueue *worklist);
1105
void ir_iter_opt(ir_ctx *ctx, ir_bitqueue *worklist);
1106
void ir_iter_cleanup(ir_ctx *ctx);
1107
1108
/*** IR Basic Blocks info ***/
1109
#define IR_IS_BB_START(op) \
1110
0
  ((ir_op_flags[op] & IR_OP_FLAG_BB_START) != 0)
1111
1112
#define IR_IS_BB_MERGE(op) \
1113
  ((op) == IR_MERGE || (op) == IR_LOOP_BEGIN)
1114
1115
#define IR_IS_BB_END(op) \
1116
0
  ((ir_op_flags[op] & IR_OP_FLAG_BB_END) != 0)
1117
1118
0
#define IR_BB_UNREACHABLE      (1<<0)
1119
0
#define IR_BB_START            (1<<1)
1120
0
#define IR_BB_ENTRY            (1<<2)
1121
0
#define IR_BB_LOOP_HEADER      (1<<3)
1122
0
#define IR_BB_IRREDUCIBLE_LOOP (1<<4)
1123
0
#define IR_BB_DESSA_MOVES      (1<<5) /* translation out of SSA requires MOVEs */
1124
0
#define IR_BB_EMPTY            (1<<6)
1125
0
#define IR_BB_PREV_EMPTY_ENTRY (1<<7)
1126
0
#define IR_BB_OSR_ENTRY_LOADS  (1<<8) /* OSR Entry-point with register LOADs   */
1127
0
#define IR_BB_LOOP_WITH_ENTRY  (1<<9) /* set together with LOOP_HEADER if there is an ENTRY in the loop */
1128
1129
/* The following flags are set by GCM */
1130
0
#define IR_BB_HAS_PHI          (1<<10)
1131
0
#define IR_BB_HAS_PI           (1<<11)
1132
0
#define IR_BB_HAS_PARAM        (1<<12)
1133
0
#define IR_BB_HAS_VAR          (1<<13)
1134
1135
/* The following flags are set by BB scheduler */
1136
0
#define IR_BB_ALIGN_LOOP       (1<<14)
1137
1138
struct _ir_block {
1139
  uint32_t flags;
1140
  ir_ref   start;              /* index of first instruction                 */
1141
  ir_ref   end;                /* index of last instruction                  */
1142
  uint32_t successors;         /* index in ir_ctx->cfg_edges[] array         */
1143
  uint32_t successors_count;
1144
  uint32_t predecessors;       /* index in ir_ctx->cfg_edges[] array         */
1145
  uint32_t predecessors_count;
1146
  union {
1147
    uint32_t dom_parent;     /* immediate dominator block                  */
1148
    uint32_t idom;           /* immediate dominator block                  */
1149
  };
1150
  union {
1151
    uint32_t dom_depth;      /* depth from the root of the dominators tree */
1152
    uint32_t postnum;        /* used temporary for iterative Post Ordering */
1153
  };
1154
  uint32_t     dom_child;      /* first dominated blocks                     */
1155
  uint32_t     dom_next_child; /* next dominated block (linked list)         */
1156
  uint32_t     loop_header;
1157
  union {
1158
    uint32_t loop_depth;
1159
    uint32_t next_succ;      /* used temporary for iterative Post Ordering */
1160
  };
1161
};
1162
1163
void ir_build_prev_refs(ir_ctx *ctx);
1164
uint32_t ir_skip_empty_target_blocks(const ir_ctx *ctx, uint32_t b);
1165
uint32_t ir_next_block(const ir_ctx *ctx, uint32_t b);
1166
void ir_get_true_false_blocks(const ir_ctx *ctx, uint32_t b, uint32_t *true_block, uint32_t *false_block);
1167
1168
IR_ALWAYS_INLINE uint32_t ir_phi_input_number(const ir_ctx *ctx, const ir_block *bb, uint32_t from)
1169
0
{
1170
0
  uint32_t n, *p;
1171
1172
0
  for (n = 0, p = &ctx->cfg_edges[bb->predecessors]; n < bb->predecessors_count; p++, n++) {
1173
0
    if (*p == from) {
1174
0
      return n + 2; /* first input is a reference to MERGE */
1175
0
    }
1176
0
  }
1177
0
  IR_ASSERT(0);
1178
0
  return 0;
1179
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
1180
1181
/*** Folding Engine (see ir.c and ir_fold.h) ***/
1182
typedef enum _ir_fold_action {
1183
  IR_FOLD_DO_RESTART,
1184
  IR_FOLD_DO_CSE,
1185
  IR_FOLD_DO_EMIT,
1186
  IR_FOLD_DO_COPY,
1187
  IR_FOLD_DO_CONST
1188
} ir_fold_action;
1189
1190
ir_ref ir_folding(ir_ctx *ctx, uint32_t opt, ir_ref op1, ir_ref op2, ir_ref op3,
1191
                  const ir_insn *op1_insn, const ir_insn *op2_insn, const ir_insn *op3_insn);
1192
1193
/*** Alias Analyzes (see ir.c) ***/
1194
ir_ref ir_find_aliasing_load(const ir_ctx *ctx, ir_ref ref, ir_type type, ir_ref addr);
1195
ir_ref ir_find_aliasing_vload(const ir_ctx *ctx, ir_ref ref, ir_type type, ir_ref var);
1196
ir_ref ir_find_aliasing_store(ir_ctx *ctx, ir_ref ref, ir_ref addr, ir_ref val);
1197
ir_ref ir_find_aliasing_vstore(ir_ctx *ctx, ir_ref ref, ir_ref addr, ir_ref val);
1198
1199
/*** Predicates (see ir.c) ***/
1200
ir_ref ir_check_dominating_predicates(const ir_ctx *ctx, ir_ref ref, ir_ref condition);
1201
1202
/*** IR Live Info ***/
1203
typedef ir_ref                   ir_live_pos;
1204
typedef struct _ir_use_pos       ir_use_pos;
1205
1206
0
#define IR_SUB_REFS_COUNT                4
1207
1208
0
#define IR_LOAD_SUB_REF                  0
1209
0
#define IR_USE_SUB_REF                   1
1210
0
#define IR_DEF_SUB_REF                   2
1211
0
#define IR_SAVE_SUB_REF                  3
1212
1213
0
#define IR_LIVE_POS_TO_REF(pos)          ((pos) / IR_SUB_REFS_COUNT)
1214
0
#define IR_LIVE_POS_TO_SUB_REF(pos)      ((pos) % IR_SUB_REFS_COUNT)
1215
1216
#define IR_LIVE_POS_FROM_REF(ref)        ((ref) * IR_SUB_REFS_COUNT)
1217
1218
0
#define IR_START_LIVE_POS_FROM_REF(ref)  ((ref) * IR_SUB_REFS_COUNT)
1219
0
#define IR_LOAD_LIVE_POS_FROM_REF(ref)   ((ref) * IR_SUB_REFS_COUNT + IR_LOAD_SUB_REF)
1220
0
#define IR_USE_LIVE_POS_FROM_REF(ref)    ((ref) * IR_SUB_REFS_COUNT + IR_USE_SUB_REF)
1221
0
#define IR_DEF_LIVE_POS_FROM_REF(ref)    ((ref) * IR_SUB_REFS_COUNT + IR_DEF_SUB_REF)
1222
0
#define IR_SAVE_LIVE_POS_FROM_REF(ref)   ((ref) * IR_SUB_REFS_COUNT + IR_SAVE_SUB_REF)
1223
0
#define IR_END_LIVE_POS_FROM_REF(ref)    ((ref) * IR_SUB_REFS_COUNT + IR_SUB_REFS_COUNT)
1224
1225
/* ir_use_pos.flags bits */
1226
0
#define IR_USE_MUST_BE_IN_REG            (1<<0)
1227
0
#define IR_USE_SHOULD_BE_IN_REG          (1<<1)
1228
0
#define IR_DEF_REUSES_OP1_REG            (1<<2)
1229
0
#define IR_DEF_CONFLICTS_WITH_INPUT_REGS (1<<3)
1230
0
#define IR_EXTEND_INPUTS_TO_NEXT         (1<<4) /* used for SNAPSHOT followed by GUARD */
1231
1232
0
#define IR_FUSED_USE                     (1<<6)
1233
0
#define IR_PHI_USE                       (1<<7)
1234
1235
0
#define IR_OP1_MUST_BE_IN_REG            (1<<8)
1236
0
#define IR_OP1_SHOULD_BE_IN_REG          (1<<9)
1237
0
#define IR_OP2_MUST_BE_IN_REG            (1<<10)
1238
0
#define IR_OP2_SHOULD_BE_IN_REG          (1<<11)
1239
0
#define IR_OP3_MUST_BE_IN_REG            (1<<12)
1240
0
#define IR_OP3_SHOULD_BE_IN_REG          (1<<13)
1241
1242
0
#define IR_USE_FLAGS(def_flags, op_num)  (((def_flags) >> (6 + (IR_MIN((op_num), 3) * 2))) & 3)
1243
1244
struct _ir_use_pos {
1245
  uint16_t       op_num; /* 0 - means result */
1246
  int8_t         hint;
1247
  uint8_t        flags;
1248
  ir_ref         hint_ref; /* negative references are used for FUSION anf PHI */
1249
  ir_live_pos    pos;
1250
  ir_use_pos    *next;
1251
};
1252
1253
struct _ir_live_range {
1254
  ir_live_pos    start; /* inclusive */
1255
  ir_live_pos    end;   /* exclusive */
1256
  ir_live_range *next;
1257
};
1258
1259
/* ir_live_interval.flags bits (two low bits are reserved for temporary register number) */
1260
0
#define IR_LIVE_INTERVAL_FIXED           (1<<0)
1261
0
#define IR_LIVE_INTERVAL_TEMP            (1<<1)
1262
0
#define IR_LIVE_INTERVAL_HAS_HINT_REGS   (1<<2)
1263
0
#define IR_LIVE_INTERVAL_HAS_HINT_REFS   (1<<3)
1264
0
#define IR_LIVE_INTERVAL_MEM_PARAM       (1<<4)
1265
0
#define IR_LIVE_INTERVAL_COALESCED       (1<<5)
1266
0
#define IR_LIVE_INTERVAL_SPILL_SPECIAL   (1<<6) /* spill slot is pre-allocated in a special area (see ir_ctx.spill_reserved_base) */
1267
0
#define IR_LIVE_INTERVAL_SPILLED         (1<<7)
1268
0
#define IR_LIVE_INTERVAL_SPLIT_CHILD     (1<<8)
1269
1270
struct _ir_live_interval {
1271
  uint8_t           type;
1272
  int8_t            reg;
1273
  uint16_t          flags;
1274
  union {
1275
    int32_t       vreg;
1276
    int32_t       tmp_ref;
1277
  };
1278
  union {
1279
    int32_t       stack_spill_pos;
1280
    ir_ref        tmp_op_num;
1281
  };
1282
  ir_live_pos       end;       /* end of the last live range (cahce of ival.range.{next->}end) */
1283
  ir_live_range     range;
1284
  ir_live_range    *current_range;
1285
  ir_use_pos       *use_pos;
1286
  ir_live_interval *next;
1287
  ir_live_interval *list_next; /* linked list of active, inactive or unhandled intervals */
1288
};
1289
1290
typedef int (*emit_copy_t)(ir_ctx *ctx, uint8_t type, ir_ref from, ir_ref to, void *data);
1291
1292
int ir_gen_dessa_moves(ir_ctx *ctx, uint32_t b, emit_copy_t emit_copy, void *data);
1293
1294
#if defined(IR_REGSET_64BIT)
1295
1296
/*typedef enum _ir_reg ir_reg;*/
1297
typedef int8_t ir_reg;
1298
1299
/*** Register Sets ***/
1300
#if IR_REGSET_64BIT
1301
typedef uint64_t ir_regset;
1302
#else
1303
typedef uint32_t ir_regset;
1304
#endif
1305
1306
0
#define IR_REGSET_EMPTY 0
1307
1308
#define IR_REGSET_IS_EMPTY(regset) \
1309
0
  (regset == IR_REGSET_EMPTY)
1310
1311
#define IR_REGSET_IS_SINGLETON(regset) \
1312
  (regset && !(regset & (regset - 1)))
1313
1314
#if IR_REGSET_64BIT
1315
# define IR_REGSET(reg) \
1316
  (1ull << (reg))
1317
#else
1318
# define IR_REGSET(reg) \
1319
0
  (1u << (reg))
1320
#endif
1321
1322
#if IR_REGSET_64BIT
1323
# define IR_REGSET_INTERVAL(reg1, reg2) \
1324
  (((1ull << ((reg2) - (reg1) + 1)) - 1) << (reg1))
1325
#else
1326
# define IR_REGSET_INTERVAL(reg1, reg2) \
1327
  (((1u << ((reg2) - (reg1) + 1)) - 1) << (reg1))
1328
#endif
1329
1330
#define IR_REGSET_IN(regset, reg) \
1331
0
  (((regset) & IR_REGSET(reg)) != 0)
1332
1333
#define IR_REGSET_INCL(regset, reg) \
1334
0
  (regset) |= IR_REGSET(reg)
1335
1336
#define IR_REGSET_EXCL(regset, reg) \
1337
0
  (regset) &= ~IR_REGSET(reg)
1338
1339
#define IR_REGSET_UNION(set1, set2) \
1340
0
  ((set1) | (set2))
1341
1342
#define IR_REGSET_INTERSECTION(set1, set2) \
1343
0
  ((set1) & (set2))
1344
1345
#define IR_REGSET_DIFFERENCE(set1, set2) \
1346
0
  ((set1) & ~(set2))
1347
1348
#if IR_REGSET_64BIT
1349
# define IR_REGSET_FIRST(set) ((ir_reg)ir_ntzl(set))
1350
# define ir_REGSET_LAST(set)  ((ir_reg)(ir_nlzl(set)(set)^63))
1351
#else
1352
0
# define IR_REGSET_FIRST(set) ((ir_reg)ir_ntz(set))
1353
# define IR_REGSET_LAST(set)  ((ir_reg)(ir_nlz(set)^31))
1354
#endif
1355
1356
IR_ALWAYS_INLINE ir_reg ir_regset_pop_first(ir_regset *set)
1357
0
{
1358
0
  ir_reg reg;
1359
1360
0
  IR_ASSERT(!IR_REGSET_IS_EMPTY(*set));
1361
0
  reg = IR_REGSET_FIRST(*set);
1362
0
  *set = (*set) & ((*set) - 1);
1363
0
  return reg;
1364
0
}
Unexecuted instantiation: ir_emit.c:ir_regset_pop_first
Unexecuted instantiation: ir_ra.c:ir_regset_pop_first
1365
1366
#define IR_REGSET_FOREACH(set, reg) \
1367
0
  do { \
1368
0
    ir_regset _tmp = (set); \
1369
0
    while (!IR_REGSET_IS_EMPTY(_tmp)) { \
1370
0
      reg = ir_regset_pop_first(&_tmp);
1371
1372
#define IR_REGSET_FOREACH_END() \
1373
0
    } \
1374
0
  } while (0)
1375
1376
#endif /* defined(IR_REGSET_64BIT) */
1377
1378
/*** Calling Conventions ***/
1379
#if defined(IR_REGSET_64BIT)
1380
struct _ir_call_conv_dsc {
1381
  bool          cleanup_stack_by_callee: 1; /* use "retn $size" to return */
1382
  bool          pass_struct_by_val: 1;      /* pass aggreagate by value, otherwise their copies are passed by ref */
1383
  bool          sysv_varargs: 1;            /* Use SysV varargs ABI */
1384
  bool          shadow_param_regs: 1;       /* registers for INT and FP parametrs shadow each other */
1385
                                            /* (WIN64: 1-st arg is passed in %rcx/%xmm0, 2-nd in %rdx/%xmm1) */
1386
  uint8_t       shadow_store_size;          /* reserved stack space to keep arguemnts passed in registers (WIN64) */
1387
  uint8_t       int_param_regs_count;       /* number of registers for INT parameters */
1388
  uint8_t       fp_param_regs_count;        /* number of registers for FP parameters */
1389
  int8_t        int_ret_reg;                /* register to return INT value */
1390
  int8_t        fp_ret_reg;                 /* register to return FP value */
1391
  int8_t        fp_varargs_reg;             /* register to pass number of fp register arguments into vararg func */
1392
  int8_t        scratch_reg;                /* pseudo register to reffer srcatch regset (clobbered by call) */
1393
  const int8_t *int_param_regs;             /* registers for INT parameters */
1394
  const int8_t *fp_param_regs;              /* registers for FP parameters */
1395
  ir_regset     preserved_regs;             /* preserved or callee-saved registers */
1396
};
1397
1398
extern const ir_regset ir_scratch_regset[];
1399
#endif
1400
1401
typedef struct _ir_call_conv_dsc ir_call_conv_dsc;
1402
1403
const ir_call_conv_dsc *ir_get_call_conv_dsc(uint32_t flags);
1404
1405
/*** IR Register Allocation ***/
1406
/* Flags for ctx->regs[][] (low bits are used for register number itself) */
1407
typedef struct _ir_reg_alloc_data {
1408
  const ir_call_conv_dsc *cc;
1409
  int32_t unused_slot_4;
1410
  int32_t unused_slot_2;
1411
  int32_t unused_slot_1;
1412
  ir_live_interval **handled;
1413
} ir_reg_alloc_data;
1414
1415
int32_t ir_allocate_spill_slot(ir_ctx *ctx, ir_type type);
1416
1417
IR_ALWAYS_INLINE void ir_set_alocated_reg(ir_ctx *ctx, ir_ref ref, int op_num, int8_t reg)
1418
0
{
1419
0
  int8_t *regs = ctx->regs[ref];
1420
1421
0
  if (op_num > 0) {
1422
    /* regs[] is not limited by the declared boundary 4, the real boundary checked below */
1423
0
    IR_ASSERT(op_num <= IR_MAX(3, ctx->ir_base[ref].inputs_count));
1424
0
  }
1425
0
  regs[op_num] = reg;
1426
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
1427
1428
IR_ALWAYS_INLINE int8_t ir_get_alocated_reg(const ir_ctx *ctx, ir_ref ref, int op_num)
1429
0
{
1430
0
  int8_t *regs = ctx->regs[ref];
1431
1432
  /* regs[] is not limited by the declared boundary 4, the real boundary checked below */
1433
0
  IR_ASSERT(op_num <= IR_MAX(3, ctx->ir_base[ref].inputs_count));
1434
0
  return regs[op_num];
1435
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
1436
1437
/*** IR Target Interface ***/
1438
1439
/* ctx->rules[] flags */
1440
0
#define IR_FUSED     (1U<<31) /* Insn is fused into others (code is generated as part of the fusion root) */
1441
0
#define IR_SKIPPED   (1U<<30) /* Insn is skipped (code is not generated) */
1442
0
#define IR_SIMPLE    (1U<<29) /* Insn doesn't have any target constraints */
1443
0
#define IR_FUSED_REG (1U<<28) /* Register assignemnt may be stored in ctx->fused_regs instead of ctx->regs */
1444
0
#define IR_MAY_SWAP  (1U<<27) /* Allow swapping operands for better register allocation */
1445
0
#define IR_MAY_REUSE (1U<<26) /* Result may reuse register of the source */
1446
1447
0
#define IR_RULE_MASK 0xff
1448
1449
#define IR_MAX_REG_ARGS 64
1450
1451
extern const char *ir_rule_name[];
1452
1453
typedef struct _ir_tmp_reg {
1454
  union {
1455
    uint8_t num;
1456
    int8_t  reg;
1457
  };
1458
  uint8_t     type;
1459
  int8_t      start;
1460
  int8_t      end;
1461
} ir_tmp_reg;
1462
1463
typedef struct {
1464
  int8_t      def_reg;
1465
  uint8_t     tmps_count;
1466
  uint8_t     hints_count;
1467
  ir_tmp_reg  tmp_regs[3];
1468
  int8_t      hints[IR_MAX_REG_ARGS + 3];
1469
} ir_target_constraints;
1470
1471
#define IR_TMP_REG(_num, _type, _start, _end) \
1472
0
  (ir_tmp_reg){.num=(_num), .type=(_type), .start=(_start), .end=(_end)}
1473
#define IR_SCRATCH_REG(_reg, _start, _end) \
1474
0
  (ir_tmp_reg){.reg=(_reg), .type=IR_VOID, .start=(_start), .end=(_end)}
1475
1476
int ir_get_target_constraints(ir_ctx *ctx, ir_ref ref, ir_target_constraints *constraints);
1477
1478
void ir_fix_stack_frame(ir_ctx *ctx);
1479
1480
/* Utility */
1481
const ir_proto_t *ir_call_proto(const ir_ctx *ctx, const ir_insn *insn);
1482
1483
//#define IR_BITSET_LIVENESS
1484
1485
#endif /* IR_PRIVATE_H */