diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/contrib/llvm-project/llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp b/contrib/llvm-project/llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp index 4a0738dc3b7a..910a4e5e0d1a 100644 --- a/contrib/llvm-project/llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp +++ b/contrib/llvm-project/llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp @@ -252,8 +252,7 @@ bool WebAssemblyExplicitLocals::runOnMachineFunction(MachineFunction &MF) { // Visit each instruction in the function. for (MachineBasicBlock &MBB : MF) { - for (MachineBasicBlock::iterator I = MBB.begin(), E = MBB.end(); I != E;) { - MachineInstr &MI = *I++; + for (MachineInstr &MI : llvm::make_early_inc_range(MBB)) { assert(!WebAssembly::isArgument(MI.getOpcode())); if (MI.isDebugInstr() || MI.isLabel()) @@ -380,9 +379,14 @@ bool WebAssemblyExplicitLocals::runOnMachineFunction(MachineFunction &MF) { const TargetRegisterClass *RC = MRI.getRegClass(OldReg); Register NewReg = MRI.createVirtualRegister(RC); unsigned Opc = getLocalGetOpcode(RC); - InsertPt = - BuildMI(MBB, InsertPt, MI.getDebugLoc(), TII->get(Opc), NewReg) - .addImm(LocalId); + // Use a InsertPt as our DebugLoc, since MI may be discontinuous from + // the where this local is being inserted, causing non-linear stepping + // in the debugger or function entry points where variables aren't live + // yet. Alternative is previous instruction, but that is strictly worse + // since it can point at the previous statement. + // See crbug.com/1251909, crbug.com/1249745 + InsertPt = BuildMI(MBB, InsertPt, InsertPt->getDebugLoc(), + TII->get(Opc), NewReg).addImm(LocalId); MO.setReg(NewReg); MFI.stackifyVReg(MRI, NewReg); Changed = true; |