diff options
author | Arthur Eubanks <aeubanks@google.com> | 2023-12-14 09:28:27 -0800 |
---|---|---|
committer | Arthur Eubanks <aeubanks@google.com> | 2023-12-14 09:49:35 -0800 |
commit | ec92d74a0ef89b9dd46aee6ec8aca6bfd3c66a54 (patch) | |
tree | a632502802e5bc0c9570c459fa24b8ade0d6cef8 /llvm/lib/Target/TargetMachine.cpp | |
parent | f976719fb2cb23364957e5993f7fc3684ee15391 (diff) | |
download | llvm-ec92d74a0ef89b9dd46aee6ec8aca6bfd3c66a54.zip llvm-ec92d74a0ef89b9dd46aee6ec8aca6bfd3c66a54.tar.gz llvm-ec92d74a0ef89b9dd46aee6ec8aca6bfd3c66a54.tar.bz2 |
Reland [X86] Respect code models more when determining if a global reference can fit in 32 bits (#75386)
For non-GlobalValue references, the small and medium code models can use
32 bit constants.
For GlobalValue references, use TargetMachine::isLargeGlobalObject().
Look through aliases for determining if a GlobalValue is small or large.
Even the large code model can reference small objects with 32 bit
constants as long as we're in no-pic mode, or if the reference is offset
from the GOT.
Original commit broke the build...
Diffstat (limited to 'llvm/lib/Target/TargetMachine.cpp')
-rw-r--r-- | llvm/lib/Target/TargetMachine.cpp | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/llvm/lib/Target/TargetMachine.cpp b/llvm/lib/Target/TargetMachine.cpp index 5428e14..3f96bd3 100644 --- a/llvm/lib/Target/TargetMachine.cpp +++ b/llvm/lib/Target/TargetMachine.cpp @@ -39,10 +39,16 @@ TargetMachine::TargetMachine(const Target &T, StringRef DataLayoutString, TargetMachine::~TargetMachine() = default; -bool TargetMachine::isLargeGlobalObject(const GlobalObject *GO) const { +bool TargetMachine::isLargeGlobalValue(const GlobalValue *GVal) const { if (getTargetTriple().getArch() != Triple::x86_64) return false; + auto *GO = GVal->getAliaseeObject(); + + // Be conservative if we can't find an underlying GlobalObject. + if (!GO) + return true; + auto *GV = dyn_cast<GlobalVariable>(GO); // Functions/GlobalIFuncs are only large under the large code model. |