Skip to content

Commit 999999c

Browse files
committed
Fix cog label headache
1 parent f374dde commit 999999c

File tree

1 file changed

+13
-3
lines changed

1 file changed

+13
-3
lines changed

backends/asm/optimize_ir.c

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -965,6 +965,7 @@ AddSubVal(IR *ir)
965965
}
966966

967967
extern Operand *mulfunc, *unsmulfunc, *divfunc, *unsdivfunc, *muldiva, *muldivb;
968+
extern Operand *putcogreg;
968969

969970
static bool isMulDivFunc(Operand *func) {
970971
return !!func && (func == mulfunc || func == unsmulfunc || func == divfunc || func == unsdivfunc);
@@ -1226,6 +1227,8 @@ doIsDeadAfter(IR *instr, Operand *op, int level, IR **stack)
12261227
return true; // Value not actually used, goes dead.
12271228
} else if (isResult(op) && isMulDivFunc(ir->dst)) {
12281229
/* Result not affected by mul/div */
1230+
} else if (isResult(op) && putcogreg && ir->dst == putcogreg) {
1231+
/* Result not (directly) affected by wrcog */
12291232
} else if (isResult(op)) {
12301233
if (ir->cond == COND_TRUE) return true; // Results get set by functions
12311234
} else {
@@ -2934,8 +2937,16 @@ int OptimizeReturnValues(IRList *irl) {
29342937
}
29352938
// All OK, do replace
29362939
for (IR *ir=irl->head;ir;ir=ir->next) {
2937-
if (ir->src == local) ir->src = res;
2938-
if (ir->dst == local) ir->dst = res;
2940+
if (ir->src == local) {
2941+
ir->src = res;
2942+
} else if (ir->src && ir->src->kind == IMM_COG_LABEL && !strcmp(ir->src->name,local->name)) {
2943+
ir->src = NewOperand(IMM_COG_LABEL,res->name,ir->src->val);
2944+
}
2945+
if (ir->dst == local) {
2946+
ir->dst = res;
2947+
} else if (ir->dst && ir->dst->kind == IMM_COG_LABEL && !strcmp(ir->dst->name,local->name)) {
2948+
ir->dst = NewOperand(IMM_COG_LABEL,res->name,ir->dst->val);
2949+
}
29392950
}
29402951
change++;
29412952
}
@@ -4272,7 +4283,6 @@ FindNamedOperand(IRList *irl, const char *name, int val)
42724283
* we can replace it with
42734284
* mov x, y
42744285
*/
4275-
extern Operand *putcogreg;
42764286

42774287
static int
42784288
IsMovIndirect(IR *ir, IR *ir_prev, IR *ir_next)

0 commit comments

Comments
 (0)