[X86] In OptimizeLEAs pass, check that the key is in the LEAs map before accessing

When the key is not already in the map, the access operator[] creates an empty value and grows the map.
Resizing a map is very slow, so this needs to be avoided.

Found with csmith + asserts.

May help with
https://bugs.llvm.org/show_bug.cgi?id=25843

Patch by Tom Rix.

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

llvm-svn: 340434
This commit is contained in:
Craig Topper 2018-08-22 18:24:13 +00:00
parent ff363539c6
commit 87f78cfe15
1 changed files with 6 additions and 2 deletions

View File

@ -510,12 +510,16 @@ bool OptimizeLEAPass::removeRedundantAddrCalc(MemOpMap &LEAs) {
MemOpNo += X86II::getOperandBias(Desc);
// Do not call chooseBestLEA if there was no matching LEA
auto Insns = LEAs.find(getMemOpKey(MI, MemOpNo));
if (Insns == LEAs.end())
continue;
// Get the best LEA instruction to replace address calculation.
MachineInstr *DefMI;
int64_t AddrDispShift;
int Dist;
if (!chooseBestLEA(LEAs[getMemOpKey(MI, MemOpNo)], MI, DefMI, AddrDispShift,
Dist))
if (!chooseBestLEA(Insns->second, MI, DefMI, AddrDispShift, Dist))
continue;
// If LEA occurs before current instruction, we can freely replace