diff --git a/bolt/include/bolt/Core/MCPlus.h b/bolt/include/bolt/Core/MCPlus.h index 0abb70a2c529..b4a72ac274fa 100644 --- a/bolt/include/bolt/Core/MCPlus.h +++ b/bolt/include/bolt/Core/MCPlus.h @@ -113,6 +113,19 @@ inline unsigned getNumPrimeOperands(const MCInst &Inst) { return Inst.getNumOperands(); } +/// Return iterator range of operands excluding operands representing +/// annotations. +inline iterator_range primeOperands(MCInst &Inst) { + return iterator_range( + Inst.begin(), Inst.begin() + getNumPrimeOperands(Inst)); +} + +inline iterator_range +primeOperands(const MCInst &Inst) { + return iterator_range( + Inst.begin(), Inst.begin() + getNumPrimeOperands(Inst)); +} + } // namespace MCPlus } // namespace bolt diff --git a/bolt/lib/Core/BinaryFunction.cpp b/bolt/lib/Core/BinaryFunction.cpp index 6469058dc222..aca3c6f230da 100644 --- a/bolt/lib/Core/BinaryFunction.cpp +++ b/bolt/lib/Core/BinaryFunction.cpp @@ -3610,8 +3610,8 @@ size_t BinaryFunction::computeHash(bool UseDFS, Opcode = Opcode >> 8; } - for (unsigned I = 0, E = MCPlus::getNumPrimeOperands(Inst); I != E; ++I) - HashString.append(OperandHashFunc(Inst.getOperand(I))); + for (const MCOperand &Op : MCPlus::primeOperands(Inst)) + HashString.append(OperandHashFunc(Op)); } } diff --git a/bolt/lib/Passes/AllocCombiner.cpp b/bolt/lib/Passes/AllocCombiner.cpp index fc7cc204a9d1..652111cf34a9 100644 --- a/bolt/lib/Passes/AllocCombiner.cpp +++ b/bolt/lib/Passes/AllocCombiner.cpp @@ -44,11 +44,9 @@ bool isIndifferentToSP(const MCInst &Inst, const BinaryContext &BC) { II.hasImplicitUseOfPhysReg(BC.MIB->getStackPointer())) return false; - for (int I = 0, E = MCPlus::getNumPrimeOperands(Inst); I != E; ++I) { - const MCOperand &Operand = Inst.getOperand(I); + for (const MCOperand &Operand : MCPlus::primeOperands(Inst)) if (Operand.isReg() && Operand.getReg() == BC.MIB->getStackPointer()) return false; - } return true; } diff --git a/bolt/lib/Passes/AsmDump.cpp b/bolt/lib/Passes/AsmDump.cpp index 48ebd3c79b02..b89b46319289 100644 --- a/bolt/lib/Passes/AsmDump.cpp +++ b/bolt/lib/Passes/AsmDump.cpp @@ -212,9 +212,7 @@ void dumpFunction(const BinaryFunction &BF) { // Analyze symbol references (data, functions) from the instruction. bool IsCall = BC.MIB->isCall(Instr); - for (unsigned I = 0, E = MCPlus::getNumPrimeOperands(Instr); I != E; - ++I) { - MCOperand Operand = Instr.getOperand(I); + for (const MCOperand &Operand : MCPlus::primeOperands(Instr)) { if (Operand.isExpr() && Operand.getExpr()->getKind() == MCExpr::SymbolRef) { std::pair TSI = diff --git a/bolt/lib/Passes/RegReAssign.cpp b/bolt/lib/Passes/RegReAssign.cpp index 35dec4cf1f8d..ce12da6fa5ee 100644 --- a/bolt/lib/Passes/RegReAssign.cpp +++ b/bolt/lib/Passes/RegReAssign.cpp @@ -47,8 +47,7 @@ void RegReAssign::swap(BinaryFunction &Function, MCPhysReg A, MCPhysReg B) { // Regular instructions for (BinaryBasicBlock &BB : Function) { for (MCInst &Inst : BB) { - for (int I = 0, E = MCPlus::getNumPrimeOperands(Inst); I != E; ++I) { - MCOperand &Operand = Inst.getOperand(I); + for (MCOperand &Operand : MCPlus::primeOperands(Inst)) { if (!Operand.isReg()) continue; diff --git a/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp b/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp index e83a09c8e524..cc148e914ae6 100644 --- a/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp +++ b/bolt/lib/Target/AArch64/AArch64MCPlusBuilder.cpp @@ -619,11 +619,10 @@ public: auto addInstrOperands = [&](const MCInst &Instr) { // Update Uses table - for (unsigned OpNum = 0, OpEnd = MCPlus::getNumPrimeOperands(Instr); - OpNum != OpEnd; ++OpNum) { - if (!Instr.getOperand(OpNum).isReg()) + for (const MCOperand &Operand : MCPlus::primeOperands(Instr)) { + if (!Operand.isReg()) continue; - unsigned Reg = Instr.getOperand(OpNum).getReg(); + unsigned Reg = Operand.getReg(); MCInst *AliasInst = RegAliasTable[Reg]; Uses[&Instr].push_back(AliasInst); LLVM_DEBUG({ diff --git a/bolt/lib/Target/X86/X86MCPlusBuilder.cpp b/bolt/lib/Target/X86/X86MCPlusBuilder.cpp index 82681700e3a9..8861f5fd969c 100644 --- a/bolt/lib/Target/X86/X86MCPlusBuilder.cpp +++ b/bolt/lib/Target/X86/X86MCPlusBuilder.cpp @@ -985,8 +985,7 @@ public: case X86::MOVZX32rm8: case X86::MOVZX32rr8: case X86::TEST8ri: - for (int I = 0, E = MCPlus::getNumPrimeOperands(Inst); I != E; ++I) { - const MCOperand &Operand = Inst.getOperand(I); + for (const MCOperand &Operand : MCPlus::primeOperands(Inst)) { if (!Operand.isReg()) continue; if (isUpper8BitReg(Operand.getReg()))