Skip to content

Commit 393b441

Browse files
authored
Merge pull request #114 from vacantron/fix/cse
Fix unsafely CSE for global variable
2 parents 10153eb + a447f01 commit 393b441

File tree

2 files changed

+26
-3
lines changed

2 files changed

+26
-3
lines changed

src/ssa.c

+7-3
Original file line numberDiff line numberDiff line change
@@ -1067,6 +1067,9 @@ int cse(insn_t *insn, basic_block_t *bb)
10671067
return 0;
10681068

10691069
var_t *def = NULL, *base = prev->rs1, *idx = prev->rs2;
1070+
if (base->is_global || idx->is_global)
1071+
return 0;
1072+
10701073
basic_block_t *b;
10711074
insn_t *i = prev;
10721075
for (b = bb;; b = b->idom) {
@@ -1097,7 +1100,7 @@ int cse(insn_t *insn, basic_block_t *bb)
10971100

10981101
if (prev->prev) {
10991102
insn->prev = prev->prev;
1100-
prev->next = insn;
1103+
prev->prev->next = insn;
11011104
} else {
11021105
bb->insn_list.head = insn;
11031106
insn->prev = NULL;
@@ -1110,7 +1113,6 @@ int cse(insn_t *insn, basic_block_t *bb)
11101113

11111114
void optimize()
11121115
{
1113-
int changed = 0;
11141116
fn_t *fn;
11151117
for (fn = FUNC_LIST.head; fn; fn = fn->next) {
11161118
/* basic block level (control flow) optimizations */
@@ -1120,7 +1122,9 @@ void optimize()
11201122
/* instruction level optimizations */
11211123
insn_t *insn;
11221124
for (insn = bb->insn_list.head; insn; insn = insn->next) {
1123-
changed |= cse(insn, bb);
1125+
if (cse(insn, bb))
1126+
continue;
1127+
11241128
/* more optimizations */
11251129
}
11261130
}

tests/driver.sh

+19
Original file line numberDiff line numberDiff line change
@@ -547,4 +547,23 @@ int main()
547547
}
548548
EOF
549549

550+
# optimizer
551+
try_ 1 << EOF
552+
int i = 0;
553+
void func()
554+
{
555+
i = 1;
556+
}
557+
int main()
558+
{
559+
char arr[2], t;
560+
arr[0] = 0;
561+
arr[1] = 1;
562+
t = arr[i];
563+
func();
564+
t = arr[i];
565+
return t;
566+
}
567+
EOF
568+
550569
echo OK

0 commit comments

Comments
 (0)