@@ -965,6 +965,7 @@ AddSubVal(IR *ir)
965965}
966966
967967extern Operand * mulfunc , * unsmulfunc , * divfunc , * unsdivfunc , * muldiva , * muldivb ;
968+ extern Operand * putcogreg ;
968969
969970static 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
42774287static int
42784288IsMovIndirect (IR * ir , IR * ir_prev , IR * ir_next )
0 commit comments