Using plain (signed) int variables as array indexes can be unhelpful on at least x86, where the compiler may see the need to insert sign-extension insns (strictly speaking it should be able to avoid that when the loop continuation condition says >= 0, but that's not generally the case even with gcc15).
Observed effects with gcc15 (will of course vary with compiler version and level of optimization): - on x86, one less preserved register in use, yet due to sub-optimal choice of register variables still a small code size increase (%r12 isn't a good choice when it's used for base-without-index addressing, as it requires a SIB byte which other registers wouldn't require), - on Arm64 code size decreases, albeit that's eaten up by padding which is being inserted ahead of a few labels, - on Arm32 code size increases for a reason I didn't fully understand (my ability to read Arm assembly is still somewhat limited). Signed-off-by: Jan Beulich <[email protected]> --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -1475,7 +1475,7 @@ static void cf_check complete_domain_des { struct domain *d = container_of(head, struct domain, rcu); struct vcpu *v; - int i; + unsigned int i; /* * Flush all state for the vCPU previously having run on the current CPU. @@ -1485,7 +1485,7 @@ static void cf_check complete_domain_des */ sync_local_execstate(); - for ( i = d->max_vcpus - 1; i >= 0; i-- ) + for ( i = d->max_vcpus; i-- > 0; ) { if ( (v = d->vcpu[i]) == NULL ) continue; @@ -1511,7 +1511,7 @@ static void cf_check complete_domain_des xfree(d->vm_event_share); #endif - for ( i = d->max_vcpus - 1; i >= 0; i-- ) + for ( i = d->max_vcpus; i-- > 0; ) if ( (v = d->vcpu[i]) != NULL ) vcpu_destroy(v);
