@@ -985,7 +985,7 @@ static bool FuncUsesArgEx(Operand *func, Operand *arg, bool actually)
985
985
if ((/*func->kind == IMM_COG_LABEL ||*/ func -> kind == IMM_HUB_LABEL ) && (actually || funcObj -> is_leaf || FuncData (funcObj )-> effectivelyLeaf )) {
986
986
if (arg -> kind != REG_ARG ) return true; // subreg or smth
987
987
if (arg -> val < funcObj -> numparams ) return true; // Arg used;
988
- if (!actually && arg -> val < FuncData (funcObj )-> maxInlineArg ) return true; // Arg clobbered
988
+ if (!actually && arg -> val < FuncData (funcObj )-> maxClobberArg ) return true; // Arg clobbered
989
989
if ( ((Function * )func -> val )-> numparams < 0 ) return true; // varargs
990
990
return false; // Arg not used
991
991
}
@@ -5567,6 +5567,18 @@ ShouldExpandPureFunction(IR *ir) {
5567
5567
return true;
5568
5568
}
5569
5569
5570
+ static int getArgClobberVal (Operand * op ) {
5571
+ int offset = 0 ;
5572
+ if (!op ) return 0 ;
5573
+ if (op -> kind == REG_SUBREG ) {
5574
+ offset = op -> val ;
5575
+ op = (Operand * )op -> name ;
5576
+ }
5577
+ if (op -> kind != REG_ARG ) return 0 ;
5578
+
5579
+ return op -> val + offset + 1 ;
5580
+ }
5581
+
5570
5582
//
5571
5583
// expand function calls inline if appropriate
5572
5584
// returns 1 if anything was expanded
@@ -5581,14 +5593,16 @@ ExpandInlines(IRList *irl)
5581
5593
ir = irl -> head ;
5582
5594
while (ir ) {
5583
5595
ir_next = ir -> next ;
5596
+ updateMax (& FuncData (curfunc )-> maxClobberArg , getArgClobberVal (ir -> dst ));
5597
+ updateMax (& FuncData (curfunc )-> maxClobberArg , getArgClobberVal (ir -> src ));
5584
5598
if (ir -> opc == OPC_CALL ) {
5585
5599
f = (Function * )ir -> aux ;
5586
5600
if (f && ((FuncData (f )-> inliningFlags & (ASM_INLINE_SMALL_FLAG |ASM_INLINE_SINGLE_FLAG )) || ShouldExpandPureFunction (ir ))) {
5587
5601
ReplaceIRWithInline (irl , ir , f );
5588
5602
FuncData (f )-> actual_callsites -- ;
5589
5603
FuncData (f )-> got_inlined = true;
5590
- updateMax (& FuncData (curfunc )-> maxInlineArg ,f -> numparams );
5591
- updateMax (& FuncData (curfunc )-> maxInlineArg ,FuncData (f )-> maxInlineArg );
5604
+ updateMax (& FuncData (curfunc )-> maxClobberArg ,f -> numparams );
5605
+ updateMax (& FuncData (curfunc )-> maxClobberArg ,FuncData (f )-> maxClobberArg );
5592
5606
if (!f -> is_leaf && !FuncData (f )-> effectivelyLeaf ) non_inline_calls ++ ; // Non-leaf inline may contain call
5593
5607
change = 1 ;
5594
5608
} else {
0 commit comments