ports/devel/llvm18/files/patch-backport-freebsd-397c2693fa6
Brooks Davis a4e0cb2fd9 devel/llvm18: fix host dependent compiler output for i386
Merge fixes for a couple cases where the compiler generated different
i386 code depending on the host.  In the base system this showed up as
very small differences in a couple object files in buildworld for i386
depending on the host architecture (i386 or amd64).

PR:		276961
2024-07-25 23:00:32 +01:00

43 lines
1.8 KiB
Text

commit 397c2693fa66508cb5e6b173650a1f3bc6c4dd4f
Author: Dimitry Andric <dim@FreeBSD.org>
Date: Sun Jul 21 22:37:27 2024 +0200
Fix llvm register allocator for native/cross build differences
Work around an issue in LLVM's register allocator, which can cause
slightly different i386 object files, when produced by a native or cross
build of clang.
This adds another volatile qualifier to a float variable declaration in
the weightCalcHelper() function, which otherwise produces slightly
different float results on amd64 and i386 hosts. In turn, this can lead
to different (but equivalent) register choices, and thus non-identical
assembly code.
See https://github.com/llvm/llvm-project/issues/99396 for more details.
Note this is a temporary fix, meant to merge in time for 13.4. As soon
as upstream has a permanent solution we will import that.
PR: 276961
Reported by: cperciva
MFC after: 3 days
diff --git llvm/lib/CodeGen/CalcSpillWeights.cpp llvm/lib/CodeGen/CalcSpillWeights.cpp
index f3cb7fa5af61..afde8d001f88 100644
--- llvm/lib/CodeGen/CalcSpillWeights.cpp
+++ llvm/lib/CodeGen/CalcSpillWeights.cpp
@@ -256,7 +256,12 @@ float VirtRegAuxInfo::weightCalcHelper(LiveInterval &LI, SlotIndex *Start,
return -1.0f;
}
- float Weight = 1.0f;
+ // FreeBSD customization: similar to the HWeight declaration below, add a
+ // volatile qualifier to avoid slightly different weight results on amd64
+ // and i386 hosts, and possibly choosing different registers in the register
+ // allocator. See <https://github.com/llvm/llvm-project/issues/99396> for
+ // more details.
+ volatile float Weight = 1.0f;
if (IsSpillable) {
// Get loop info for mi.
if (MI->getParent() != MBB) {