[llvm] ee198df - [mips] Improve vr4300 mulmul bugfix pass

Simon Atanasyan via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 20 09:10:31 PST 2022


Author: Random06457
Date: 2022-01-20T20:10:04+03:00
New Revision: ee198df2e14c139340421d4f5310dbaf9f725518

URL: https://github.com/llvm/llvm-project/commit/ee198df2e14c139340421d4f5310dbaf9f725518
DIFF: https://github.com/llvm/llvm-project/commit/ee198df2e14c139340421d4f5310dbaf9f725518.diff

LOG: [mips] Improve vr4300 mulmul bugfix pass

When compiling with dwarf info, the mfix4300 flag introduced in
https://reviews.llvm.org/D116238 can miss some occurrences of the vr4300
mulmul bug if a debug instruction happens to be between two `muls`
instructions. This change skips debug instructions in order to fix
the mulmul bug detection.

Fixes https://github.com/llvm/llvm-project/issues/53094

Differential Revision: https://reviews.llvm.org/D117615

Added: 
    

Modified: 
    llvm/lib/Target/Mips/MipsMulMulBugPass.cpp
    llvm/test/CodeGen/Mips/vr4300-mulmul.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/Mips/MipsMulMulBugPass.cpp b/llvm/lib/Target/Mips/MipsMulMulBugPass.cpp
index cb112ca1dfffe..daaf1135c2b13 100644
--- a/llvm/lib/Target/Mips/MipsMulMulBugPass.cpp
+++ b/llvm/lib/Target/Mips/MipsMulMulBugPass.cpp
@@ -110,17 +110,19 @@ bool MipsMulMulBugFix::fixMulMulBB(MachineBasicBlock &MBB,
                                    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
index f20cc169825ee..33d909c7b4369 100644
--- 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 @@ entry:
   %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)


        


More information about the llvm-commits mailing list