@@ -73,6 +73,17 @@ void spill_var(basic_block_t *bb, var_t *var, int idx)
73
73
REGS [idx ].polluted = 0 ;
74
74
}
75
75
76
+ /* Return the index of register for given variable. Otherwise, return -1. */
77
+ int find_in_regs (var_t * var )
78
+ {
79
+ int i ;
80
+ for (i = 0 ; i < REG_CNT ; i ++ ) {
81
+ if (REGS [i ].var == var )
82
+ return i ;
83
+ }
84
+ return -1 ;
85
+ }
86
+
76
87
void load_var (basic_block_t * bb , var_t * var , int idx )
77
88
{
78
89
ph2_ir_t * ir = var -> is_global ? bb_add_ph2_ir (bb , OP_global_load )
@@ -85,11 +96,9 @@ void load_var(basic_block_t *bb, var_t *var, int idx)
85
96
86
97
int prepare_operand (basic_block_t * bb , var_t * var , int operand_0 )
87
98
{
88
- int i ;
89
- for (i = 0 ; i < REG_CNT ; i ++ ) {
90
- if (REGS [i ].var == var )
91
- return i ;
92
- }
99
+ int i = find_in_regs (var );
100
+ if (i > -1 )
101
+ return i ;
93
102
94
103
for (i = 0 ; i < REG_CNT ; i ++ ) {
95
104
if (!REGS [i ].var ) {
@@ -125,12 +134,11 @@ int prepare_operand(basic_block_t *bb, var_t *var, int operand_0)
125
134
126
135
int prepare_dest (basic_block_t * bb , var_t * var , int operand_0 , int operand_1 )
127
136
{
128
- int i ;
129
- for (i = 0 ; i < REG_CNT ; i ++ )
130
- if (REGS [i ].var == var ) {
131
- REGS [i ].polluted = 1 ;
132
- return i ;
133
- }
137
+ int i = find_in_regs (var );
138
+ if (i > -1 ) {
139
+ REGS [i ].polluted = 1 ;
140
+ return i ;
141
+ }
134
142
135
143
for (i = 0 ; i < REG_CNT ; i ++ ) {
136
144
if (!REGS [i ].var ) {
@@ -328,7 +336,7 @@ void reg_alloc()
328
336
func_t * func ;
329
337
ph2_ir_t * ir ;
330
338
int dest , src0 , src1 ;
331
- int i , sz ;
339
+ int i , sz , clear_reg ;
332
340
333
341
refresh (bb , insn );
334
342
@@ -404,9 +412,19 @@ void reg_alloc()
404
412
ir -> dest = dest ;
405
413
break ;
406
414
case OP_assign :
407
- src0 = prepare_operand (bb , insn -> rs1 , -1 );
415
+ src0 = find_in_regs (insn -> rs1 );
416
+
417
+ /* If operand is loaded from stack, clear the original slot
418
+ * after moving.
419
+ */
420
+ if (src0 > -1 )
421
+ clear_reg = 0 ;
422
+ else {
423
+ clear_reg = 1 ;
424
+ src0 = prepare_operand (bb , insn -> rs1 , -1 );
425
+ }
408
426
dest = prepare_dest (bb , insn -> rd , src0 , -1 );
409
- ir = bb_add_ph2_ir (bb , insn -> opcode );
427
+ ir = bb_add_ph2_ir (bb , OP_assign );
410
428
ir -> src0 = src0 ;
411
429
ir -> dest = dest ;
412
430
@@ -417,6 +435,10 @@ void reg_alloc()
417
435
ir -> src1 = insn -> rd -> offset ;
418
436
REGS [dest ].polluted = 0 ;
419
437
}
438
+
439
+ if (clear_reg )
440
+ REGS [src0 ].var = NULL ;
441
+
420
442
break ;
421
443
case OP_read :
422
444
src0 = prepare_operand (bb , insn -> rs1 , -1 );
0 commit comments