From 392e0061294cc7933f610f306237076775867259 Mon Sep 17 00:00:00 2001 From: Hsiangkai Wang Date: Fri, 19 Oct 2018 01:52:54 +0000 Subject: [PATCH] [CodeGen] Fix for PR39094. When using MachineInstr to get SlotIndex, the MI could not be a debug instruction. mi2iMap does not contain debug instructions in it. After enabling DBG_LABEL in the generated code, the first instruction in the bundle may be a debug instruction. In this patch, I use the first non-debug instruction in the bundle to query SlotIndex in mi2iMap. Bugzilla report: https://bugs.llvm.org/show_bug.cgi?id=39094 Differential revision: https://reviews.llvm.org/D52927 llvm-svn: 344770 --- llvm/include/llvm/CodeGen/SlotIndexes.h | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/llvm/include/llvm/CodeGen/SlotIndexes.h b/llvm/include/llvm/CodeGen/SlotIndexes.h index 5508222..b6e5088 100644 --- a/llvm/include/llvm/CodeGen/SlotIndexes.h +++ b/llvm/include/llvm/CodeGen/SlotIndexes.h @@ -413,10 +413,14 @@ class raw_ostream; /// Returns the base index for the given instruction. SlotIndex getInstructionIndex(const MachineInstr &MI) const { // Instructions inside a bundle have the same number as the bundle itself. - const MachineInstr &BundleStart = *getBundleStart(MI.getIterator()); - assert(!BundleStart.isDebugInstr() && + auto BundleStart = getBundleStart(MI.getIterator()); + auto BundleEnd = getBundleEnd(MI.getIterator()); + // Use the first non-debug instruction in the bundle to get SlotIndex. + const MachineInstr &BundleNonDebug = + *skipDebugInstructionsForward(BundleStart, BundleEnd); + assert(!BundleNonDebug.isDebugInstr() && "Could not use a debug instruction to query mi2iMap."); - Mi2IndexMap::const_iterator itr = mi2iMap.find(&BundleStart); + Mi2IndexMap::const_iterator itr = mi2iMap.find(&BundleNonDebug); assert(itr != mi2iMap.end() && "Instruction not found in maps."); return itr->second; } -- 2.7.4