diff options
| author | Florian Hahn <florian.hahn@arm.com> | 2017-08-03 14:48:22 +0000 | 
|---|---|---|
| committer | Florian Hahn <florian.hahn@arm.com> | 2017-08-03 14:48:22 +0000 | 
| commit | 3bc3ec661cf750fefc3d093a8165c35a66d2c5fe (patch) | |
| tree | e9695f92f51565ddd57e44f763eed77877dcdfd8 /llvm/utils/TableGen | |
| parent | c1cfe0a82844c35d71f13cf8f09ddd4032dd58cd (diff) | |
| download | bcm5719-llvm-3bc3ec661cf750fefc3d093a8165c35a66d2c5fe.tar.gz bcm5719-llvm-3bc3ec661cf750fefc3d093a8165c35a66d2c5fe.zip | |
[GlobalISel] Only merge memory ops for mayLoad or mayStore instrs.
Summary:
We only need to merge memory operands for instructions that access
 memory. This slightly reduces the number of actions executed. 
Reviewers: MatzeB, rovka, dsanders
Reviewed By: dsanders
Subscribers: aemerson, igorb, kristof.beyls, llvm-commits
Differential Revision: https://reviews.llvm.org/D36151
llvm-svn: 309944
Diffstat (limited to 'llvm/utils/TableGen')
| -rw-r--r-- | llvm/utils/TableGen/GlobalISelEmitter.cpp | 39 | 
1 files changed, 21 insertions, 18 deletions
| diff --git a/llvm/utils/TableGen/GlobalISelEmitter.cpp b/llvm/utils/TableGen/GlobalISelEmitter.cpp index 13303ebc2b1..cac40a764ec 100644 --- a/llvm/utils/TableGen/GlobalISelEmitter.cpp +++ b/llvm/utils/TableGen/GlobalISelEmitter.cpp @@ -1462,24 +1462,27 @@ public:      for (const auto &Renderer : OperandRenderers)        Renderer->emitRenderOpcodes(Table, Rule); -    Table << MatchTable::Opcode("GIR_MergeMemOperands") -          << MatchTable::Comment("InsnID") << MatchTable::IntValue(InsnID) -          << MatchTable::Comment("MergeInsnID's"); -    // Emit the ID's for all the instructions that are matched by this rule. -    // TODO: Limit this to matched instructions that mayLoad/mayStore or have -    //       some other means of having a memoperand. Also limit this to emitted -    //       instructions that expect to have a memoperand too. For example, -    //       (G_SEXT (G_LOAD x)) that results in separate load and sign-extend -    //       instructions shouldn't put the memoperand on the sign-extend since -    //       it has no effect there. -    std::vector<unsigned> MergeInsnIDs; -    for (const auto &IDMatcherPair : Rule.defined_insn_vars()) -      MergeInsnIDs.push_back(IDMatcherPair.second); -    std::sort(MergeInsnIDs.begin(), MergeInsnIDs.end()); -    for (const auto &MergeInsnID : MergeInsnIDs) -      Table << MatchTable::IntValue(MergeInsnID); -    Table << MatchTable::NamedValue("GIU_MergeMemOperands_EndOfList") -          << MatchTable::LineBreak << MatchTable::Opcode("GIR_EraseFromParent") +    if (I->mayLoad || I->mayStore) { +      Table << MatchTable::Opcode("GIR_MergeMemOperands") +            << MatchTable::Comment("InsnID") << MatchTable::IntValue(InsnID) +            << MatchTable::Comment("MergeInsnID's"); +      // Emit the ID's for all the instructions that are matched by this rule. +      // TODO: Limit this to matched instructions that mayLoad/mayStore or have +      //       some other means of having a memoperand. Also limit this to +      //       emitted instructions that expect to have a memoperand too. For +      //       example, (G_SEXT (G_LOAD x)) that results in separate load and +      //       sign-extend instructions shouldn't put the memoperand on the +      //       sign-extend since it has no effect there. +      std::vector<unsigned> MergeInsnIDs; +      for (const auto &IDMatcherPair : Rule.defined_insn_vars()) +        MergeInsnIDs.push_back(IDMatcherPair.second); +      std::sort(MergeInsnIDs.begin(), MergeInsnIDs.end()); +      for (const auto &MergeInsnID : MergeInsnIDs) +        Table << MatchTable::IntValue(MergeInsnID); +      Table << MatchTable::NamedValue("GIU_MergeMemOperands_EndOfList"); +    } + +    Table << MatchTable::Opcode("GIR_EraseFromParent")            << MatchTable::Comment("InsnID")            << MatchTable::IntValue(RecycleInsnID) << MatchTable::LineBreak;    } | 

