diff options
author | Eli Friedman <efriedma@quicinc.com> | 2019-03-27 18:33:30 +0000 |
---|---|---|
committer | Eli Friedman <efriedma@quicinc.com> | 2019-03-27 18:33:30 +0000 |
commit | c388bfa23040e267dfe6295c2e5c243042a426d3 (patch) | |
tree | ca7889d6eba43be3e26bd9399c6765de439cb9fb /llvm/lib/Target | |
parent | 8a02aea6fc3636f2f5d725c1772a0b11721c1fbd (diff) | |
download | bcm5719-llvm-c388bfa23040e267dfe6295c2e5c243042a426d3.tar.gz bcm5719-llvm-c388bfa23040e267dfe6295c2e5c243042a426d3.zip |
[ARM] Don't confuse the scheduler for very large VLDMDIA etc.
ARMBaseInstrInfo::getNumLDMAddresses is making bad assumptions about the
memory operands of load and store-multiple operations. This doesn't
really fix the problem properly, but it's enough to prevent crashing,
at least.
Fixes https://bugs.llvm.org/show_bug.cgi?id=41231 .
Differential Revision: https://reviews.llvm.org/D59834
llvm-svn: 357109
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r-- | llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp b/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp index bb222edbcef..bc4547c996f 100644 --- a/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp +++ b/llvm/lib/Target/ARM/ARMBaseInstrInfo.cpp @@ -3435,7 +3435,12 @@ unsigned ARMBaseInstrInfo::getNumLDMAddresses(const MachineInstr &MI) const { I != E; ++I) { Size += (*I)->getSize(); } - return Size / 4; + // FIXME: The scheduler currently can't handle values larger than 16. But + // the values can actually go up to 32 for floating-point load/store + // multiple (VLDMIA etc.). Also, the way this code is reasoning about memory + // operations isn't right; we could end up with "extra" memory operands for + // various reasons, like tail merge merging two memory operations. + return std::min(Size / 4, 16U); } static unsigned getNumMicroOpsSingleIssuePlusExtras(unsigned Opc, |