All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alejandro Vallejo <alejandro.garciavallejo@amd.com>
To: Jan Beulich <jbeulich@suse.com>
Cc: "Andrew Cooper" <andrew.cooper3@citrix.com>,
	"Roger Pau Monné" <roger.pau@citrix.com>,
	"Jason Andryuk" <jason.andryuk@amd.com>,
	xen-devel@lists.xenproject.org
Subject: Re: [PATCH 03/12] x86: Add cpu_vendor() as a wrapper for the host's CPU vendor
Date: Thu, 12 Feb 2026 15:36:05 +0100	[thread overview]
Message-ID: <DGD24KNB0MQ8.3NT48B5EP011P@amd.com> (raw)
In-Reply-To: <b861972e-1f31-4685-b83c-27670e561332@suse.com>

On Thu Feb 12, 2026 at 11:52 AM CET, Jan Beulich wrote:
> On 06.02.2026 17:15, Alejandro Vallejo wrote:
>> Introduces various optimisations that rely on constant folding, Value
>> Range Propagation (VRP), and Dead Code Elimination (DCE) to aggressively
>> eliminate code surrounding the uses of the function.
>> 
>>   * For single-vendor+no-unknown-vendor builds returns a compile-time
>>     constant.
>>   * For all other cases it ANDs the result with the mask of compiled
>>     vendors, with the effect of performing DCE in switch cases, removing
>>     dead conditionals, etc.
>> 
>> It's difficult to reason about codegen in general in a project this big,
>> but in this case the ANDed constant combines with the values typically
>> checked against, folding into a comparison against zero. Thus, it's better
>> for codegen to AND its result with the desired compared-against vendor,
>> rather than using (in)equality operators. That way the comparison is
>> always against zero.
>> 
>>   "cpu_vendor() & (X86_VENDOR_AMD | X86_VENDOR_HYGON)"
>> 
>> turns into (cpu_vendor() & X86_VENDOR_AMD) in AMD-only builds (AND +
>> cmp with zero). Whereas this...
>> 
>>   "cpu_vendor() == X86_VENDOR_AMD"
>> 
>> forces cpu_vendor() to be ANDed and then compared to a non-zero value.
>
> Coming back to this: How does the value compared against being zero or
> non-zero matter here? As long as cpu_vendor() yields a compile-time
> constant, the compiler should be able to leverage that for DCE? And

Yes, for true single-vendor cases it doesn't matter. It matters on multivendor
cases where some vendors are off and cpu_vendor() is not a constant.

> even if it's not a compile time constant, bits masked off in principle
> allow the compiler to leverage that, too. It may of course be that
> even up-to-date compilers fall short of doing so.

There might be some of that, but there's also a non-avoidable codegen hurdle
unless you can tell the compiler your variable is a power of 2 or 0 in
multivendor cases.

cpu_vendor() == X86_VENDOR_AMD, which expands to
(boot_cpu_data.vendor & X86_ENABLED_VENDORS) == X86_VENDOR_AMD, which expands to
(boot_cpu_data.vendor & (X86_VENDOR_AMD | X86_VENDOR_INTEL) == X86_VENDOR_AMD

which produces a lot worse codegen, because now the compiler must AND the
variable with the AMD|INTEL mask, and then compare to the AMD mask, whereas
having & instead of == means the compiler can simply do a comparison with zero
and call it a day (due to the masks being folded together).

I tried creating unreachable paths in cpu_vendor() to assist the VRP pass
in noticing the variable invariant, but it just doesn't. It doesn't seem to
be sufficiently aggressive in range tracking. Bummer, because VRP is a very
unobstrusive technique for DCE that could be great if we could reliably teach it
invariants we know are held by certain variables as part of their accessors..

Cheers,
Alejandro


  reply	other threads:[~2026-02-12 14:36 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-02-06 16:15 [PATCH 00/12] const-ify vendor checks Alejandro Vallejo
2026-02-06 16:15 ` [PATCH 01/12] x86: Reject CPU policies with vendors other than the host's Alejandro Vallejo
2026-02-10  8:19   ` Roger Pau Monné
2026-02-10 10:11     ` Alejandro Vallejo
2026-02-11 15:41   ` Jan Beulich
2026-02-11 17:41     ` Alejandro Vallejo
2026-02-12  7:16       ` Jan Beulich
2026-02-06 16:15 ` [PATCH 02/12] x86: Add more granularity to the vendors in Kconfig Alejandro Vallejo
2026-02-10  8:26   ` Roger Pau Monné
2026-02-10 10:04     ` Alejandro Vallejo
2026-02-11 16:06   ` Jan Beulich
2026-02-11 17:51     ` Alejandro Vallejo
2026-02-12  7:24       ` Jan Beulich
2026-02-06 16:15 ` [PATCH 03/12] x86: Add cpu_vendor() as a wrapper for the host's CPU vendor Alejandro Vallejo
2026-02-10  8:46   ` Roger Pau Monné
2026-02-10 10:35     ` Alejandro Vallejo
2026-02-10 12:06       ` Roger Pau Monné
2026-02-11 16:04   ` Jan Beulich
2026-02-11 17:35     ` Alejandro Vallejo
2026-02-11 17:57       ` Alejandro Vallejo
2026-02-12 10:52   ` Jan Beulich
2026-02-12 14:36     ` Alejandro Vallejo [this message]
2026-02-06 16:15 ` [PATCH 04/12] x86: Migrate MSR handler vendor checks to cpu_vendor() Alejandro Vallejo
2026-02-11 16:15   ` Jan Beulich
2026-02-06 16:15 ` [PATCH 05/12] x86: Migrate spec_ctrl " Alejandro Vallejo
2026-02-12 10:49   ` Jan Beulich
2026-02-12 14:55     ` Alejandro Vallejo
2026-02-06 16:15 ` [PATCH 06/12] x86: Migrate switch " Alejandro Vallejo
2026-02-12 11:06   ` Jan Beulich
2026-02-12 15:06     ` Alejandro Vallejo
2026-02-06 16:15 ` [PATCH 07/12] x86: Have x86_emulate/ implement the single-vendor optimisation Alejandro Vallejo
2026-02-12 11:26   ` Jan Beulich
2026-02-12 15:29     ` Alejandro Vallejo
2026-02-06 16:15 ` [PATCH 07/12] x86: Migrate x86_emulate/ to use cpu_vendor() Alejandro Vallejo
2026-02-12 11:31   ` Jan Beulich
2026-02-12 15:30     ` Alejandro Vallejo
2026-02-06 16:15 ` [PATCH 08/12] x86/acpi: Migrate vendor checks to cpu_vendor() Alejandro Vallejo
2026-02-12 11:52   ` Jan Beulich
2026-02-12 15:34     ` Alejandro Vallejo
2026-02-12 15:52       ` Jan Beulich
2026-02-06 16:15 ` [PATCH 09/12] x86/pv: " Alejandro Vallejo
2026-02-06 16:15 ` [PATCH 10/12] x86/mcheck: Migrate vendor checks to use cpu_vendor() Alejandro Vallejo
2026-02-12 12:02   ` Jan Beulich
2026-02-12 12:21     ` Jan Beulich
2026-02-12 15:46     ` Alejandro Vallejo
2026-02-06 16:15 ` [PATCH 11/12] x86/cpu: " Alejandro Vallejo
2026-02-12 13:17   ` Jan Beulich
2026-02-06 16:15 ` [PATCH 12/12] x86: Migrate every remaining raw vendor check to cpu_vendor() Alejandro Vallejo
2026-02-12 13:29   ` Jan Beulich
2026-02-09  9:21 ` [PATCH 00/12] const-ify vendor checks Jan Beulich
2026-02-09 10:05   ` Alejandro Vallejo
2026-02-09 10:15     ` Jan Beulich
2026-02-09 11:56       ` Alejandro Vallejo
2026-02-09 12:52         ` Jan Beulich
2026-02-09 14:37           ` Alejandro Vallejo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=DGD24KNB0MQ8.3NT48B5EP011P@amd.com \
    --to=alejandro.garciavallejo@amd.com \
    --cc=andrew.cooper3@citrix.com \
    --cc=jason.andryuk@amd.com \
    --cc=jbeulich@suse.com \
    --cc=roger.pau@citrix.com \
    --cc=xen-devel@lists.xenproject.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.