From eafa8dbefe30c85e58efc5309793f2d7c2109e35 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Tue, 14 Jan 2020 14:09:06 -0500 Subject: [PATCH] TableGen/GlobalISel: Don't take reference to temporary values These return temporary Optional<> values which are immediately destroyed. I'm not sure why no sanitizers seem to have caught this, but I encountered crashes on these in a future patch. --- llvm/utils/TableGen/GlobalISelEmitter.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/llvm/utils/TableGen/GlobalISelEmitter.cpp b/llvm/utils/TableGen/GlobalISelEmitter.cpp index ff88186..2e5cd95 100644 --- a/llvm/utils/TableGen/GlobalISelEmitter.cpp +++ b/llvm/utils/TableGen/GlobalISelEmitter.cpp @@ -4225,7 +4225,7 @@ GlobalISelEmitter::createAndImportSubInstructionRenderer( if (!SubIdx) return failedImport("EXTRACT_SUBREG child #1 is not a subreg index"); - const auto &SrcRCDstRCPair = + const auto SrcRCDstRCPair = (*SuperClass)->getMatchingSubClassWithSubRegs(CGRegs, *SubIdx); assert(SrcRCDstRCPair->second && "Couldn't find a matching subclass"); M.insertAction( @@ -4316,7 +4316,7 @@ Expected GlobalISelEmitter::importExplicitUseRenderers( CodeGenRegisterClass *RC = CGRegs.getRegClass(RCDef); CodeGenSubRegIndex *SubIdx = CGRegs.getSubRegIdx(SubRegInit->getDef()); - const auto &SrcRCDstRCPair = + const auto SrcRCDstRCPair = RC->getMatchingSubClassWithSubRegs(CGRegs, SubIdx); if (SrcRCDstRCPair.hasValue()) { assert(SrcRCDstRCPair->second && "Couldn't find a matching subclass"); @@ -4832,7 +4832,7 @@ Expected GlobalISelEmitter::runOnPattern(const PatternToMatch &P) { assert(Src->getExtTypes().size() == 1 && "Expected Src of EXTRACT_SUBREG to have one result type"); - const auto &SrcRCDstRCPair = + const auto SrcRCDstRCPair = (*SuperClass)->getMatchingSubClassWithSubRegs(CGRegs, *SubIdx); assert(SrcRCDstRCPair->second && "Couldn't find a matching subclass"); M.addAction(0, 0, *SrcRCDstRCPair->second); -- 2.7.4