@@ -982,10 +982,10 @@ static bool FuncUsesArgEx(Operand *func, Operand *arg, bool actually)
982
982
return !actually ;
983
983
} else if (func && func -> val && peek_into_func ) {
984
984
Function * funcObj = (Function * )func -> val ;
985
- if ((/*func->kind == IMM_COG_LABEL ||*/ func -> kind == IMM_HUB_LABEL ) && (actually || funcObj -> is_leaf || FuncData (funcObj )-> effectivelyLeaf ) && ! funcObj -> has_throw ) {
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
}
@@ -5550,10 +5550,6 @@ AnalyzeInlineEligibility(Function *f)
5550
5550
return FuncData (f )-> inliningFlags & ~prev_flags ;
5551
5551
}
5552
5552
5553
- static inline void updateMax (int * dst , int src ) {
5554
- if (* dst < src ) * dst = src ;
5555
- }
5556
-
5557
5553
static bool
5558
5554
ShouldExpandPureFunction (IR * ir ) {
5559
5555
Function * f = (Function * )ir -> aux ;
@@ -5571,6 +5567,18 @@ ShouldExpandPureFunction(IR *ir) {
5571
5567
return true;
5572
5568
}
5573
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
+
5574
5582
//
5575
5583
// expand function calls inline if appropriate
5576
5584
// returns 1 if anything was expanded
@@ -5585,14 +5593,16 @@ ExpandInlines(IRList *irl)
5585
5593
ir = irl -> head ;
5586
5594
while (ir ) {
5587
5595
ir_next = ir -> next ;
5596
+ updateMax (& FuncData (curfunc )-> maxClobberArg , getArgClobberVal (ir -> dst ));
5597
+ updateMax (& FuncData (curfunc )-> maxClobberArg , getArgClobberVal (ir -> src ));
5588
5598
if (ir -> opc == OPC_CALL ) {
5589
5599
f = (Function * )ir -> aux ;
5590
5600
if (f && ((FuncData (f )-> inliningFlags & (ASM_INLINE_SMALL_FLAG |ASM_INLINE_SINGLE_FLAG )) || ShouldExpandPureFunction (ir ))) {
5591
5601
ReplaceIRWithInline (irl , ir , f );
5592
5602
FuncData (f )-> actual_callsites -- ;
5593
5603
FuncData (f )-> got_inlined = true;
5594
- updateMax (& FuncData (curfunc )-> maxInlineArg ,f -> numparams );
5595
- updateMax (& FuncData (curfunc )-> maxInlineArg ,FuncData (f )-> maxInlineArg );
5604
+ updateMax (& FuncData (curfunc )-> maxClobberArg ,f -> numparams );
5605
+ updateMax (& FuncData (curfunc )-> maxClobberArg ,FuncData (f )-> maxClobberArg );
5596
5606
if (!f -> is_leaf && !FuncData (f )-> effectivelyLeaf ) non_inline_calls ++ ; // Non-leaf inline may contain call
5597
5607
change = 1 ;
5598
5608
} else {
@@ -5605,7 +5615,7 @@ ExpandInlines(IRList *irl)
5605
5615
ir = ir_next ;
5606
5616
}
5607
5617
// If inlining (or previous dead-code optimization...) removed all external calls, mark as leaf.
5608
- if (non_inline_calls == 0 && !curfunc -> is_leaf && !FuncData (curfunc )-> effectivelyLeaf && ! curfunc -> has_throw ) {
5618
+ if (non_inline_calls == 0 && !curfunc -> is_leaf && !FuncData (curfunc )-> effectivelyLeaf ) {
5609
5619
FuncData (curfunc )-> effectivelyLeaf = true;
5610
5620
change = true;
5611
5621
}
0 commit comments