================ @@ -145,9 +164,96 @@ namespace { .addImm(0); if (IsAIX) { - // The variable offset and region handle are copied in r4 and r3. The - // copies are followed by GETtlsADDR32AIX/GETtlsADDR64AIX. - if (!IsTLSTPRelMI) { + if (IsTLSLDAIXMI) { + // The relative order between the LoadOffset@toc node (for the + // variable offset), and the .__tls_get_mod node is being tuned + // here. It is better to put the LoadOffset@toc node after the call, + // since the LoadOffset@toc node can use clobbers r4/r5. Search for + // the pattern of two Load@toc nodes (either for the variable offset + // or for the module handle), and then move the LoadOffset@toc node + // right before the node that uses the OutReg of the .__tls_get_mod + // node. + unsigned LDTocOp = + Is64Bit ? (IsLargeModel ? PPC::LDtocL : PPC::LDtoc) + : (IsLargeModel ? PPC::LWZtocL : PPC::LWZtoc); + if (!RegInfo.use_empty(OutReg)) { + std::set<MachineInstr *> Uses; + // Collect all instructions that use the OutReg. + for (MachineOperand &MO : RegInfo.use_operands(OutReg)) + Uses.insert(MO.getParent()); + // Find the first user (e.g.: lwax/stfdx) of the OutReg within the + // current BB. + MachineBasicBlock::iterator UseIter = MBB.begin(); + for (MachineBasicBlock::iterator IE = MBB.end(); UseIter != IE; + ++UseIter) + if (Uses.count(&*UseIter)) + break; + + // Additional handling is required when UserIter (the first user + // of OutReg) is pointing to a valid node. Check the pattern and + // do the movement if the pattern matches. + if (UseIter != MBB.end()) { + // Collect associated Load@toc nodes. Use hasOneDef() to guard ---------------- amy-kwan wrote:
```suggestion // Collect all associated nodes that load from the TOC. Use hasOneDef() to guard ``` https://github.com/llvm/llvm-project/pull/66316 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits