| struct table_elt |
| { |
| void *exp; |
| struct table_elt *next_same_hash; |
| struct table_elt *prev_same_hash; |
| struct table_elt *next_same_value; |
| struct table_elt *prev_same_value; |
| struct table_elt *first_same_value; |
| struct table_elt *related_value; |
| int cost; |
| int mode; |
| char in_memory; |
| char in_struct; |
| char is_const; |
| char flag; |
| }; |
| |
| struct write_data |
| { |
| int sp : 1; |
| int var : 1; |
| int nonscalar : 1; |
| int all : 1; |
| }; |
| |
| int cse_rtx_addr_varies_p(void *); |
| void remove_from_table(struct table_elt *, int); |
| static struct table_elt *table[32]; |
| |
| void |
| invalidate_memory (writes) |
| struct write_data *writes; |
| { |
| register int i; |
| register struct table_elt *p, *next; |
| int all = writes->all; |
| int nonscalar = writes->nonscalar; |
| |
| for (i = 0; i < 31; i++) |
| for (p = table[i]; p; p = next) |
| { |
| next = p->next_same_hash; |
| if (p->in_memory |
| && (all |
| || (nonscalar && p->in_struct) |
| || cse_rtx_addr_varies_p (p->exp))) |
| remove_from_table (p, i); |
| } |
| } |
| |
| int cse_rtx_addr_varies_p(void *x) { return 0; } |
| void remove_from_table(struct table_elt *x, int y) { abort (); } |
| |
| int |
| main() |
| { |
| struct write_data writes; |
| struct table_elt elt; |
| |
| __builtin_memset(&elt, 0, sizeof(elt)); |
| elt.in_memory = 1; |
| table[0] = &elt; |
| |
| __builtin_memset(&writes, 0, sizeof(writes)); |
| writes.var = 1; |
| writes.nonscalar = 1; |
| |
| invalidate_memory(&writes); |
| return 0; |
| } |