1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
/* { dg-do compile { target { ! ia32 } } } */
/* { dg-options "-O2 -mx32 -maddress-mode=long" } */
/* { dg-skip-if "different ABI" { x86_64-*-mingw* } } */
typedef union tree_node *tree;
typedef const union tree_node *const_tree;
typedef struct {
unsigned long long low;
long long high;
} double_int;
struct real_value {
};
struct real_format {
int has_signed_zero;
};
extern const struct real_format * real_format_for_mode[];
extern int real_isnegzero (const struct real_value *);
enum tree_code { REAL_CST, SSA_NAME };
struct tree_base {
enum tree_code code : 16;
union {
unsigned int version;
}
u;
};
extern void tree_check_failed (const_tree, const char *, int, const char *, ...) __attribute__ ((__noreturn__));
union tree_node {
struct tree_base base;
};
inline tree tree_check (tree __t, const char *__f, int __l, const char *__g, enum tree_code __c) {
if (((enum tree_code) (__t)->base.code) != __c)
tree_check_failed (__t, __f, __l, __g, __c, 0);
return __t;
}
struct prop_value_d {
int lattice_val;
tree value;
double_int mask;
};
typedef struct prop_value_d prop_value_t;
static prop_value_t *const_val;
static void canonicalize_float_value (prop_value_t *);
typedef void (*ssa_prop_visit_stmt_fn) (prop_value_t);
typedef void (*ssa_prop_visit_phi_fn) (void);
typedef void (*ssa_prop_fold_stmt_fn) (void *gsi);
typedef void (*ssa_prop_get_value_fn) ( prop_value_t *val);
void ssa_propagate (ssa_prop_visit_stmt_fn, ssa_prop_visit_phi_fn);
int substitute_and_fold (ssa_prop_get_value_fn, ssa_prop_fold_stmt_fn);
void ccp_fold_stmt (void *);
static void get_constant_value (prop_value_t *val) {
canonicalize_float_value (val);
}
static void canonicalize_float_value (prop_value_t *val) {
int mode;
struct real_value d;
if (val->lattice_val != 1
|| ((enum tree_code) (val->value)->base.code) != REAL_CST)
return;
mode = val->lattice_val;
if (real_format_for_mode[mode]->has_signed_zero && real_isnegzero (&d))
ccp_fold_stmt (0);
}
static void set_lattice_value (tree var, prop_value_t new_val) {
prop_value_t *old_val = &const_val[(tree_check ((var), "",
0, "",
(SSA_NAME)))->base.u.version];
canonicalize_float_value (&new_val);
canonicalize_float_value (old_val);
}
static void ccp_visit_phi_node (void) {
prop_value_t new_val;
set_lattice_value (0, new_val);
}
static void ccp_visit_stmt (prop_value_t v) {
set_lattice_value (0, v);
}
unsigned int do_ssa_ccp (void) {
ssa_propagate (ccp_visit_stmt, ccp_visit_phi_node);
substitute_and_fold (get_constant_value, ccp_fold_stmt);
return 0;
}
|