Author: Kristina Bessonova Date: 2026-09-11T18:49:20+02:00 New Revision: b777f1e0d3f306075cb1fec90f3c7aa012766996
URL: https://github.com/llvm/llvm-project/commit/b777f1e0d3f306075cb1fec90f3c7aa012766996 DIFF: https://github.com/llvm/llvm-project/commit/b777f1e0d3f306075cb1fec90f3c7aa012766996.diff LOG: Revert "[AArch64][GlobalISel] Add support for TLS for ELF (#220236)" This reverts commit 94dcd357325f05a47537794bae692998ec059cdf. Added: Modified: llvm/lib/Target/AArch64/AArch64ISelLowering.cpp llvm/lib/Target/AArch64/AArch64ISelLowering.h llvm/lib/Target/AArch64/AArch64TargetMachine.cpp llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp llvm/test/CodeGen/AArch64/O3-pipeline.ll llvm/test/CodeGen/AArch64/arm64-tls-dynamics.ll llvm/test/CodeGen/AArch64/arm64-tls-initial-exec.ll llvm/test/CodeGen/AArch64/arm64-tls-local-exec.ll llvm/test/CodeGen/AArch64/ptrauth-arm64-tls-dynamics.ll Removed: ################################################################################ diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp index 4f53df7dcff20..05b79f99610ae 100644 --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp @@ -11796,17 +11796,26 @@ SDValue AArch64TargetLowering::LowerELFTLSDescCallSeq(SDValue SymAddr, return DAG.getCopyFromReg(Chain, DL, AArch64::X0, PtrVT, Glue); } -TLSModel::Model AArch64::getELFTLSModel(const GlobalValue *GV, - const TargetMachine &TM, - bool HasELFSignedGOT) { - TLSModel::Model Model = - HasELFSignedGOT ? TLSModel::GeneralDynamic : TM.getTLSModel(GV); +SDValue +AArch64TargetLowering::LowerELFGlobalTLSAddress(SDValue Op, + SelectionDAG &DAG) const { + assert(Subtarget->isTargetELF() && "This function expects an ELF target"); - if (!EnableAArch64ELFLocalDynamicTLSGeneration && - Model == TLSModel::LocalDynamic) - Model = TLSModel::GeneralDynamic; + const GlobalAddressSDNode *GA = cast<GlobalAddressSDNode>(Op); + AArch64FunctionInfo *MFI = + DAG.getMachineFunction().getInfo<AArch64FunctionInfo>(); + + TLSModel::Model Model = MFI->hasELFSignedGOT() + ? TLSModel::GeneralDynamic + : getTargetMachine().getTLSModel(GA->getGlobal()); - if (TM.getCodeModel() == CodeModel::Large && Model != TLSModel::LocalExec) + if (!EnableAArch64ELFLocalDynamicTLSGeneration) { + if (Model == TLSModel::LocalDynamic) + Model = TLSModel::GeneralDynamic; + } + + if (getTargetMachine().getCodeModel() == CodeModel::Large && + Model != TLSModel::LocalExec) report_fatal_error("ELF TLS only supported in small memory model or " "in local exec TLS model"); // Different choices can be made for the maximum size of the TLS area for a @@ -11816,20 +11825,6 @@ TLSModel::Model AArch64::getELFTLSModel(const GlobalValue *GV, // than local exec. We currently generate the same code as small for tiny, // which may be larger than needed. - return Model; -} - -SDValue -AArch64TargetLowering::LowerELFGlobalTLSAddress(SDValue Op, - SelectionDAG &DAG) const { - assert(Subtarget->isTargetELF() && "This function expects an ELF target"); - - const GlobalAddressSDNode *GA = cast<GlobalAddressSDNode>(Op); - AArch64FunctionInfo *MFI = - DAG.getMachineFunction().getInfo<AArch64FunctionInfo>(); - TLSModel::Model Model = AArch64::getELFTLSModel( - GA->getGlobal(), getTargetMachine(), MFI->hasELFSignedGOT()); - SDValue TPOff; EVT PtrVT = getPointerTy(DAG.getDataLayout()); SDLoc DL(Op); diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.h b/llvm/lib/Target/AArch64/AArch64ISelLowering.h index 1f4ea02e80401..1b622e93480ec 100644 --- a/llvm/lib/Target/AArch64/AArch64ISelLowering.h +++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.h @@ -981,11 +981,6 @@ namespace AArch64 { FastISel *createFastISel(FunctionLoweringInfo &funcInfo, const TargetLibraryInfo *libInfo, const LibcallLoweringInfo *libcallLowering); - -// Determine the effective TLS model for an ELF global, applying -// AArch64-specific restrictions and configuration. -TLSModel::Model getELFTLSModel(const GlobalValue *GV, const TargetMachine &TM, - bool HasELFSignedGOT); } // end namespace AArch64 } // end namespace llvm diff --git a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp index 004ff0fb97bbf..2e833f6729737 100644 --- a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp +++ b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp @@ -770,6 +770,13 @@ void AArch64PassConfig::addCodeGenPrepare() { bool AArch64PassConfig::addInstSelector() { addPass(createAArch64ISelDag(getAArch64TargetMachine(), getOptLevel())); + + // For ELF, cleanup any local-dynamic TLS accesses (i.e. combine as many + // references to _TLS_MODULE_BASE_ as possible. + if (TM->getTargetTriple().isOSBinFormatELF() && + getOptLevel() != CodeGenOptLevel::None) + addPass(createAArch64CleanupLocalDynamicTLSPass()); + return false; } @@ -815,17 +822,10 @@ bool AArch64PassConfig::addGlobalInstructionSelect() { addPass(new InstructionSelectLegacy(getOptLevel())); if (!getAArch64TargetMachine().isGlobalISelOptNone()) addPass(createAArch64PostSelectOptimize()); - return false; } void AArch64PassConfig::addMachineSSAOptimization() { - // For ELF, cleanup any local-dynamic TLS accesses - // (i.e. combine as many references to _TLS_MODULE_BASE_ as possible. - if (TM->getTargetTriple().isOSBinFormatELF() && - getOptLevel() != CodeGenOptLevel::None) - addPass(createAArch64CleanupLocalDynamicTLSPass()); - if (TM->getOptLevel() != CodeGenOptLevel::None) addPass(createMachineSMEABIPass(TM->getOptLevel())); diff --git a/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp b/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp index 0499d7771683e..442d061e71cb8 100644 --- a/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp +++ b/llvm/lib/Target/AArch64/GISel/AArch64InstructionSelector.cpp @@ -223,10 +223,6 @@ class AArch64InstructionSelector : public InstructionSelector { bool selectIntrinsic(MachineInstr &I, MachineRegisterInfo &MRI); bool selectJumpTable(MachineInstr &I, MachineRegisterInfo &MRI); bool selectBrJT(MachineInstr &I, MachineRegisterInfo &MRI); - bool selectTLSGlobalValueELF(MachineInstr &I, MachineRegisterInfo &MRI); - bool selectTLSLocalExecELF(const GlobalValue *GV, MachineInstr &I, - MachineRegisterInfo &MRI); - bool selectTLSGlobalValueMachO(MachineInstr &I, MachineRegisterInfo &MRI); bool selectTLSGlobalValue(MachineInstr &I, MachineRegisterInfo &MRI); bool selectPtrAuthGlobalValue(MachineInstr &I, MachineRegisterInfo &MRI) const; @@ -2909,9 +2905,12 @@ bool AArch64InstructionSelector::select(MachineInstr &I) { assert(OpFlags == AArch64II::MO_GOT); } else { GV = I.getOperand(1).getGlobal(); - if (GV->isThreadLocal()) + if (GV->isThreadLocal()) { + // We don't support instructions with emulated TLS variables yet + if (TM.useEmulatedTLS()) + return false; return selectTLSGlobalValue(I, MRI); - + } OpFlags = STI.ClassifyGlobalReference(GV, TM); } @@ -3739,165 +3738,18 @@ bool AArch64InstructionSelector::selectJumpTable(MachineInstr &I, return true; } -bool AArch64InstructionSelector::selectTLSLocalExecELF( - const GlobalValue *GV, MachineInstr &I, MachineRegisterInfo &MRI) { - auto ConstrainRegOps = [&](MachineInstrBuilder MIB) { - constrainSelectedInstRegOperands(*MIB, TII, TRI, RBI); - }; - Register ThreadBase = MRI.createGenericVirtualRegister(LLT::pointer(0, 64)); - ConstrainRegOps(MIB.buildInstr(AArch64::MOVbaseTLS, {ThreadBase}, {})); - - switch (MF->getTarget().Options.TLSSize) { - default: - llvm_unreachable("Unexpected TLS size"); - case 12: { - // add x0, x0, :tprel_lo12:a - ConstrainRegOps( - MIB.buildInstr(AArch64::ADDXri, {I.getOperand(0).getReg()}, - {ThreadBase}) - .addGlobalAddress(GV, 0, AArch64II::MO_TLS | AArch64II::MO_PAGEOFF) - .addImm(0)); - break; - } - case 24: { - // add x0, x0, :tprel_hi12:a - // add x0, x0, :tprel_lo12_nc:a - Register Addr = MRI.createVirtualRegister(&AArch64::GPR64RegClass); - ConstrainRegOps( - MIB.buildInstr(AArch64::ADDXri, {Addr}, {ThreadBase}) - .addGlobalAddress(GV, 0, AArch64II::MO_TLS | AArch64II::MO_HI12) - .addImm(0)); - ConstrainRegOps( - MIB.buildInstr(AArch64::ADDXri, {I.getOperand(0).getReg()}, {Addr}) - .addGlobalAddress(GV, 0, - AArch64II::MO_TLS | AArch64II::MO_PAGEOFF | - AArch64II::MO_NC) - .addImm(0)); - break; - } - case 32: { - // movz x0, #:tprel_g1:a - // movk x0, #:tprel_g0_nc:a - // add x0, x1, x0 - Register Addr = MRI.createVirtualRegister(&AArch64::GPR64RegClass); - ConstrainRegOps( - MIB.buildInstr(AArch64::MOVZXi, {Addr}, {}) - .addGlobalAddress(GV, 0, AArch64II::MO_TLS | AArch64II::MO_G1) - .addImm(16)); - Register Addr2 = MRI.createVirtualRegister(&AArch64::GPR64RegClass); - ConstrainRegOps(MIB.buildInstr(AArch64::MOVKXi, {Addr2}, {Addr}) - .addGlobalAddress(GV, 0, - AArch64II::MO_TLS | AArch64II::MO_G0 | - AArch64II::MO_NC) - .addImm(0)); - ConstrainRegOps(MIB.buildInstr(AArch64::ADDXrr, {I.getOperand(0).getReg()}, - {ThreadBase, Addr2})); - break; - } - case 48: { - // movz x0, #:tprel_g2:a - // movk x0, #:tprel_g1_nc:a - // movk x0, #:tprel_g0_nc:a - // add x0, x1, x0 - Register Addr = MRI.createVirtualRegister(&AArch64::GPR64RegClass); - ConstrainRegOps( - MIB.buildInstr(AArch64::MOVZXi, {Addr}, {}) - .addGlobalAddress(GV, 0, AArch64II::MO_TLS | AArch64II::MO_G2) - .addImm(32)); - Register Addr2 = MRI.createVirtualRegister(&AArch64::GPR64RegClass); - ConstrainRegOps(MIB.buildInstr(AArch64::MOVKXi, {Addr2}, {Addr}) - .addGlobalAddress(GV, 0, - AArch64II::MO_TLS | AArch64II::MO_G1 | - AArch64II::MO_NC) - .addImm(16)); - Register Addr3 = MRI.createVirtualRegister(&AArch64::GPR64RegClass); - ConstrainRegOps(MIB.buildInstr(AArch64::MOVKXi, {Addr3}, {Addr2}) - .addGlobalAddress(GV, 0, - AArch64II::MO_TLS | AArch64II::MO_G0 | - AArch64II::MO_NC) - .addImm(0)); - ConstrainRegOps(MIB.buildInstr(AArch64::ADDXrr, {I.getOperand(0).getReg()}, - {ThreadBase, Addr3})); - break; - } - } - I.eraseFromParent(); - return true; -} - -// TLS lowering below mirrors the corresponding DAGISel implementation. -// See LowerELFTLSModel() for details. -bool AArch64InstructionSelector::selectTLSGlobalValueELF( +bool AArch64InstructionSelector::selectTLSGlobalValue( MachineInstr &I, MachineRegisterInfo &MRI) { - const GlobalValue *GV = I.getOperand(1).getGlobal(); - auto *FuncInfo = MF->getInfo<AArch64FunctionInfo>(); - TLSModel::Model Model = - AArch64::getELFTLSModel(GV, TM, FuncInfo->hasELFSignedGOT()); - - Register TPOff = MRI.createVirtualRegister(&AArch64::GPR64commonRegClass); - switch (Model) { - case TLSModel::LocalExec: - return selectTLSLocalExecELF(GV, I, MRI); - case TLSModel::InitialExec: - MIB.buildInstr(AArch64::LOADgot, {TPOff}, {}) - .addGlobalAddress(GV, 0, AArch64II::MO_TLS); - break; - case TLSModel::LocalDynamic: - case TLSModel::GeneralDynamic: { -#ifndef NDEBUG - SMEAttrs Attrs = MF->getInfo<AArch64FunctionInfo>()->getSMEFnAttrs(); - assert(!Attrs.hasZAState() && !Attrs.hasStreamingInterfaceOrBody() && - !Attrs.hasStreamingCompatibleInterface() && - "unsupported SME features reached GlobalISel TLS lowering"); -#endif - unsigned Opcode = FuncInfo->hasELFSignedGOT() - ? AArch64::TLSDESC_AUTH_CALLSEQ - : AArch64::TLSDESC_CALLSEQ; - - if (TLSModel::GeneralDynamic == Model) { - MIB.buildInstr(Opcode, {}, {}).addGlobalAddress(GV, 0, AArch64II::MO_TLS); - MIB.buildCopy(TPOff, Register(AArch64::X0)); - break; - } - assert(TLSModel::LocalDynamic == Model); - // These accesses will need deduplicating if there's more than one. - FuncInfo->incNumLocalDynamicTLSAccesses(); - - MIB.buildInstr(Opcode, {}, {}) - .addExternalSymbol("_TLS_MODULE_BASE_", AArch64II::MO_TLS); - auto Copy = MIB.buildCopy(LLT::scalar(64), Register(AArch64::X0)); - auto Add1 = - MIB.buildInstr(AArch64::ADDXri, {LLT::scalar(64)}, {Copy.getReg(0)}) - .addGlobalAddress(GV, 0, AArch64II::MO_TLS | AArch64II::MO_HI12) - .addImm(0); - auto Add2 = - MIB.buildInstr(AArch64::ADDXri, {TPOff}, {Add1.getReg(0)}) - .addGlobalAddress(GV, 0, - AArch64II::MO_TLS | AArch64II::MO_PAGEOFF | - AArch64II::MO_NC) - .addImm(0); - constrainSelectedInstRegOperands(*Add1, TII, TRI, RBI); - constrainSelectedInstRegOperands(*Add2, TII, TRI, RBI); - } - } - Register ThreadBase = MRI.createGenericVirtualRegister(LLT::pointer(0, 64)); - MIB.buildInstr(AArch64::MOVbaseTLS, {ThreadBase}, {}); - auto Add = MIB.buildInstr(AArch64::ADDXrr, {I.getOperand(0).getReg()}, - {ThreadBase, TPOff}); - constrainSelectedInstRegOperands(*Add, TII, TRI, RBI); - - I.eraseFromParent(); - return true; -} + if (!STI.isTargetMachO()) + return false; + MachineFunction &MF = *I.getParent()->getParent(); + MF.getFrameInfo().setAdjustsStack(true); -bool AArch64InstructionSelector::selectTLSGlobalValueMachO( - MachineInstr &I, MachineRegisterInfo &MRI) { const auto &GlobalOp = I.getOperand(1); assert(GlobalOp.getOffset() == 0 && "Shouldn't have an offset on TLS globals!"); - const GlobalValue &GV = *GlobalOp.getGlobal(); - MF->getFrameInfo().setAdjustsStack(true); + auto LoadGOT = MIB.buildInstr(AArch64::LOADgot, {&AArch64::GPR64commonRegClass}, {}) .addGlobalAddress(&GV, 0, AArch64II::MO_TLS); @@ -3910,10 +3762,10 @@ bool AArch64InstructionSelector::selectTLSGlobalValueMachO( // TLS calls preserve all registers except those that absolutely must be // trashed: X0 (it takes an argument), LR (it's a call) and NZCV (let's not be // silly). - unsigned Opcode = getBLRCallOpcode(*MF); + unsigned Opcode = getBLRCallOpcode(MF); // With ptrauth-calls, the tlv access thunk pointer is authenticated (IA, 0). - if (MF->getFunction().hasFnAttribute("ptrauth-calls")) { + if (MF.getFunction().hasFnAttribute("ptrauth-calls")) { assert(Opcode == AArch64::BLR); Opcode = AArch64::BLRAAZ; } @@ -3930,21 +3782,6 @@ bool AArch64InstructionSelector::selectTLSGlobalValueMachO( return true; } -bool AArch64InstructionSelector::selectTLSGlobalValue( - MachineInstr &I, MachineRegisterInfo &MRI) { - // We don't support instructions with emulated TLS variables yet. - if (TM.useEmulatedTLS()) - return false; - - if (STI.isTargetELF()) - return selectTLSGlobalValueELF(I, MRI); - - if (STI.isTargetMachO()) - return selectTLSGlobalValueMachO(I, MRI); - - return false; -} - MachineInstr *AArch64InstructionSelector::emitScalarToVector( unsigned EltSize, const TargetRegisterClass *DstRC, Register Scalar, MachineIRBuilder &MIRBuilder) const { diff --git a/llvm/test/CodeGen/AArch64/O3-pipeline.ll b/llvm/test/CodeGen/AArch64/O3-pipeline.ll index 8b29a46ff5e07..9b36359c339c8 100644 --- a/llvm/test/CodeGen/AArch64/O3-pipeline.ll +++ b/llvm/test/CodeGen/AArch64/O3-pipeline.ll @@ -131,9 +131,9 @@ ; CHECK-NEXT: ResetMachineFunction ; CHECK-NEXT: Assignment Tracking Analysis ; CHECK-NEXT: AArch64 Instruction Selection -; CHECK-NEXT: Finalize ISel and expand pseudo-instructions ; CHECK-NEXT: MachineDominator Tree Construction ; CHECK-NEXT: AArch64 Local Dynamic TLS Access Clean-up +; CHECK-NEXT: Finalize ISel and expand pseudo-instructions ; CHECK-NEXT: Bundle Machine CFG Edges ; CHECK-NEXT: Lazy Machine Block Frequency Analysis ; CHECK-NEXT: Machine Optimization Remark Emitter diff --git a/llvm/test/CodeGen/AArch64/arm64-tls-dynamics.ll b/llvm/test/CodeGen/AArch64/arm64-tls-dynamics.ll index 171fd64159556..098d6a29c2390 100644 --- a/llvm/test/CodeGen/AArch64/arm64-tls-dynamics.ll +++ b/llvm/test/CodeGen/AArch64/arm64-tls-dynamics.ll @@ -1,24 +1,15 @@ ; Verify the call site info. If the call site info is not ; in the valid state, an assert should be triggered. ; RUN: llc < %s -debug-entry-values -mtriple=arm64-none-linux-gnu -stop-after=machineverifier -relocation-model=pic -aarch64-elf-ldtls-generation=1 < %s -; RUN: llc < %s -debug-entry-values -mtriple=arm64-none-linux-gnu -global-isel -stop-after=machineverifier -relocation-model=pic -aarch64-elf-ldtls-generation=1 < %s ; RUN: llc -mtriple=arm64-none-linux-gnu -relocation-model=pic -aarch64-elf-ldtls-generation=1 -verify-machineinstrs < %s | FileCheck %s ; RUN: llc -mtriple=arm64-none-linux-gnu -relocation-model=pic -aarch64-elf-ldtls-generation=1 -filetype=obj < %s | llvm-objdump -r - | FileCheck --check-prefix=CHECK-RELOC %s ; RUN: llc -mtriple=arm64-none-linux-gnu -relocation-model=pic -verify-machineinstrs < %s | FileCheck --check-prefix=CHECK-NOLD %s ; RUN: llc -mtriple=arm64-none-linux-gnu -relocation-model=pic -filetype=obj < %s | llvm-objdump -r - | FileCheck --check-prefix=CHECK-NOLD-RELOC %s -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -relocation-model=pic -aarch64-elf-ldtls-generation=1 -verify-machineinstrs < %s | FileCheck %s -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -relocation-model=pic -aarch64-elf-ldtls-generation=1 -filetype=obj < %s | llvm-objdump -r - | FileCheck --check-prefix=CHECK-RELOC %s -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -relocation-model=pic -verify-machineinstrs < %s | FileCheck --check-prefix=CHECK-NOLD %s -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -relocation-model=pic -filetype=obj < %s | llvm-objdump -r - | FileCheck --check-prefix=CHECK-NOLD-RELOC %s - ; FIXME: We currently produce "small" code for the tiny model ; RUN: llc -mtriple=arm64-none-linux-gnu -relocation-model=pic -aarch64-elf-ldtls-generation=1 -code-model=tiny -verify-machineinstrs < %s | FileCheck %s -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -relocation-model=pic -aarch64-elf-ldtls-generation=1 -code-model=tiny -verify-machineinstrs < %s | FileCheck %s - ; FIXME: We currently error for the large code model ; RUN: not --crash llc -mtriple=arm64-none-linux-gnu -relocation-model=pic -aarch64-elf-ldtls-generation=1 -code-model=large -verify-machineinstrs < %s 2>&1 | FileCheck %s --check-prefix=CHECK-LARGE -; RUN: not --crash llc -mtriple=arm64-none-linux-gnu -global-isel -relocation-model=pic -aarch64-elf-ldtls-generation=1 -code-model=large -verify-machineinstrs < %s 2>&1 | FileCheck %s --check-prefix=CHECK-LARGE ; CHECK-LARGE: ELF TLS only supported in small memory model @@ -35,14 +26,16 @@ define i32 @test_generaldynamic() { ; CHECK-NEXT: add x0, x[[TLSDESC_HI]], :tlsdesc_lo12:general_dynamic_var ; CHECK-NEXT: .tlsdesccall general_dynamic_var ; CHECK-NEXT: blr [[CALLEE]] -; CHECK: mrs x[[TP:[0-9]+]], TPIDR_EL0 -; CHECK: ldr w0, [x[[TP]], x0] ; CHECK-NOLD: adrp x[[TLSDESC_HI:[0-9]+]], :tlsdesc:general_dynamic_var ; CHECK-NOLD-NEXT: ldr [[CALLEE:x[0-9]+]], [x[[TLSDESC_HI]], :tlsdesc_lo12:general_dynamic_var] ; CHECK-NOLD-NEXT: add x0, x[[TLSDESC_HI]], :tlsdesc_lo12:general_dynamic_var ; CHECK-NOLD-NEXT: .tlsdesccall general_dynamic_var ; CHECK-NOLD-NEXT: blr [[CALLEE]] + + +; CHECK: mrs x[[TP:[0-9]+]], TPIDR_EL0 +; CHECK: ldr w0, [x[[TP]], x0] ; CHECK-NOLD: mrs x[[TP:[0-9]+]], TPIDR_EL0 ; CHECK-NOLD: ldr w0, [x[[TP]], x0] @@ -133,7 +126,7 @@ define ptr @test_localdynamic_addr() { ; CHECK-NEXT: add x0, x[[TLSDESC_HI]], :tlsdesc_lo12:_TLS_MODULE_BASE_ ; CHECK-NEXT: .tlsdesccall _TLS_MODULE_BASE_ ; CHECK-NEXT: blr [[CALLEE]] -; CHECK-DAG: add x[[TPOFF:[0-9]+]], x0, :dtprel_hi12:local_dynamic_var +; CHECK-NEXT: add x[[TPOFF:[0-9]+]], x0, :dtprel_hi12:local_dynamic_var ; CHECK-DAG: add x[[TPOFF]], x[[TPOFF]], :dtprel_lo12_nc:local_dynamic_var ; CHECK-DAG: mrs x[[TPIDR:[0-9]+]], TPIDR_EL0 ; CHECK: add x0, x[[TPIDR]], x[[TPOFF]] diff --git a/llvm/test/CodeGen/AArch64/arm64-tls-initial-exec.ll b/llvm/test/CodeGen/AArch64/arm64-tls-initial-exec.ll index 3fa18aa9c6a39..c5a1144964976 100644 --- a/llvm/test/CodeGen/AArch64/arm64-tls-initial-exec.ll +++ b/llvm/test/CodeGen/AArch64/arm64-tls-initial-exec.ll @@ -2,15 +2,8 @@ ; RUN: llc -mtriple=arm64-none-linux-gnu -filetype=obj < %s | llvm-objdump -r - | FileCheck --check-prefix=CHECK-RELOC %s ; RUN: llc -mtriple=arm64-none-linux-gnu -verify-machineinstrs -show-mc-encoding -code-model=tiny < %s | FileCheck %s --check-prefix=CHECK-TINY ; RUN: llc -mtriple=arm64-none-linux-gnu -filetype=obj < %s -code-model=tiny | llvm-objdump -r - | FileCheck --check-prefix=CHECK-TINY-RELOC %s - -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -verify-machineinstrs < %s | FileCheck %s -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -filetype=obj < %s | llvm-objdump -r - | FileCheck --check-prefix=CHECK-RELOC %s -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -verify-machineinstrs -code-model=tiny < %s | FileCheck %s --check-prefix=CHECK-TINY -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -filetype=obj < %s -code-model=tiny | llvm-objdump -r - | FileCheck --check-prefix=CHECK-TINY-RELOC %s - ; FIXME: We currently error for the large code model ; RUN: not --crash llc -mtriple=arm64-none-linux-gnu -verify-machineinstrs -show-mc-encoding -code-model=large < %s 2>&1 | FileCheck %s --check-prefix=CHECK-LARGE -; RUN: not --crash llc -mtriple=arm64-none-linux-gnu -global-isel -verify-machineinstrs -code-model=large < %s 2>&1 | FileCheck %s --check-prefix=CHECK-LARGE ; CHECK-LARGE: ELF TLS only supported in small memory model diff --git a/llvm/test/CodeGen/AArch64/arm64-tls-local-exec.ll b/llvm/test/CodeGen/AArch64/arm64-tls-local-exec.ll index 20f943e4bbf00..59d5500ce534e 100644 --- a/llvm/test/CodeGen/AArch64/arm64-tls-local-exec.ll +++ b/llvm/test/CodeGen/AArch64/arm64-tls-local-exec.ll @@ -7,16 +7,7 @@ ; RUN: llc -mtriple=arm64-none-linux-gnu -filetype=obj < %s -code-model=small -tls-size=32 | llvm-objdump -r - | FileCheck --check-prefix=CHECK-32-RELOC %s ; RUN: llc -mtriple=arm64-none-linux-gnu -verify-machineinstrs -show-mc-encoding -code-model=large -tls-size=48 < %s | FileCheck %s --check-prefix=CHECK-48 ; RUN: llc -mtriple=arm64-none-linux-gnu -filetype=obj < %s -code-model=large -tls-size=48 | llvm-objdump -r - | FileCheck --check-prefix=CHECK-48-RELOC %s - -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -verify-machineinstrs -tls-size=12 < %s | FileCheck %s --check-prefix=CHECK-12 -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -filetype=obj < %s -tls-size=12 | llvm-objdump -r - | FileCheck --check-prefix=CHECK-12-RELOC %s -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -verify-machineinstrs -code-model=tiny -tls-size=24 < %s | FileCheck %s --check-prefix=CHECK-24 -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -filetype=obj < %s -code-model=tiny -tls-size=24 | llvm-objdump -r - | FileCheck --check-prefix=CHECK-24-RELOC %s -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -verify-machineinstrs -code-model=small -tls-size=32 < %s | FileCheck %s --check-prefix=CHECK-32 -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -filetype=obj < %s -code-model=small -tls-size=32 | llvm-objdump -r - | FileCheck --check-prefix=CHECK-32-RELOC %s -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -verify-machineinstrs -code-model=large -tls-size=48 < %s | FileCheck %s --check-prefix=CHECK-48 -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -filetype=obj < %s -code-model=large -tls-size=48 | llvm-objdump -r - | FileCheck --check-prefix=CHECK-48-RELOC %s - +; ; Test the maximum TLS size for each code model (fallback to a smaller size from the specified size) ; RUN: llc -mtriple=arm64-none-linux-gnu -verify-machineinstrs -show-mc-encoding -tls-size=32 < %s | FileCheck %s --check-prefix=CHECK-32 ; RUN: llc -mtriple=arm64-none-linux-gnu -filetype=obj < %s -tls-size=32 | llvm-objdump -r - | FileCheck --check-prefix=CHECK-32-RELOC %s @@ -24,14 +15,7 @@ ; RUN: llc -mtriple=arm64-none-linux-gnu -filetype=obj < %s -code-model=tiny -tls-size=32 | llvm-objdump -r - | FileCheck --check-prefix=CHECK-24-RELOC %s ; RUN: llc -mtriple=arm64-none-linux-gnu -verify-machineinstrs -show-mc-encoding -code-model=small -tls-size=48 < %s | FileCheck %s --check-prefix=CHECK-32 ; RUN: llc -mtriple=arm64-none-linux-gnu -filetype=obj < %s -code-model=small -tls-size=48 | llvm-objdump -r - | FileCheck --check-prefix=CHECK-32-RELOC %s - -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -verify-machineinstrs -tls-size=32 < %s | FileCheck %s --check-prefix=CHECK-32 -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -filetype=obj < %s -tls-size=32 | llvm-objdump -r - | FileCheck --check-prefix=CHECK-32-RELOC %s -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -verify-machineinstrs -code-model=tiny -tls-size=32 < %s | FileCheck %s --check-prefix=CHECK-24 -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -filetype=obj < %s -code-model=tiny -tls-size=32 | llvm-objdump -r - | FileCheck --check-prefix=CHECK-24-RELOC %s -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -verify-machineinstrs -code-model=small -tls-size=48 < %s | FileCheck %s --check-prefix=CHECK-32 -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -filetype=obj < %s -code-model=small -tls-size=48 | llvm-objdump -r - | FileCheck --check-prefix=CHECK-32-RELOC %s - +; ; Test the default TLS size for each code model ; RUN: llc -mtriple=arm64-none-linux-gnu -verify-machineinstrs -show-mc-encoding < %s | FileCheck --check-prefix=CHECK-24 %s ; RUN: llc -mtriple=arm64-none-linux-gnu -filetype=obj < %s | llvm-objdump -r - | FileCheck --check-prefix=CHECK-24-RELOC %s @@ -42,15 +26,6 @@ ; RUN: llc -mtriple=arm64-none-linux-gnu -verify-machineinstrs -show-mc-encoding -code-model=large < %s | FileCheck %s --check-prefix=CHECK-24 ; RUN: llc -mtriple=arm64-none-linux-gnu -filetype=obj < %s -code-model=large | llvm-objdump -r - | FileCheck --check-prefix=CHECK-24-RELOC %s -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -verify-machineinstrs < %s | FileCheck --check-prefix=CHECK-24 %s -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -filetype=obj < %s | llvm-objdump -r - | FileCheck --check-prefix=CHECK-24-RELOC %s -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -verify-machineinstrs -code-model=tiny < %s | FileCheck %s --check-prefix=CHECK-24 -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -filetype=obj < %s -code-model=tiny | llvm-objdump -r - | FileCheck --check-prefix=CHECK-24-RELOC %s -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -verify-machineinstrs -code-model=small < %s | FileCheck %s --check-prefix=CHECK-24 -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -filetype=obj < %s -code-model=small | llvm-objdump -r - | FileCheck --check-prefix=CHECK-24-RELOC %s -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -verify-machineinstrs -code-model=large < %s | FileCheck %s --check-prefix=CHECK-24 -; RUN: llc -mtriple=arm64-none-linux-gnu -global-isel -filetype=obj < %s -code-model=large | llvm-objdump -r - | FileCheck --check-prefix=CHECK-24-RELOC %s - @local_exec_var = thread_local(localexec) global i32 0 define i32 @test_local_exec() { diff --git a/llvm/test/CodeGen/AArch64/ptrauth-arm64-tls-dynamics.ll b/llvm/test/CodeGen/AArch64/ptrauth-arm64-tls-dynamics.ll index 981864ce78cc4..2d8085cf489b9 100644 --- a/llvm/test/CodeGen/AArch64/ptrauth-arm64-tls-dynamics.ll +++ b/llvm/test/CodeGen/AArch64/ptrauth-arm64-tls-dynamics.ll @@ -2,10 +2,8 @@ ; RUN: -verify-machineinstrs < %s | FileCheck %s ; RUN: llc -mtriple=aarch64-unknown-linux-gnu -mattr=+pauth -relocation-model=pic \ ; RUN: -filetype=obj < %s | llvm-readelf -r -s - | FileCheck --check-prefix=CHECK-OBJ %s -; RUN: llc -mtriple=aarch64-unknown-linux-gnu -mattr=+pauth -relocation-model=pic \ -; RUN: -global-isel=1 -verify-machineinstrs < %s 2>&1 | FileCheck %s -; RUN: llc -mtriple=aarch64-unknown-linux-gnu -mattr=+pauth -relocation-model=pic \ -; RUN: -global-isel=1 -filetype=obj < %s | llvm-readelf -r -s - | FileCheck --check-prefix=CHECK-OBJ %s +; RUN: not llc -mtriple=aarch64-unknown-linux-gnu -mattr=+pauth -relocation-model=pic \ +; RUN: -global-isel=1 < %s 2>&1 | FileCheck --check-prefix=CHECK-ERR %s @general_dynamic_var = external thread_local global i32 @@ -26,6 +24,8 @@ define i32 @test_generaldynamic() { ; CHECK-OBJ: R_AARCH64_AUTH_TLSDESC_LD64_LO12 ; CHECK-OBJ: R_AARCH64_AUTH_TLSDESC_ADD_LO12 ; CHECK-OBJ-NOT: R_AARCH64_TLSDESC_CALL + +; CHECK-ERR: LLVM ERROR: cannot select: %1:gpr64sp(p0) = G_GLOBAL_VALUE @general_dynamic_var (in function: test_generaldynamic) } define ptr @test_generaldynamic_addr() { _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
