aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/MachineOutliner.cpp
diff options
context:
space:
mode:
authorJessica Paquette <jpaquette@apple.com>2018-09-17 18:40:21 +0000
committerJessica Paquette <jpaquette@apple.com>2018-09-17 18:40:21 +0000
commitbd72988c3a583840bdc93cc796757a5a0a2e56fc (patch)
tree7411b95088c0cba9e5ca6bd613d3dc4e69b2e52a /llvm/lib/CodeGen/MachineOutliner.cpp
parentd405d2792d3145cf199e09fd9ce95ad09220031a (diff)
downloadllvm-bd72988c3a583840bdc93cc796757a5a0a2e56fc.zip
llvm-bd72988c3a583840bdc93cc796757a5a0a2e56fc.tar.gz
llvm-bd72988c3a583840bdc93cc796757a5a0a2e56fc.tar.bz2
[MachineOutliner][NFC] Don't map more illegal instrs than you have to
We were mapping an instruction every time we saw something we couldn't map before this. Since each illegal mapping is unique, we only have to do this once. This makes it so that we don't map illegal instructions when the previous mapped instruction was illegal. In CTMark (AArch64), this results in 240 fewer instruction mappings on average over 619 files in total. The largest improvement is 12576 fewer mappings in one file, and the smallest is 0. The median improvement is 101 fewer mappings. llvm-svn: 342405
Diffstat (limited to 'llvm/lib/CodeGen/MachineOutliner.cpp')
-rw-r--r--llvm/lib/CodeGen/MachineOutliner.cpp11
1 files changed, 11 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/MachineOutliner.cpp b/llvm/lib/CodeGen/MachineOutliner.cpp
index cc95c49..d1343cb 100644
--- a/llvm/lib/CodeGen/MachineOutliner.cpp
+++ b/llvm/lib/CodeGen/MachineOutliner.cpp
@@ -625,27 +625,38 @@ struct InstructionMapper {
const TargetInstrInfo &TII) {
unsigned Flags = TII.getMachineOutlinerMBBFlags(MBB);
+ // Set to true whenever we map an illegal number.
+ bool AddedIllegalLastTime = false;
for (MachineBasicBlock::iterator It = MBB.begin(), Et = MBB.end(); It != Et;
It++) {
// Keep track of where this instruction is in the module.
switch (TII.getOutliningType(It, Flags)) {
case InstrType::Illegal:
+ // If we added an illegal number last time, then don't add more of them.
+ // One number is all that is necessary to prevent matches on illegal
+ // instructions.
+ if (AddedIllegalLastTime)
+ break;
+ AddedIllegalLastTime = true;
mapToIllegalUnsigned(It);
break;
case InstrType::Legal:
+ AddedIllegalLastTime = false;
mapToLegalUnsigned(It);
break;
case InstrType::LegalTerminator:
mapToLegalUnsigned(It);
InstrList.push_back(It);
+ AddedIllegalLastTime = true;
UnsignedVec.push_back(IllegalInstrNumber);
IllegalInstrNumber--;
break;
case InstrType::Invisible:
+ AddedIllegalLastTime = false;
break;
}
}