From: Nikolai Bozhenov Date: Thu, 24 Nov 2016 13:05:43 +0000 (+0000) Subject: [x86] Rewrite getAddressFromInstr helper function X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5f72eeb8508bfc43efa24647aa737da7fd617e3f;p=llvm [x86] Rewrite getAddressFromInstr helper function - It does not modify the input instruction - Second operand of any address is always an Index Register, make sure we actually check for that, instead of a check for an immediate value Patch by Alexander Ivchenko Differential Revision: https://reviews.llvm.org/D24938 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@287873 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Target/X86/X86InstrBuilder.h b/lib/Target/X86/X86InstrBuilder.h index f07f68256a1..ec227cccab1 100644 --- a/lib/Target/X86/X86InstrBuilder.h +++ b/lib/Target/X86/X86InstrBuilder.h @@ -90,29 +90,30 @@ struct X86AddressMode { /// Compute the addressing mode from an machine instruction starting with the /// given operand. -static inline X86AddressMode getAddressFromInstr(MachineInstr *MI, +static inline X86AddressMode getAddressFromInstr(const MachineInstr *MI, unsigned Operand) { X86AddressMode AM; - MachineOperand &Op = MI->getOperand(Operand); - if (Op.isReg()) { + const MachineOperand &Op0 = MI->getOperand(Operand); + if (Op0.isReg()) { AM.BaseType = X86AddressMode::RegBase; - AM.Base.Reg = Op.getReg(); + AM.Base.Reg = Op0.getReg(); } else { AM.BaseType = X86AddressMode::FrameIndexBase; - AM.Base.FrameIndex = Op.getIndex(); - } - Op = MI->getOperand(Operand + 1); - if (Op.isImm()) - AM.Scale = Op.getImm(); - Op = MI->getOperand(Operand + 2); - if (Op.isImm()) - AM.IndexReg = Op.getImm(); - Op = MI->getOperand(Operand + 3); - if (Op.isGlobal()) { - AM.GV = Op.getGlobal(); - } else { - AM.Disp = Op.getImm(); + AM.Base.FrameIndex = Op0.getIndex(); } + + const MachineOperand &Op1 = MI->getOperand(Operand + 1); + AM.Scale = Op1.getImm(); + + const MachineOperand &Op2 = MI->getOperand(Operand + 2); + AM.IndexReg = Op2.getReg(); + + const MachineOperand &Op3 = MI->getOperand(Operand + 3); + if (Op3.isGlobal()) + AM.GV = Op3.getGlobal(); + else + AM.Disp = Op3.getImm(); + return AM; }