diff --git a/llvm/lib/Target/Mips/MipsMulMulBugPass.cpp b/llvm/lib/Target/Mips/MipsMulMulBugPass.cpp --- a/llvm/lib/Target/Mips/MipsMulMulBugPass.cpp +++ b/llvm/lib/Target/Mips/MipsMulMulBugPass.cpp @@ -110,17 +110,19 @@ const MipsInstrInfo &MipsII) { bool Modified = false; + MachineBasicBlock::instr_iterator NextMII; + // Iterate through the instructions in the basic block for (MachineBasicBlock::instr_iterator MII = MBB.instr_begin(), E = MBB.instr_end(); - MII != E; ++MII) { + MII != E; MII = NextMII) { - MachineBasicBlock::instr_iterator NextMII = std::next(MII); + NextMII = next_nodbg(MII, E); // Trigger when the current instruction is a mul and the next instruction // is either a mul or a branch in case the branch target start with a mul if (NextMII != E && isFirstMul(*MII) && isSecondMulOrBranch(*NextMII)) { - LLVM_DEBUG(dbgs() << "Found mulmul!"); + LLVM_DEBUG(dbgs() << "Found mulmul!\n"); const MCInstrDesc &NewMCID = MipsII.get(Mips::NOP); BuildMI(MBB, NextMII, DebugLoc(), NewMCID); diff --git a/llvm/test/CodeGen/Mips/vr4300-mulmul.ll b/llvm/test/CodeGen/Mips/vr4300-mulmul.ll --- a/llvm/test/CodeGen/Mips/vr4300-mulmul.ll +++ b/llvm/test/CodeGen/Mips/vr4300-mulmul.ll @@ -1,13 +1,14 @@ ; RUN: llc -march=mips -mfix4300 -verify-machineinstrs < %s | FileCheck %s ; Function Attrs: mustprogress nofree norecurse nosync nounwind readnone willreturn -define dso_local float @fun_s(float %x) local_unnamed_addr #0 { +define dso_local float @fun_s(float %x) local_unnamed_addr !dbg !7 { entry: ; CHECK-LABEL: fun_s ; CHECK: mul.s +; CHECK-NEXT: #DEBUG_VALUE: i <- 1 ; CHECK-NEXT: nop -; CHECK: mul.s %mul = fmul float %x, %x + call void @llvm.dbg.value(metadata i32 1, metadata !13, metadata !DIExpression()), !dbg !17 %mul1 = fmul float %mul, %x ret float %mul1 } @@ -22,3 +23,23 @@ %mul1 = fmul double %mul, %x ret double %mul1 } + + +; Function Attrs: nofree nosync nounwind readnone speculatable willreturn +declare void @llvm.dbg.value(metadata, metadata, metadata) + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!2, !3} + +!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !1, producer: "", isOptimized: true, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None) +!1 = !DIFile(filename: "vr4300-mulmul.ll", directory: "/") +!2 = !{i32 7, !"Dwarf Version", i32 4} +!3 = !{i32 2, !"Debug Info Version", i32 3} +!7 = distinct !DISubprogram(name: "fun_s", linkageName: "fun_s", scope: !1, file: !1, line: 1, type: !8, scopeLine: 2, flags: DIFlagPrototyped | DIFlagAllCallsDescribed, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: !0) +!8 = !DISubroutineType(types: !9) +!9 = !{!10, !10} +!10 = !DIBasicType(name: "float", size: 32, encoding: DW_ATE_float) +!13 = !DILocalVariable(name: "i", scope: !14, file: !1, line: 3, type: !15) +!14 = distinct !DILexicalBlock(scope: !7, file: !1, line: 3, column: 5) +!15 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed) +!17 = !DILocation(line: 0, scope: !14)