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 <jbeulich@suse.com>
--- 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);