File tree 2 files changed +26
-3
lines changed
2 files changed +26
-3
lines changed Original file line number Diff line number Diff line change @@ -1067,6 +1067,9 @@ int cse(insn_t *insn, basic_block_t *bb)
1067
1067
return 0 ;
1068
1068
1069
1069
var_t * def = NULL , * base = prev -> rs1 , * idx = prev -> rs2 ;
1070
+ if (base -> is_global || idx -> is_global )
1071
+ return 0 ;
1072
+
1070
1073
basic_block_t * b ;
1071
1074
insn_t * i = prev ;
1072
1075
for (b = bb ;; b = b -> idom ) {
@@ -1097,7 +1100,7 @@ int cse(insn_t *insn, basic_block_t *bb)
1097
1100
1098
1101
if (prev -> prev ) {
1099
1102
insn -> prev = prev -> prev ;
1100
- prev -> next = insn ;
1103
+ prev -> prev -> next = insn ;
1101
1104
} else {
1102
1105
bb -> insn_list .head = insn ;
1103
1106
insn -> prev = NULL ;
@@ -1110,7 +1113,6 @@ int cse(insn_t *insn, basic_block_t *bb)
1110
1113
1111
1114
void optimize ()
1112
1115
{
1113
- int changed = 0 ;
1114
1116
fn_t * fn ;
1115
1117
for (fn = FUNC_LIST .head ; fn ; fn = fn -> next ) {
1116
1118
/* basic block level (control flow) optimizations */
@@ -1120,7 +1122,9 @@ void optimize()
1120
1122
/* instruction level optimizations */
1121
1123
insn_t * insn ;
1122
1124
for (insn = bb -> insn_list .head ; insn ; insn = insn -> next ) {
1123
- changed |= cse (insn , bb );
1125
+ if (cse (insn , bb ))
1126
+ continue ;
1127
+
1124
1128
/* more optimizations */
1125
1129
}
1126
1130
}
Original file line number Diff line number Diff line change @@ -547,4 +547,23 @@ int main()
547
547
}
548
548
EOF
549
549
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
+
550
569
echo OK
You can’t perform that action at this time.
0 commit comments